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()有两个参数incxincy ,文档说:

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

在NVIDIA论坛上有人说:

iona_me:“incx和incy是在浮标上测量的大步。”

那么这是否意味着对于incx = incy = 1float[]所有元素都是sizeof(float) incx = incy = 2 ,对于incx = incy = 2 ,每个元素之间会有sizeof(float) -padding?

  • 除了这两个参数和cublasHandle - cublasSetVector()其他什么cudaMalloc()不做?
  • 将一个不是用它们各自的cublas*()函数创建的向量/矩阵传递给其他CUBLAS函数来处理它们会保存吗?

  • 在Massimiliano Fatica提供的NVIDIA论坛的主题中,有一条评论证实了我在上述评论中的声明(或者说,更好的说,我的评论起源于回忆我已阅读我链接的帖子)。 尤其是

    cublasSetVectorcubblasGetVectorcublasSetMatrixcublasGetMatrixcudaMemcpycudaMemcpy2D薄包装。 因此,这两套复制功能之间预计不会有显着的性能差异。

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

    关于这些进展,或许在指南中存在错误印记(从CUDA 6.0开始),这说明了这一点

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

    也许应该被解读为

    连续元素之间的间隔存储由下式给出incx用于源矢量xincy为目标向量y

    链接地址: http://www.djcxy.com/p/79677.html

    上一篇: cublasSetVector() vs cudaMemcpy()

    下一篇: ImportError: No Module Named <parent dir>