【发布时间】:2014-03-17 07:20:09
【问题描述】:
假设我的输入包含 7 个数据点,在这些数据点上执行了一些计算,并将结果写回大小为 7 的输出数组。将块维度声明为 4 会导致网格大小为 2,这会导致尝试使用无效的线程 id(使用 pt_id=blockIdx.x*blockDim.x+threadID.x)为 7 运行内核,并且由于无效的内存访问而失败(因为我根据线程 id 访问了一些数组) . 我可以在我的内核中添加代码,专门将线程 id 与 max_thread_id 参数进行比较,如果 thread_id>max_thread_id 则不执行任何操作,但我想知道是否有更漂亮的方法来处理不规则的输入数组。
【问题讨论】:
-
你应该将数组大小传递给内核,比如
N,并检查是否pt_id<N。我不确定你想用max_thread_id实现什么。我认为您的帖子标题不合适。线程总数始终可以表示为dimGrid*dimBlock。这让我觉得您在数组大小和网格大小之间产生了一些混淆。 -
更漂亮是什么意思?普通的线程检查有什么问题?它使用得相当普遍。
-
杰克 - 我的 max_thread_id 正是你的 N。澄清一下 - 我的问题是关于 (dimGrid-1)*dimBlock
-
您可能会发现这篇文章很有帮助:CUDA Pro Tip: Write Flexible Kernels with Grid-Stride Loops
标签: cuda