CUDA在共享内存中找到最大值

时间:2012-04-19 12:09:55

标签: arrays search cuda max shared

我有一个生成结果值数组的内核,我希望有效地找到这些值的最大值。 Array在内核的开头初始化,带有一些负值(例如-1)。例如,内核使用5个块执行,每个块有256个线程。

以下是问题:

  1. 由于我的数据,我必须终止无效的线程,因此我有时使用256个线程,有时50个,20个等等。

  2. 在共享内存中是从块写入的结果,但正如我所提到的,一些数组有50个结果,有些有256个结果...(所以共享数组看起来像这样)8,6,4,9,1 ,-1,-1,-1 ...

  3. 在这种情况下如何在一个区块中有效地找到最大值?

  4. 这些类型的阵列并行缩减会很复杂,不是吗?怎么做?

2 个答案:

答案 0 :(得分:2)

关于您的算法的信息不足。

n结果是什么意思? 数组中的忽略值是设置为-1还是使用动态外部共享内存而线程只写入索引n(声音很难实现)?

  • 使用固定大小的共享内存并将忽略值设置为-1并仍执行并行缩减,如果搜索正最大值且填充-1则无关紧要,或者

  • 如果线程不应执行进一步的计算并仍然进行并行缩减,请不要终止线程,而是在另一个数组中设置一个标志

答案 1 :(得分:0)

您可以在内核中进行缩减(如djmj所说),也可以使用推力来组合仿函数和缩减(例如transform_reduce)。 CUDA工具包中包含了Thrust,有关transform_reduce的示例,请参阅this page