【发布时间】: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 并将其用作我的“共享”内存,但这让我觉得有点脏)
【问题讨论】: