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