在 CUDA 设备中获取原始矩阵索引
Get original matrix indices within a CUDA device
我正在将 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_SIZE
、MATRIX_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];
关于索引,正确定义了 tx
变量,为您提供 A
中的原始列索引,并且正确定义了 ty
变量,为您提供原始行对于上面定义的 my_A_element
个变量,索引到 A
。
因此A
的原始元素(对应my_A_element
)就是A[ty][tx]
我正在将 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_SIZE
、MATRIX_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];
关于索引,正确定义了 tx
变量,为您提供 A
中的原始列索引,并且正确定义了 ty
变量,为您提供原始行对于上面定义的 my_A_element
个变量,索引到 A
。
因此A
的原始元素(对应my_A_element
)就是A[ty][tx]