[英]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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.