2014-01-20 3 views
0

Я пытаюсь добавить 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 ....

+2

Если вы добавляете подходящий 'cudaGetLastError()' после каждого вызова времени выполнения CUDA, что вы получаете? – Angew

+0

Я не сделал, должен ли я? –

+3

Конечно, вы должны иметь проверку ошибок cuda! – hubs

ответ

2

В вашем случае проблема зависит от используемого графического процессора. Ядро запускается с 1024 потоками на блок. Поскольку ваш gpu обладает вычислительной способностью 1.x поддерживается только 512 или 768 потоков на блок. Подробный список можно найти в официальном programming guide. Поскольку вы не использовали правильную проверку ошибок cuda, вы не смогли получить ошибку, возвращаемую api cuda runtime. Хорошим руководством для проверки ошибок cuda является @talonmies в этом SO answer/question.

Смежные вопросы