【发布时间】:2014-05-07 11:39:45
【问题描述】:
我在不同的 cuda 块中有本地排序的队列。假设有 m 个块。现在我有一些问题。
1) 我只需要从 m 个块中选择 k 个块,这些块的队列头是 m 个元素中的最小 k 个元素。
2) 在一个块中,我需要将其他块的队列加载到共享内存中。这个可以吗?
谁能告诉我这两个操作怎么做?
【问题讨论】:
标签: cuda
我在不同的 cuda 块中有本地排序的队列。假设有 m 个块。现在我有一些问题。
1) 我只需要从 m 个块中选择 k 个块,这些块的队列头是 m 个元素中的最小 k 个元素。
2) 在一个块中,我需要将其他块的队列加载到共享内存中。这个可以吗?
谁能告诉我这两个操作怎么做?
【问题讨论】:
标签: cuda
如果你想在线程块之间进行通信(即交换数据),唯一的方法就是使用全局内存。
至少,您需要某种可以访问每个队列头部的选择过程。我认为这几乎意味着您将在全局内存中放置每个队列的头部。由于您没有指明“本地排序”数据所在的位置,这可能表明至少复制了这么多数据(例如,如果它们是本地排序的并驻留在共享内存中)。
如果单个块需要加载所有个队列,那么所有队列都需要由它们各自的块放置在全局内存中。
您的两个问题都暗示某种全球同步。您想在收集所有队列之前对其进行排序。在 CUDA 中,除了内核启动之外,没有定义的全局同步机制。但是,根据您在此处描述的内容,您的算法可能适用于类似于threadfence reduction sample 中概述的方法。每个线程块将完成它需要的工作(例如对队列进行排序),然后单个线程块将执行清理任务,例如收集队列并在单个线程块中处理。我不确定这是否适合您的整体处理。如果没有,我的建议是首先将您的工作分解为单独的内核,并使用内核启动作为同步点。
【讨论】: