C++ CUDA内核中的2个变量

C++ CUDA内核中的2个变量,c++,matrix,indexing,cuda,C++,Matrix,Indexing,Cuda,我想用CUDA内核解一个矩阵。 矩阵使用像这样的i和j索引 M[i*N+j] 如果我想将元素从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 ker

我想用CUDA内核解一个矩阵。 矩阵使用像这样的i和j索引

M[i*N+j]
如果我想将元素从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

我一直在考虑使用

__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中的所有块。我不知道,我很困惑。 请帮帮我

顺便说一下,我的gpu是Geforce 610m


谢谢

如果要使用
100x100
矩阵执行某些操作,并且希望每个线程处理每个条目,则需要10000个线程。只要对一个块中的线程数有限制(通常是
1024
32x32
),就需要增加网格大小:

 dim3 grid = dim3(10, 10, 1);
 dim3 block = dim3(10, 10, 1);
现在,您只需在内核中创建
i
j

 i=blockIdx.x * blockDim.x + threadIdx.x;
 j=blockIdx.y * blockDim.y + threadIdx.y;
 M[i*N+j]=...
根据我们的网格和块大小,您的
blockDim.x=blockDim.y=10
blockIdx.x、blockIdx.y、threadIdx.x、threadIdx.y
范围从
0
9
,因此您的
i
j
范围从
0
99

一般来说,我通常遵循cuda示例。对于任意的gridsize和blocksize,您的内核应该如下所示:

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]=...
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
传递到内核中

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]=...