2016-04-25 51 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传递到你的内核。