【发布时间】:2014-11-04 13:01:33
【问题描述】:
我正在尝试在启动需要这些值的内核之前在我的 GPU 的常量内存上设置常量值。
我的代码(简化):
__constant__ size_t con_N;
int main()
{
size_t N;
size_t* dev_N = NULL;
cudaError_t cudaStatus;
//[...]
cudaStatus = cudaGetSymbolAddress((void **)&dev_N, &con_N);
if (cudaStatus != cudaSuccess) {
cout<<"cudaGetSymbolAddress (dev_N) failed: "<<cudaGetErrorString(cudaStatus)<<endl;
}
我打算之后cudaMemcpy我的N到dev_N。
但是,此时我在代码中得到的只是:
cudaGetSymbolAddress (dev_N) failed: invalid device symbol
我正在使用 CUDA 6.5,所以这不是引用符号问题,因为它是我迄今为止检查的大部分问答中的问题。
我尝试用con_N[1] 替换con_N(并在cudaGetSymbolAddress 参数中删除con_N 之前的&):结果相同。
由于这个函数的原型是cudaGetSymbolAddress(void **devPtr , const void* symbol ),我猜它想得到我的符号地址。但是,我尝试使用 cudaStatus = cudaGetSymbolAddress((void **)&dev_N, (const void*) con_N); 并收到相同的消息。
当我删除 cudaGetSymbolAddress((void **)&dev_N, &con_N) 并直接使用 cudaMemcpyToSymbol(&con_N, &N, sizeof(size_t)) 时,我也会收到相同的错误消息。
恐怕我错过了一些重要的事情。任何帮助将不胜感激。
【问题讨论】: