CUDA:我应该如何处理线程数不能表示为dimGrid*dimBlock的情况?

CUDA:我应该如何处理线程数不能表示为dimGrid*dimBlock的情况?,cuda,Cuda,假设我的输入由七个数据点组成,在这些数据点上执行一些计算,并将结果写回大小为7的输出数组。将块维度声明为4将导致网格大小为2,这将导致尝试运行线程id无效(使用pt_id=blockIdx.x*blockDim.x+threadID.x)为7的内核,并由于内存访问无效而失败(因为我基于线程id访问了一些数组)。 我可以在我的内核中添加代码,专门将线程id与max_thread_id参数进行比较,如果thread_id>max_thread_id,则什么也不做,但我想知道是否有更漂亮的方法来处理不

假设我的输入由七个数据点组成,在这些数据点上执行一些计算,并将结果写回大小为7的输出数组。将块维度声明为4将导致网格大小为2,这将导致尝试运行线程id无效(使用pt_id=blockIdx.x*blockDim.x+threadID.x)为7的内核,并由于内存访问无效而失败(因为我基于线程id访问了一些数组)。
我可以在我的内核中添加代码,专门将线程id与max_thread_id参数进行比较,如果thread_id>max_thread_id,则什么也不做,但我想知道是否有更漂亮的方法来处理不规则的输入数组。

拥有一个大小不是块维度的倍数的任务是非常常见的事情。我最常使用的解决方案是这个。假设您的输入数据大小为
N
,并且您希望将启动配置为块大小等于
block\u size
。在这种情况下,您的启动配置可能如下所示:

kernel_function<<<(N + BLOCK_SIZE - 1) / BLOCK_SIZE, BLOCK_SIZE>>>(...);
int id = blockIdx.x*blockDim.x + threadIdx.x;
if (id < N) { /* do the stuff */ }
else { return; }
kernel_函数(…);
在内核代码中,每个线程决定它是否应该做一些工作,比如:

kernel_function<<<(N + BLOCK_SIZE - 1) / BLOCK_SIZE, BLOCK_SIZE>>>(...);
int id = blockIdx.x*blockDim.x + threadIdx.x;
if (id < N) { /* do the stuff */ }
else { return; }
int-id=blockIdx.x*blockDim.x+threadIdx.x;
如果(id
如果任务的大小(
N
)取决于输入,则必须将此值作为参数传递给内核函数。此外,通常将
N
BLOCK\u SIZE
的值定义为宏或模板参数


最后,如果您的输入数组的大小很小,如您的示例中所示,那么GPU仍然没有得到充分利用,并行性不会给您带来任何好处,甚至会降低算法的性能。

您应该将数组大小传递给内核,比如
N
,然后检查
pt\id prettier是什么意思?普通螺纹检查有什么问题?它非常常用。Jack-我的最大线程id正是您的N。澄清一下-我的问题是关于(dimGrid-1)*dimBlock<需要的线程数