【发布时间】:2017-05-28 02:32:13
【问题描述】:
我正在学习 CUDA 编程,但我无法理解这个元素加法内核中的跨步:
// performs vector addition
// a, b, c are vectors and added values are stored in a and b, while the results are stored in c.
#define N 10
__global__ void add(int* a, int* b, int* c) {
int tid = threadIdx.x + blockIdx.x*blockDim.x;
while(tid < N) {
c[tid] = a[tid] + b[tid];
tid += blockDim.x * gridDim.x;
}
}
这是它的 CPU 版本:
void add(int* a, int* b, int* c) {
int tid = 0; // start from CPU 0
while(tid < N) {
c[tid] = a[tid] + b[tid];
tid += 2; // assume there are 2 CPUs
}
}
我浏览了几个教程,所有教程都是从这个add 内核开始的。
不明白tid的步幅从何而来?
编辑
现在我有点明白步幅的值是什么意思了。我认为这意味着如果我有 2 个 CPU,当两个正在运行的线程之一完成时,我必须将 tid 添加 2,因为 tid + 1 由另一个内核处理。
但是问题来了,CPU1 中的tid 与CPU2 中的tid 有区别吗?我认为它们不可能是同一个变量,并且这些值存储在 CPU 的不同内存中?
【问题讨论】:
-
您的编辑都是关于 CPU 的,但您的标志是
cuda和gpgpu... 您从哪里获得 CPU 版本?您是否读过有关如何在 CPU 上并行化代码的文章?如果您粘贴教程中的代码,请添加指向教程的链接。你看过programming guide of Nvidia吗?它非常紧凑,但 imo 易于理解,并且不是从大步开始而是使用更简单的add内核。