获取 CUDA 设备中的原始矩阵索引

Get original matrix indices within a CUDA device

本文关键字:原始 索引 CUDA 获取      更新时间:2023-10-16

我正在将2D square matrix的矢量化表示传递给CUDA设备。我在网上找到了如何在CUDA设备上用这种格式的两个矩阵执行矩阵乘法。

但是,我现在需要在设备之前获取矩阵的原始索引。

这是我传递给我的cuda_kernel的代码

#define MATRIX_SIZE 20
#define BLOCK_SIZE 2
#define TILE_SIZE  2
void cuda_stuff(int sz, double **A)
{
  double* A1d = matrix_to_vector(sz, A);
  double* d_A
  size_t sizeA = sz * sz * sizeof(double);
  cudaMalloc(&d_A, sizeA);
  cudaMemcpy(d_A, A1d, sizeA, cudaMemcpyHostToDevice);
  dim3 threads(BLOCK_SIZE, BLOCK_SIZE);
  dim3 grid(MATRIX_SIZE / threads.x, MATRIX_SIZE / threads.y);
  cudakernel<<<grid, threads>>>(sz, d_A);
}

这是我的cudakernel

__global__ void cudakernel(int sz, double* A_d);
{
  int tx = blockIdx.x * TILE_SIZE + threadIdx.x;
  int ty = blockIdx.y * TILE_SIZE + threadIdx.y;
  /* Need to get original i, j from my matrix double* A */
}

如何获取矩阵double* A的原始索引 [i][j] ?

只有当MATRIX_SIZE可以被BLOCK_SIZE整除时,您的代码才能正常工作(并且BLOCK_SIZE必须与TILE_SIZE相同)。 这段代码似乎被设置为只处理方形矩阵,所以我假设你的原始A矩阵的大小(MATRIX_SIZEMATRIX_SIZE)。

鉴于该限制条件,以下内容应检索与给定线程对应的原始元素 A:

double my_A_element  = A_d[ty*MATRIX_SIZE+tx];

如果您愿意,(再次,给定上述限制条件)您可以使用内置变量:

double my_A_element  = A_d[ty*(blockDim.x*gridDim.x)+tx];

或者,等效地:

double my_A_element  = A_d[ty*sz+tx];

关于索引,对于上述定义的my_A_element变量,正确定义tx变量以将原始列索引转换为A,正确定义ty变量以将原始行索引转换为A

因此A的原始元素(对应于my_A_element)只是A[ty][tx]