[英]2 variables into CUDA kernel
我想使用 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
和
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 中的所有块。 我不知道我糊涂了。 请帮帮我。
顺便说一下,我的 GPU 是 Geforce 610m。
谢谢
如果要对100x100
矩阵执行某些操作,并且希望每个线程处理每个条目,则需要 10000 个线程。 只要对 1 个块中的线程数有限制(通常为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 示例示例。 对于任意网格大小和块大小,您的内核应如下所示:
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
传递到内核中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.