Я новичок в CUDA, который успешно скомпилировал и запустил несколько примеров кода с использованием библиотек CUDA, таких как CUFFT и CUBLAS.Однако в последнее время я пытался сгенерировать свои собственные простые ядра и неоднократно получал бессмысленные значения обратно после вызова моих ядер.То есть - когда я передаю параметр в ядро, устанавливаю его значение в ядре, затем пытаюсь скопировать результаты обратно на хост и прочитать значения позже, они являются поддельными.Я пробовал много разных простых учебных руководств, которые, кажется, работают для большинства людей онлайн, но я всегда получаю бессмысленные значения.Например ...
#define SIZE 10
// Kernel definition, see also section 4.2.3 of Nvidia Cuda Programming Guide
__global__ void vecAdd(float* A, float* B, float* C) {
// threadIdx.x is a built-in variable provided by CUDA at runtime
int i = threadIdx.x;
A[i]=0;
B[i]=i;
C[i] = A[i] + B[i];
}
int main {
int N=SIZE;
float A[SIZE], B[SIZE], C[SIZE];
float *devPtrA;
float *devPtrB;
float *devPtrC;
int memsize= SIZE * sizeof(float);
cudaMalloc((void**)&devPtrA, memsize);
cudaMalloc((void**)&devPtrB, memsize);
cudaMalloc((void**)&devPtrC, memsize);
cudaMemcpy(devPtrA, A, memsize, cudaMemcpyHostToDevice);
cudaMemcpy(devPtrB, B, memsize, cudaMemcpyHostToDevice);
// __global__ functions are called: Func<<< Dg, Db, Ns >>>(parameter);
vecAdd<<<1, N>>>(devPtrA, devPtrB, devPtrC);
cudaMemcpy(C, devPtrC, memsize, cudaMemcpyDeviceToHost);
for (int i=0; i<SIZE; i++)
printf("C[%d]=%f\n",i,C[i]);
cudaFree(devPtrA);
cudaFree(devPtrA);
cudaFree(devPtrA);
}
Это довольно простая проблема;результаты должны быть:
C[0]=0.000000
C[1]=1.000000
C[2]=2.000000
C[3]=3.000000
C[4]=4.000000
C[5]=5.000000
C[6]=6.000000
C[7]=7.000000
C[8]=8.000000
C[9]=9.000000
Тем не менее, мои удивительные результаты всегда случайны и обычно выглядят так:
C[0]=nan
C[1]=-32813464158208.000000
C[2]=nan
C[3]=-27667211200843743232.000000
C[4]=34559834084263395806523272811251761152.000000
C[5]=9214363188332593152.000000
C[6]=nan
C[7]=-10371202300694685655937271382147072.000000
C[8]=121653576586393934243511643668480.000000
C[9]=-30648783863808.000000
Так что, в основном, когда я передаю параметры в ядро CUDAнамерение хранить результаты внутри них для копирования обратно на хост, я склонен выбрасывать мусор.
Этот действительно меня озадачил.Любая помощь будет принята с благодарностью.
Спасибо.