2014-10-30 54 views
1

我正在學習Cuda C上的「Cuda by Example」一書。在第4章中有一個關於如何總結2個向量的非常簡單的教程。 我基本上覆制了教程:Cuda的非常簡單的問題,通過示例

`#include <stdio.h> 
#include <stdlib.h> 

#define N 5 

__global__ void Add(int *a, int*b, int *c){ 
int i = blockIdx.x; 
if(i<N){ 
c[i] = a[i] + b[i]; 
} 
} 

int main(){ 
int a[N] = {1,2,3,4,5}, b[N] = {5,6,7,8,9}; 
int c[N]; 
int *dev_a, *dev_b, *dev_c; 


cudaMalloc((void**)&dev_a, N*sizeof(int)); 
cudaMalloc((void**)&dev_b, N*sizeof(int)); 
cudaMalloc((void**)&dev_c, N*sizeof(int)); 


cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice); 

Add<<<2,1>>>(dev_a, dev_b, dev_c); // HERE IS THE CRITICAL LINE !!!!!! 


cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost); 


int i; printf("c[i] = "); 
for(i=0;i<N;i++){ 
    printf("%d ", c[i]); 
} 


cudaFree(dev_a); 
cudaFree(dev_b); 
cudaFree(dev_c); 

printf("\n"); 
return 0; 
}` 

所以根據書,在該行Add<<<N,1>>>參數N是一個誰告訴設備分裂操作(在添加功能包含)成N塊;在每個塊中定義的索引i都假定從0到N的值,以便每個塊同時運行一個操作(並行計算)。如果我輸入一個隨機數(1或2或3或0等)而不是N(例如Add<<<2,1>>>),程序會不斷給我所有矢量元素的總和它應該停止到第一或第二或第三相應的數字我輸入,而不是N ...爲什麼我總是得到相同的結果?元素的數量應該根據我希望的塊數量而變化?

希望我自己清楚,如果你不明白,讓我知道

回答

0

您可能需要初始化​​到已知狀態,例如全部爲零。如果您在某個時刻使用N個線程運行了內核,則全局內存仍可以包含先前的結果,並且可以一次又一次地將相同的物理區域分配爲​​。

例如,添加下列行:

... 
int c[N] = {0,0,0,0,0}; 
... 
cudaMemcpy(dev_c, c, N*sizeof(int), cudaMemcpyHostToDevice); 
... 

一件事是嘗試添加printf到內核,並觀察輸出。

+0

mmm ...你的提示沒有解決問題...我明白我應該初始化矢量的事實,但第二行不正確,因爲它是正確的我的方式肯定...無論如何,問題仍然存在 – 2014-10-30 20:33:26

+0

我的意思是,將c [N]初始化爲零,並且在你的兩個'cudaMemcpy'初始化設備全局內存中的'dev_c'後,將'c'的'cudaMemcpy'添加到'dev_c'。還嘗試使用'printf'來更新答案。 – 2014-10-30 20:43:27

+0

你是對的! cudaMemcpyHostToDevice欺騙了我!非常感謝!!!我爲這個哈哈浪費了3個小時 – 2014-10-30 20:49:53