Cuda中非常简单的教程问题

时间:2014-10-30 19:37:28

标签: c cuda

我正在研究“Cuda by Example”一书中的Cuda C.在第4章,有一个关于如何求和2个向量的非常简单的教程。 我基本上复制了教程:

`#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是告诉设备将操作(包含在Add函数中)拆分为N个块的人;每个块中定义的索引i假设一个值从0到N,因此每个块同时运行一个操作(并行计算)。

问题在于:如果我输入一个随机数(1或2或3或0等)而不是N(例如Add<<<2,1>>>),程序会一直给我所有元素的总和矢量,而它应该停止到第一个或第二个或第三个相应的数字我打字而不是N ...为什么我一直得到相同的结果?元素的数量是否应根据我想要的块数而变化?

希望我能说清楚,如果你不理解,请告诉我

1 个答案:

答案 0 :(得分:0)

您可能希望将dev_c初始化为已知状态,例如全部为零。如果你在某个时刻用N个线程运行你的内核,全局内存仍然可以包含以前的结果,同一个物理区域可以一遍又一遍地分配为dev_c

例如,添加以下行:

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

要尝试的另一件事是将printf添加到内核,并观察输出。