簡體   English   中英

在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_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]

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM