线程索引作为 CUDA 中的内存位置索引



根据定义,线程是进程内的执行路径。 但是在内核的实现过程中,会生成一个thread_id或global_index来访问分配的内存位置。例如,在下面的矩阵乘法代码中,生成ROWCOL以访问矩阵 A 和 B 顺序。 我的疑问是,生成的索引不指向线程(根据定义(,而是用于访问内存中数据的位置,那么为什么我们将其称为线程索引或全局线程索引,为什么不是内存索引或其他东西?

__global__ void matrixMultiplicationKernel(float* A, float* B, float* C, int N) {
int ROW = blockIdx.y*blockDim.y+threadIdx.y;
int COL = blockIdx.x*blockDim.x+threadIdx.x;
float tmpSum = 0;
if (ROW < N && COL < N) {
// each thread computes one element of the block sub-matrix
for (int i = 0; i < N; i++) {
tmpSum += A[ROW * N + i] * B[i * N + COL];
}
}
C[ROW * N + COL] = tmpSum;
}

这个问题似乎主要是关于语义的,所以让我们从维基百科开始

....执行线程是编程的最小序列 可以由调度程序独立管理的指令....

这几乎准确地描述了 CUDA 中的 s 线程是什么——内核是指令序列,调度程序是 GPU 上每个流多处理器中的 warp/线程调度器。

您问题中的代码正在计算内核启动中线程的唯一 ID,因为它在 CUDA 编程/执行模型中被抽象出来。它与内存布局没有内在关系,只与内核启动中的唯一 ID 有内在关系。它用于确保在不同的内存位置上执行每个并行操作的事实是编程技术,仅此而已。

对我来说,Thread ID似乎是一个合乎逻辑的绰号,但当迈尔斯·戴维斯(Miles Davis(被问及他的乐队刚刚在1970年怀特岛音乐节上演奏的果酱的名字时,他用一句话来说:"随便你怎么称呼它"。

最新更新