【问题标题】:How do I pass a shared pointer to a cublas function?如何将共享指针传递给 cublas 函数?
【发布时间】:2015-10-12 18:57:43
【问题描述】:

我正在尝试通过以下方式从内核中运行 cublas 函数:

__device__ void doLinear(const float *W,const float *input, unsigned i, float *out, unsigned o) {
    unsigned idx = blockIdx.x*blockDim.x+threadIdx.x;

    const float alpha = 1.0f;
    const float beta = 0.0f;

    if(idx == 0) {
        cublasHandle_t cnpHandle;
        cublasStatus_t status = cublasCreate(&cnpHandle);
        cublasSgemv(cnpHandle, CUBLAS_OP_N, o, i, &alpha, W, 1, input, 1, &beta, out, 1);
    }
    __syncthreads();
}

如果 input 指针是使用 cudaMalloc 分配的,则此函数可以很好地工作。

我的问题是,如果 input 指针实际上指向一些共享内存,其中包含从内核中生成的数据,我会收到错误消息: CUDA_EXCEPTION_14 - Warp Illegal address.

是否不能将指向共享内存的指针传递给从内核调用的 cublas 函数?

在这里分配内存的正确方法是什么? (目前我只是在做另一个 cudaMalloc 并将其用作我的“共享”内存,但这让我觉得有点脏)

【问题讨论】:

    标签: cuda cublas


    【解决方案1】:

    您不能将共享内存传递给 CUBLAS 设备 API 例程,因为它violates the CUDA dynamic parallelism memory model 是 CUBLAS 所基于的设备端。您可以做的最好的事情是使用malloc()new 在运行时堆上分配线程本地内存以供CUBLAS 例程使用,或者分配一个先验 分配的缓冲区的一部分主机端 API(正如您目前所做的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2014-02-20
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多