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

How do I pass a shared pointer to a cublas function?

我正尝试通过以下方式从内核中 运行 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 并将其用作我的 'shared' 内存,但这让我觉得有点脏)

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