cublasSetVector()vs cudaMemcpy()

时间:2014-06-09 13:15:58

标签: cuda cublas

我想知道:

之间是否存在差异
// 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()有两个参数incxincy以及documentation says

  

连续元素之间的存储间距由incx给出   源向量x和目标向量y。

NVIDIA forum有人说:

  

iona_me:“ incx and incy是以浮标计算的步幅。

这是否意味着对于incx = incy = 1float[]的所有元素都将sizeof(float) - 对齐,而incx = incy = 2则会有sizeof(float) - 填充每个元素之间?

  • 除了这两个参数和cublasHandle - cublasSetVector() cudaMalloc()之外的其他内容是什么?
  • 将使用各自的cublas*()函数创建的的向量/矩阵传递给其他CUBLAS函数来操作它们是否可以保存?

1 个答案:

答案 0 :(得分:4)

Massimiliano Fatica提供的thread of the NVIDIA Forum中有一条评论证实了我在上述评论中的陈述(或者,说得更好,我的评论源于回忆起我读过的帖子)。特别是

  

cublasSetVectorcubblasGetVectorcublasSetMatrixcublasGetMatrixcudaMemcpycudaMemcpy2D周围的薄包装。因此,两组复制功能之间不会出现明显的性能差异。

因此,您可以安全地将cudaMalloc创建的任何数组作为输入传递给cublasSetVector

关于这些进步,或许指南中有一个错误指纹(截至CUDA 6.0),其中说

  

连续元素之间的存储间距由incx给出   向量x和目标向量y

或许应该被理解为

  

连续元素之间的存储间距由incx给出   目标向量x的向量incyy