cublasSetVector()vs cudaMemcpy()
我想知道是否有区别:
// cumalloc.c - Create a device on the device
HOST float * cudamath_vector(const float * h_vector, const int m)
{
float *d_vector = NULL;
cudaError_t cudaStatus;
cublasStatus_t cublasStatus;
cudaStatus = cudaMalloc(&d_vector, sizeof(float) * m );
if(cudaStatus == cudaErrorMemoryAllocation) {
printf("ERROR: cumalloc.cu, cudamath_vector() : cudaErrorMemoryAllocation");
return NULL;
}
/* THIS: */ cublasSetVector(m, sizeof(*d_vector), h_vector, 1, d_vector, 1);
/* OR THAT: */ cudaMemcpy(d_vector, h_vector, sizeof(float) * m, cudaMemcpyHostToDevice);
return d_vector;
}
cublasSetVector()
有两个参数incx
和incy
,文档说:
连续元素之间的存储空间由源向量x和目标向量y的incx给出。
在NVIDIA论坛上有人说:
iona_me:“incx和incy是在浮标上测量的大步。”
那么这是否意味着对于incx = incy = 1
, float[]
所有元素都是sizeof(float)
incx = incy = 2
,对于incx = incy = 2
,每个元素之间会有sizeof(float)
-padding?
cublasHandle
- cublasSetVector()
其他什么cudaMalloc()
不做? cublas*()
函数创建的向量/矩阵传递给其他CUBLAS函数来处理它们会保存吗? 在Massimiliano Fatica提供的NVIDIA论坛的主题中,有一条评论证实了我在上述评论中的声明(或者说,更好的说,我的评论起源于回忆我已阅读我链接的帖子)。 尤其是
cublasSetVector
, cubblasGetVector
, cublasSetMatrix
, cublasGetMatrix
是cudaMemcpy
和cudaMemcpy2D
薄包装。 因此,这两套复制功能之间预计不会有显着的性能差异。
因此,您可以安全地将由cudaMalloc
创建的任何数组作为输入传递给cublasSetVector
。
关于这些进展,或许在指南中存在错误印记(从CUDA 6.0开始),这说明了这一点
连续元素之间的存储空间由源向量x
和目标向量y
的incx
给出。
但也许应该被解读为
连续元素之间的间隔存储由下式给出incx
用于源矢量x
和incy
为目标向量y
。