2011-12-12 68 views
2

我正在將此順序計算映射到CUDA計算。該計算是N×N網格上的二維雅可比鬆弛,其中N是未知的。 N可以被32整除。CUDA雅可比放鬆

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

是公式是否正確? 'b [i + 1] [j] + b [i + 1] [j] + b [i] [j + 1] + b [i] [j + 1] [j]的+ 2 * b [i] [j + 1]'。正確? – Yappie

+0

是的,那些會是一樣的。 – Thorax

回答

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[j*N+i] = 0.8* (2*b[(i+1)+j*N] + 2*b[i+N*(j+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]); 
    } 
}