CUDA雅可比放松

时间:2011-12-12 14:41:00

标签: cuda gpu

我正在将此顺序计算映射到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维度中使用循环分布。有人可以帮助我实现一个在CUDA中具有适当索引功能的Jacobi_GPU,从而产生以下分布吗?

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

2 个答案:

答案 0 :(得分:0)

forThis是简单的实现。您可以对此内核函数使用共享内存优化

__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)]);
  }
}

答案 1 :(得分:0)

或者,如果你想使用“数组数组”而不是数组:

__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]);
  }
}