2012-04-19 178 views
0

我有一个产生结果值数组的内核,我想高效地找到这些值的最大值。该数组在内核开始时被初始化为一些负值(例如-1)。例如,内核使用5个块,每块256个线程执行。CUDA在共享内存中找到最大值

这里有问题:

  1. 因为我的数据,我必须终止线程,无效的,所以我有256个线程,有时50,20等,有时工作。

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

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

在这些类型的数组上并行压缩会很复杂,不是吗?这个怎么做 ?

+0

完成,sry我很新:) – Hlavson 2012-04-19 12:27:29

+0

你是什么意思与'终止'线程?为该线程做一个“返回”?因为不推荐 – pQB 2012-04-19 14:03:52

+0

您是否考虑过使用其中一个免费库来查找最大值(例如ArrayFire)? – arrayfire 2012-04-19 14:53:13

回答

2

关于您的算法没有足够的信息。

你是什么意思的n结果? 数组中被忽略的值是否设置为-1或者您使用动态外部共享内存,并且线程只写入索引n(听起来很难实现)?

  • 使用一个固定大小的共享内存和一组忽略值-1,仍执行并行减少,如果搜索最大正和它充满了-1没关系,或

  • 唐“T终止线程,而不是设置一个标志,在另一个数组,如果线程不应该执行进一步的计算,仍然做平行减少

+0

我解决了它与并行减少,与我的数据和索引-1,其中不是以前的计算数据,它的工作原理:-) – Hlavson 2012-04-20 16:11:31

0

您可以您的内核中做的减少(如djmj说的),或者你可以使用推力结合函数和减少(例如tr ansform_reduce)。 CUDA工具包中包含Thrust,有关transform_reduce的示例,请参见this page