【问题标题】:CUDA shared memory of other blocks其他块的CUDA共享内存
【发布时间】:2014-05-07 11:39:45
【问题描述】:

我在不同的 cuda 块中有本地排序的队列。假设有 m 个块。现在我有一些问题。

1) 我只需要从 m 个块中选择 k 个块,这些块的队列头是 m 个元素中的最小 k 个元素。

2) 在一个块中,我需要将其他块的队列加载到共享内存中。这个可以吗?

谁能告诉我这两个操作怎么做?

【问题讨论】:

    标签: cuda


    【解决方案1】:
    1. 如果你想在线程块之间进行通信(即交换数据),唯一的方法就是使用全局内存。

      至少,您需要某种可以访问每个队列头部的选择过程。我认为这几乎意味着您将在全局内存中放置每个队列的头部。由于您没有指明“本地排序”数据所在的位置,这可能表明至少复制了这么多数据(例如,如果它们是本地排序的并驻留在共享内存中)。

    2. 如果单个块需要加载所有个队列,那么所有队列都需要由它们各自的块放置在全局内存中。

    您的两个问题都暗示某种全球同步。您想在收集所有队列之前对其进行排序。在 CUDA 中,除了内核启动之外,没有定义的全局同步机制。但是,根据您在此处描述的内容,您的算法可能适用于类似于threadfence reduction sample 中概述的方法。每个线程块将完成它需要的工作(例如对队列进行排序),然后单个线程块将执行清理任务,例如收集队列并在单个线程块中处理。我不确定这是否适合您的整体处理。如果没有,我的建议是首先将您的工作分解为单独的内核,并使用内核启动作为同步点。

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2012-09-21
      • 2021-08-12
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多