C++ CUDA内核中的2个变量
我想用CUDA内核解一个矩阵。 矩阵使用像这样的i和j索引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
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]=...