Jestem nowy w CUDA C i próbuję przekazać strukturę jądra do jądra. Moja metoda działała bez zarzutu, gdy próbowałem ją ze strukturą zawierającą tylko ints, ale kiedy przełączam się na zmiennoprzecinkowe, otrzymuję bez znaczenia liczby jako wyniki. Zakładam, że ma to związek z wyrównaniem i próbowałem dołączyć __align__
wraz z deklaracją mojego typu, ale bezskutecznie. Czy ktoś może mi podać przykład tego, jak to się robi, lub podać alternatywne podejście? Próbuję skonfigurować go tak, aby można było łatwo dodawać lub usuwać pola bez zmiany niczego poza strukturą i jądrem. Mój kod:Przekazywanie struktur do jądra CUDA
typedef struct __align__(8)
{
float a, b;
} point;
__global__ void testKernel(point *p)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
p[i].a = 1.1;
p[i].b = 2.2;
}
int main(void)
{
// set number of points
int numPoints = 16,
gpuBlockSize = 4,
pointSize = sizeof(point),
numBytes = numPoints * pointSize,
gpuGridSize = numPoints/gpuBlockSize;
// allocate memory
point *cpuPointArray = new point[numPoints],
*gpuPointArray = new point[numPoints];
cpuPointArray = (point*)malloc(numBytes);
cudaMalloc((void**)&gpuPointArray, numBytes);
// launch kernel
testKernel<<<gpuGridSize,gpuBlockSize>>>(gpuPointArray);
// retrieve the results
cudaMemcpy(cpuPointArray, gpuPointArray, numBytes, cudaMemcpyDeviceToHost);
printf("testKernel results:\n");
for(int i = 0; i < numPoints; ++i)
{
printf("point.a: %d, point.b: %d\n",cpuPointArray[i].a,cpuPointArray[i].b);
}
// deallocate memory
free(cpuPointArray);
cudaFree(gpuPointArray);
return 0;
}
punkt * gpuPointArray = new ... wydaje mi się nie tak? Przydzielasz na hoście, a potem robi cudaMalloc na urządzeniu ... – Bart
Czy nie muszę przydzielać pamięci przed przekazaniem jej jako argumentu do jądra? Pozostawienie linii cudaMalloc daje "nieokreśloną awarię uruchamiania". Mogłabym również ustawić wartość parametru gpuPointArray na NULL, ale nie zmienia to oryginalnego wyniku. – Paul
Absolutnie. Potrzebujesz cudaMalloc. Nie potrzebujesz jednak "nowego". To samo dotyczy cpuPointArray. Użyj malloc i free (programujesz C) i nie używaj nowego tutaj. (Nigdy nie mieszaj nowych usunięć malloc i darmowych) – Bart