由于结构的CUDAMEMCPITOSYMBOL而导致的cudaInvalidSymbol

由于结构的CUDAMEMCPITOSYMBOL而导致的cudaInvalidSymbol,cuda,Cuda,以下是使用Cuda编译工具(6.5版,6.5.12版)编译的在同步和检查(“cudaMemcpyToSymbol”)时抛出cudaInvalidSymbol的最小示例: #include<stdio.h> __inline __host__ void gpuAssert(cudaError_t code, const char* command, const char *file, int line, bool abort=true) {

以下是使用Cuda编译工具(6.5版,6.5.12版)编译的在
同步和检查(“cudaMemcpyToSymbol”)时抛出
cudaInvalidSymbol
的最小示例:

#include<stdio.h>

__inline __host__ void gpuAssert(cudaError_t code, const char* command, const char *file, int line, 
                 bool abort=true)
{
   if (code != cudaSuccess) 
   {
      fprintf(stderr,"Error while calling %s in %s line %d: %s\n", command,
          file, line, cudaGetErrorString(code));
      if (abort) exit(code);
   }
}

#define sync_and_check(command) { gpuAssert(cudaGetLastError(), command, __FILE__, __LINE__); }

struct S
{
    float one;
};

__device__ __constant__ S d_s;

__global__ void kernel(float* f)
{
    (*f) = d_s.one;
}

int main()
{
    cudaGetLastError();

    S s;
    s.one = 1.f;
    cudaMemcpyToSymbol(&d_s, &s, sizeof(S));
    sync_and_check("cudaMemcpyToSymbol");

    float* d_f;
    cudaMalloc(&d_f, sizeof(float));
    sync_and_check("cudaMalloc");

    dim3 dimGrid(1), dimBlock(32);
    kernel<<<dimGrid, dimBlock>>>(d_f);
    sync_and_check("kernel");

    cudaFree(d_f);
    sync_and_check("cudaFree");
}
#包括
__内联\uuuu主机\uuuuuu无效gpuAssert(cudaError\u t代码,常量字符*命令,常量字符*文件,int行,
bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(stderr,“在%s行%d:%s中调用%s时出错”,命令,
文件、行、cudaGetErrorString(代码));
如果(中止)退出(代码);
}
}
#定义sync_和_check(command){gpuAssert(cudaGetLastError(),command,uu文件,u行uu)}
结构
{
浮一;
};
__装置常数d;
__全局无效内核(浮点*f)
{
(*f)=d_.one;
}
int main()
{
cudaGetLastError();
S S;
s、 一=1.f;
cudaMemcpyToSymbol(&d_s,&s,sizeof(s));
同步和检查(“CUDAMEMCPITOSYMBOL”);
浮动*d_f;
Cudamaloc(和d_f,sizeof(浮动));
同步和检查(“cudamaloc”);
dim3 dimGrid(1)、dimBlock(32);
内核(d_f);
同步和检查(“内核”);
库达弗里(d_f);
同步和检查(“cudaFree”);
}

问题在于引用。正确的调用是

cudaMemcpyToSymbol(d_s, &s, sizeof(S));
我很困惑,因为手册上说

cudaError_t cudaMemcpyToSymbol (const void * symbol, const void * src,
   size_t count, size_t offset = 0, enum cudaMemcpyKind kind =
   cudaMemcpyHostToDevice)
   Copies count bytes from the memory area pointed to by src to the memory
   area pointed to by offset bytes from the start of symbol symbol. The
   memory areas may not overlap. symbol is a variable that resides in
   global or constant memory space. kind can be either
   cudaMemcpyHostToDevice or cudaMemcpyDeviceToDevice.

   Parameters:
       symbol - Device symbol address
无论“symbol”是什么意思:复制到struct元素

    cudaMemcpyToSymbol(d_s.one, &(s.one), sizeof(S));

同样有效。

如果符号不是结构,是否有效?如果没有,请在这里尝试代码snipet,看看是否有效。。。