如何将共享指针传递给cublas函数?

时间:2015-07-22 18:15:55

标签: cuda cublas

我正试图通过以下方式在内核中运行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();
}

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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