获取 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];
关于索引,对于上述定义的my_A_element
变量,正确定义tx
变量以将原始列索引转换为A
,正确定义ty
变量以将原始行索引转换为A
。
因此A
的原始元素(对应于my_A_element
)只是A[ty][tx]
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 如何在保留原始索引的同时对向量的向量进行排序
- 如何在跟踪原始索引的同时压缩向量(具有重复项)
- std::排序比较器,可以看到元素的(原始)索引
- 获取 CUDA 设备中的原始矩阵索引
- 正在将指针从数组值存储到原始数组索引位置
- 对二维矢量进行排序,保持对原始索引的跟踪
- 对n维点进行排序,并跟踪原始索引
- 原始数组期望整数作为索引
- 对数据结构进行排序并保存原始索引的记录
- 在保留原始索引的同时对值进行更快的排序