我正在将此顺序计算映射到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)
答案 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]);
}
}