【发布时间】:2020-09-29 17:25:34
【问题描述】:
根据定义,线程是进程中的一条执行路径。
但是在内核的实现过程中,会生成一个 thread_id 或 global_index 来访问分配的内存位置。例如,在下面的矩阵乘法代码中,生成ROW 和COL 以依次访问矩阵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;
}
【问题讨论】:
-
“根据定义,线程是进程内的执行路径”——这是一个很奇怪的定义。
标签: memory cuda gpu matrix-multiplication