2016-04-25 32 views
2

我想用CUDA內核來解決矩陣問題。 矩陣使用這樣的i和j索引。2變量到CUDA內核中

M[i*N+j] 

Asuming,我想從M個元素複製到像M_temp任何其他變量,我應該這樣做

M_temp[i*N+j] = M[i*N+j]; 

嗯,我有使用塊和線程

dim3 grid = dim3(2, 1, 1); 
dim3 block = dim3(10, 10, 1); 
接下來的聲明

我不知道自己是否有錯,但根據之前的聲明,每塊可以有100個線程。共200線程。

在內核中我想使用索引。

__global__ void kernel(double *M) 
{ 
    int i = ???; 
    int j = ???; 

} 

我想用每塊至少100個線程,使得最大體尺寸爲:

M[100x100] 

但我想用

1 block for variable i 

1 different block for variable j. 

我一直在想回合使用,

__global__ void kernel(double *M) 
{ 
    int i = threadIdx.x + blockDim.x * blockIdx.x; 
    int j = threadIdx.y + blockDim.x * blockIdx.x; 

    __syncthreads(); 
    M_temp[i*N+j] = M[i*N+j];   
} 

但這種方式使用x中的所有塊。我不知道我很困惑。 請幫助我。

順便說一下,我的CPU是Geforce 610m。

謝謝

回答

1

如果你想與你的100x100矩陣執行某些操作,並希望每個線程來處理每個條目,則需要10000個線程。只要有1塊(通常1024,或32x32)上的線程數的限制,則需要增加網格尺寸:

dim3 grid = dim3(10, 10, 1); 
dim3 block = dim3(10, 10, 1); 

現在你的內核裏,你只需創建ij

i=blockIdx.x * blockDim.x + threadIdx.x; 
j=blockIdx.y * blockDim.y + threadIdx.y; 
M[i*N+j]=... 

隨着我國電網和塊大小,你blockDim.x=blockDim.y=10blockIdx.x, blockIdx.y, threadIdx.x, threadIdx.y範圍09,讓您的ij範圍099

一般來說,我通常遵循cuda示例。對於任意gridsize和塊大小,你的內核應該是這樣的:

const int numThreadsx = blockDim.x * gridDim.x; 
const int threadIDx = blockIdx.x * blockDim.x + threadIdx.x; 

const int numThreadsy = blockDim.y * gridDim.y; 
const int threadIDy = blockIdx.y * blockDim.y + threadIdx.y; 


for (int i = threadIDx; i < N; i += numThreadsx) 
    for (int j = threadIDy; j < N; j += numThreadsy) 
     M[i*N+j]=... 

注意,你需要可變N傳遞到你的內核。