【发布时间】:2016-01-12 17:02:54
【问题描述】:
我试图理解 hello world CUDA 示例中的一个简单添加。 我有两个数组:
char a[N] = "Hello \0\0\0\0\0\0";
int b[N] = {15, 10, 6, 0, -11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
网格和块的维度是 1 和 16。 当您执行此操作时,我真的不明白:
a[threadIdx.x] += b[threadIdx.x];
你会得到“Hello World!”。 这是 CUDA 中的经典介绍性示例,并行性背后的逻辑很容易理解,但是这个总和......我真的不明白。 获取完整源代码
#include <stdio.h>
const int N = 16;
const int blocksize = 16;
__global__
void hello(char *a, int *b)
{
a[threadIdx.x] += b[threadIdx.x];
}
int main()
{
char a[N] = "Hello \0\0\0\0\0\0";
int b[N] = {15, 10, 6, 0, -11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char *ad;
int *bd;
const int csize = N*sizeof(char);
const int isize = N*sizeof(int);
printf("%s", a);
cudaMalloc( (void**)&ad, csize );
cudaMalloc( (void**)&bd, isize );
cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );
cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice );
dim3 dimBlock( blocksize, 1 );
dim3 dimGrid( 1, 1 );
hello<<<dimGrid, dimBlock>>>(ad, bd);
cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost );
cudaFree( ad );
cudaFree( bd );
printf("%s\n", a);
sleep(1);
return EXIT_SUCCESS;
}
【问题讨论】:
-
我已经添加了完整的代码。不鼓励链接到代码,因为链接往往会中断,一旦发生这种情况,问题(和答案)对很多人来说就毫无用处了
-
你是对的。谢谢。
-
只是好奇,但在标准 C 中,您可以省略两个数组(
a和b)末尾的0和'\0'值,因为 a 的其余元素默认情况下,堆栈数组将初始化为 0。看起来该示例有意手动初始化所有索引。这是因为 CUDA C 完全符合标准,还是只是为了明确两个数组的大小相等或其他原因 -
我不确定,因为 NVIDIA C 编译器然后将代码拆分为使用常规 c 编译器编译的主机代码(CPU)和使用 NVIDIA 汇编器等的设备代码。但是由于这段代码将要使用 c 标准编译器,我想说这只是为了说清楚。对不起,如果我不能更好地帮助你。
标签: c cuda parallel-processing