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

问题描述 投票:0回答:1

根据定义,线程是一个进程内的执行路径。但是在内核的实现过程中,会产生一个线程_id或全局_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;
}
multithreading memory cuda gpu matrix-multiplication
1个回答
3
投票

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

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

这几乎就是描述了CUDA中的线程--内核是指令序列,调度器是GPU上每个流式多处理器中的warpthread调度器。

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

在我看来,线程ID似乎是一个合乎逻辑的绰号,但套用Miles Davis的一句话,当有人问他1970年他的乐队在Isle of Wight音乐节上刚演奏的果酱叫什么名字时。"随便你怎么叫" "call it whatever you want".

© www.soinside.com 2019 - 2024. All rights reserved.