1
Вот минимальный пример, который бросает cudaInvalidSymbol
на sync_and_check("cudaMemcpyToSymbol")
, составленное с использованием Cuda инструменты компиляции, выпуск 6.5, V6.5.12:cudaInvalidSymbol из-за cudaMemcpyToSymbol на структуру
#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");
}
Это работает, если символ не является структурой? Если нет, попробуйте код snipet здесь и посмотрите, работает ли это ... http://stackoverflow.com/questions/15984913/cudamemcpytosymbol-vs-cudamemcpy-why-is-it-still-around-cudamemcpytosymbol –