CUDA Якобиан Релаксация - PullRequest
       31

CUDA Якобиан Релаксация

2 голосов
/ 12 декабря 2011

Я нахожусь в процессе преобразования этого последовательного вычисления в вычисление CUDA. Это вычисление представляет собой двумерную релаксацию Якоби на сетке NxN, где N неизвестно. N равномерно делится на 32.

Jacobi(float *a,float *b,int N){
   for (i=1; i<N+1; i++){
      for (j=1; j<N+1; j++) {
         a[i][j]=0.8*(b[i+1][j]+b[i+1][j]+b[i][j+1]+b[i][j+1]);
      }
   }
}

Я распараллеливаю внешние два цикла, и каждый поток должен вычислять только один элемент. Цель состоит в том, чтобы распараллелить его, чтобы использовать циклическое распределение в измерениях x и y. Может ли кто-нибудь помочь мне в реализации Jacobi_GPU, который имеет соответствующие функции индексации в CUDA, что приводит к следующему распределению?

dim3 dimGrid(N/32,N/32);
dim3 dimBlock(32,32);
Jacobi_GPU<<<dimGrid,dimBlock>>>(A,B,N)

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Или, если вы хотите использовать «массивы массивов», а не массивы:

__global__ void Jacobi(int** a, const int** b,const int N)
{
  int i = blockIdx.x * blockDim.x + threadIdx.x;
  int j = blockIdx.y * blockDim.y + threadIdx.y;
  if (i<N && j<N)
  {
    a[i][j]=0.8*(b[i+1][j]+b[i+1][j]+b[i][j+1]+b[i][j+1]);
  }
}
0 голосов
/ 12 декабря 2011

для Это простая реализация.Вы можете использовать оптимизацию общей памяти для этой функции ядра

__global__ void jacobi(int* a, const int* b,const int N)
{
  int i= blockIdx.x * blockDim.x + threadIdx.x;
  int j = blockIdx.y * blockDim.y + threadIdx.y;
  if (i<N && j<N)
  {
    a[j*N+i] = 0.8* (2*b[(i+1)+j*N] + 2*b[i+N*(j+1)]);
  }
}
...