2013-04-06 65 views
1

有,顯示2D陣列的樣品:創建CUDA C節目指南文檔中的2D陣列具有CUDA

// Kernel definition 
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) 
{ 
int i = blockIdx.x * blockDim.x + threadIdx.x; 
int j = blockIdx.y * blockDim.y + threadIdx.y; 
if (i < N && j < N) 
C[i][j] = A[i][j] + B[i][j]; 
} 

int main() 
{ 
... 
// Kernel invocation 
dim3 threadsPerBlock(16, 16); 
dim3 numBlocks(N/threadsPerBlock.x, N/threadsPerBlock.y); 
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C); 
... 
} 

我使用2D陣列具有以下形式和正常工作:

dim3 grid[COLUMNS][ROWS]; 
kernel_Matrix<<<grid,1>>>(dev_strA, dev_strB, dev_Matrix); 

__global__ void add(int *a, int *b, int *c) 
{ 
int x = blockIdx.x; 
int y = blockIdx.y; 
int i = (COLUMNS*y) + x; 
c[i] = a[i] + b[i]; 
} 

有是一種用[] []定義實現二維數組的方法嗎?我測試了這種方式,但不起作用。

+0

也許我誤會問你的問題。你想做什麼?將2D數組傳遞給你的核心函數還是定義2D網格? – stuhlo 2013-04-06 19:54:47

+0

@stuhlo:我想將2d數組傳遞給內核,並使用[] []定義在__global__ void函數中訪問它。 – mahdimb 2013-04-06 20:11:00

+1

您需要修正stuhlo指出的dim3網格定義。那麼你可能想看看[這個問題](http://stackoverflow.com/questions/15799086/cuda-how-to-copy-a-3d-array-from-host-to-device)的一些想法。通常扁二維數組最簡單,但如果你有一個固定大小的數組,你可以在我對這個問題的回答中給出的第一個例子中使用這種方法。 – 2013-04-06 20:35:57

回答

7

dim3不是數組,而是在CUDA頭文件(vector_types.h)中定義的結構。該結構用於在全局函數的執行配置中指定GRID的尺寸,即在<<< >>>中。它不保留「真正」的塊,它只是配置一些將被執行的塊。

的只有兩種方式(據我所知)來初始化這個結構是:

2. dim3 grid = {x, y, z};

編輯:dim3初始化 主機代碼,並通過陣列內核功能的方式,你將能夠通過訪問其元素[][]

float A[N][N]; 
float B[N][N]; 
float C[N][N]; 

float (*d_A)[N]; //pointers to arrays of dimension N 
float (*d_B)[N]; 
float (*d_C)[N]; 

for(int i = 0; i < N; i++) { 
    for(int j = 0; j < N; j++) { 
     A[i][j] = i; 
     B[i][j] = j; 
    } 
}  

//allocation 
cudaMalloc((void**)&d_A, (N*N)*sizeof(float)); 
cudaMalloc((void**)&d_B, (N*N)*sizeof(float)); 
cudaMalloc((void**)&d_C, (N*N)*sizeof(float)); 

//copying from host to device 
cudaMemcpy(d_A, A, (N*N)*sizeof(float), cudaMemcpyHostToDevice); 
cudaMemcpy(d_B, B, (N*N)*sizeof(float), cudaMemcpyHostToDevice); 
cudaMemcpy(d_C, C, (N*N)*sizeof(float), cudaMemcpyHostToDevice); 

// Kernel invocation 
dim3 threadsPerBlock(16, 16); 
dim3 numBlocks(N/threadsPerBlock.x, N/threadsPerBlock.y); 
MatAdd<<<numBlocks, threadsPerBlock>>>(d_A, d_B, d_C); 

//copying from device to host 
cudaMemcpy(A, (d_A), (N*N)*sizeof(float), cudaMemcpyDeviceToHost); 
cudaMemcpy(B, (d_B), (N*N)*sizeof(float), cudaMemcpyDeviceToHost); 
cudaMemcpy(C, (d_C), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);