gpt4 book ai didi

c - Cuda by Example 中非常简单的教程的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:56 24 4
gpt4 key购买 nike

我正在学习“Cuda 实例”一书中的 Cuda C。第 4 章有一个非常简单的教程,介绍如何对 2 个 vector 求和。我基本上复制了教程:

`#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 个 block 的人;索引i每个 block 中定义的值假定一个从 0 到 N 的值,以便每个 block 同时运行一个操作(并行计算)。

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

希望我说清楚了,如果你不明白,请告诉我

最佳答案

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

例如,添加以下行:

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

还可以尝试将 printf 添加到内核,并观察输出。

关于c - Cuda by Example 中非常简单的教程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26661842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com