我想知道:
之间是否存在差异// 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
以及documentation says:
连续元素之间的存储间距由incx给出 源向量x和目标向量y。
在NVIDIA forum有人说:
iona_me:“ incx and incy是以浮标计算的步幅。”
这是否意味着对于incx = incy = 1
,float[]
的所有元素都将sizeof(float)
- 对齐,而incx = incy = 2
则会有sizeof(float)
- 填充每个元素之间?
cublasHandle
- cublasSetVector()
cudaMalloc()
之外的其他内容是什么? cublas*()
函数创建的不的向量/矩阵传递给其他CUBLAS函数来操作它们是否可以保存? 答案 0 :(得分:4)
Massimiliano Fatica提供的thread of the NVIDIA Forum中有一条评论证实了我在上述评论中的陈述(或者,说得更好,我的评论源于回忆起我读过的帖子)。特别是
cublasSetVector
,cubblasGetVector
,cublasSetMatrix
,cublasGetMatrix
是cudaMemcpy
和cudaMemcpy2D
周围的薄包装。因此,两组复制功能之间不会出现明显的性能差异。
因此,您可以安全地将cudaMalloc
创建的任何数组作为输入传递给cublasSetVector
。
关于这些进步,或许指南中有一个错误指纹(截至CUDA 6.0),其中说
连续元素之间的存储间距由
incx
给出 向量x
和目标向量y
。
但或许应该被理解为
连续元素之间的存储间距由
incx
给出 目标向量x
的向量incy
和y
。