我正试图通过以下方式在内核中运行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并将其用作我的'共享'内存,但它让我觉得有点脏)
答案 0 :(得分:2)
您无法将共享内存传递给CUBLAS设备API例程,因为它是设备端CUBLAS所基于的violates the CUDA dynamic parallelism memory model。您可以做的最好的事情是使用malloc()
或new
在运行时堆上为CUBLAS例程分配线程本地内存,或者先验分配的缓冲区的一部分分配了一个主机端API(正如您目前所做的那样)。