Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDAMEMCPITOSYMBOL是否使用字符串_C++_C_Cuda - Fatal编程技术网

C++ CUDAMEMCPITOSYMBOL是否使用字符串

C++ CUDAMEMCPITOSYMBOL是否使用字符串,c++,c,cuda,C++,C,Cuda,我试图通过以下方式将结构复制到常量内存: struct Foo { int a, b, c; }; __constant__ Foo cData; int main() { Foo hData = {1, 2, 3}; cudaMemcpyToSymbol(cData, &hData, sizeof(Foo)); // ... } 这很好,在我的内核中,我可以直接访问常量数据: __global__ void kernel() { print

我试图通过以下方式将结构复制到常量内存:

struct Foo {
    int a, b, c;
};

__constant__ Foo cData;

int main() {
    Foo hData = {1, 2, 3};
    cudaMemcpyToSymbol(cData, &hData, sizeof(Foo));
    // ...
}
这很好,在我的内核中,我可以直接访问常量数据:

__global__ void kernel() {
    printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3
}
但后来我尝试使用
const char*
作为符号名,结果一切都停止了:

cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0
我认为这两个版本是相似的,但似乎我错了

发生了什么事

编辑: 我想用cudaGetSymbolAddress报告同样的行为,如果不使用
const char*
,它对我有效:

__constant__ int someData[10];
__constant__ int *ptrToData;

int *dataPosition;
cudaGetSymbolAddress((void **)&dataPosition, someData); // Works
// cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work
cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *));

从CUDA 5开始,不再支持使用字符串作为符号名。CUDA 5发行说明中介绍了这一点

•不再支持使用字符串表示设备符号,这在某些API函数中是可能的。相反,应直接使用符号


其中一个原因与启用真正的设备链接器有关,这是CUDA 5中的新功能。

由于一次又一次地出现相同的错误,我想与大家分享这个示例代码,它显示了几乎所有有关此问题的示例案例(因此,当我再次犯相同的错误时,我可能会在稍后的文章中引用)

//文件:main.cu
#包括
#包括
#包括
__常量_uuuu浮点常量数据[256];
__设备浮点数数据;
__设备u uuu浮点*数据点;
int main(int argc,字符**argv)
{
cudaFree(0);
浮点数据[256];
cudaError_t err=cudaMemcpyToSymbol(constData,data,sizeof(data));
printf(“错误id:%d,str:%s\n”,Err,cudaGetErrorString(Err));
浮动值=3.14f;
err=cudaMemcpyToSymbol(devData,&value,sizeof(float));
printf(“错误id:%d,str:%s\n”,Err,cudaGetErrorString(Err));
浮动*ptr;
Cudamaloc(和ptr,256*sizeof(浮动));
err=cudaMemcpyToSymbol(devPointer,&ptr,sizeof(ptr));
printf(“错误id:%d,str:%s\n”,Err,cudaGetErrorString(Err));
cudaFree(ptr);
返回退出成功;
}

我得到了“无效设备符号”和许多其他与\u常量\u设备内存使用有关的信息。这段代码在运行时不会出现这样的错误。

ooh,我错过了!谢谢!:)
//file: main.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>

__constant__ float constData[256];
__device__ float devData;
__device__ float* devPointer;

int main(int argc, char **argv)
{
  cudaFree(0);

  float data[256];
  cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  float value = 3.14f;
  err = cudaMemcpyToSymbol(devData, &value, sizeof(float));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  float* ptr;
  cudaMalloc(&ptr, 256 * sizeof(float));
  err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));
  cudaFree(ptr);

  return EXIT_SUCCESS;
}