我想知道两者之间是否有区别:
// 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:在NVIDIA forum中有人说:
那么这是否意味着对于
incx = incy = 1
,float[]
的所有元素都将被sizeof(float)
对齐,而对于incx = incy = 2
,每个元素之间将存在一个sizeof(float)
-padding?cublasHandle
以外-cublasSetVector()
是否还有其他cudaMalloc()
不起作用的功能? cublas*()
函数创建的而不是的矢量/矩阵传递给其他CUBLAS函数来进行操作? 最佳答案
Massimiliano Fatica提供的thread of the NVIDIA Forum中有一条评论,确认了我在上述评论中的发言(或者,更好的是,我的评论源于回想起我所链接的帖子)。特别是
因此,您可以安全地将cudaMalloc
创建的任何数组作为输入传递给cublasSetVector
。
关于跨步,指南(从CUDA 6.0版本开始)可能印有错误,其中指出:
但也许应该读为