Я пытаюсь добавить 2 массива, используя CUDA, но это не сработало.Почему AddVector CUDA C++ не работает?
Я сделал все, что должно быть сделано:
1) Я распараллеливание функции VectorAdd
2) Я распределенная память в ОГПУ и перемещал данные в GPU
3) И Последнее, что я изменил функцию VectorAdd для запуска на GPU
Это код:
#define SIZE 1024
__global__ void VectorAdd(int *a, int *b, int *c, int n)
{
int i = threadIdx.x ;
if(i < n)
c[i] = a[i] + b[i];
}
int main()
{
int *a , *b , *c;
int *d_a , *d_b , *d_c;
a = (int *)malloc(SIZE * sizeof(int));
b = (int *)malloc(SIZE * sizeof(int));
c = (int *)malloc(SIZE * sizeof(int));
cudaMalloc(&d_a , SIZE * sizeof(int));
cudaMalloc(&d_b , SIZE * sizeof(int));
cudaMalloc(&d_c , SIZE * sizeof(int));
for (int i = 0 ; i < SIZE ; ++i)
{
a[i] = i ;
b[i] = i ;
c[i] = 0 ;
}
cudaMemcpy(d_a, a, SIZE *sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, SIZE *sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_c, c, SIZE *sizeof(int), cudaMemcpyHostToDevice);
VectorAdd<<< 1, SIZE >>>(d_a, d_b, d_c, SIZE);
cudaMemcpy(c, d_c, SIZE * sizeof(int), cudaMemcpyDeviceToHost);
for(int i = 0 ; i < 10 ; ++i)
{
printf("C[%d] = %d\n", i, c[i]);
}
free(a);
free(b);
free(c);
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
return 0;
}
Выход на консоли заключается в следующем: c[0] = 0 , c[1] = 0 , c[2] = 0 , c[3] = 0 , c[4] = 0 ....
Почему это должно быть: c[0] = 0 ; c[1] = 2 ; c[2] = 4 ....
Если вы добавляете подходящий 'cudaGetLastError()' после каждого вызова времени выполнения CUDA, что вы получаете? – Angew
Я не сделал, должен ли я? –
Конечно, вы должны иметь проверку ошибок cuda! – hubs