0

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

以下是问题:

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

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

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

在这些类型的数组上并行归约会很复杂,不是吗?这该怎么做 ?

4

2 回答 2

2

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

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

  • 使用固定大小的共享内存并将忽略的值设置为 -1 并仍然执行并行缩减,如果您搜索正最大值并将其填充为 -1 没关系,或者

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

于 2012-04-19T12:33:45.620 回答
0

您可以在内核中进行归约(如 djmj 所说),也可以使用推力来组合仿函数和归约(例如 transform_reduce)。Thrust 包含在 CUDA 工具包中,请参阅此页面以获取 transform_reduce 的示例。

于 2012-04-19T15:57:50.983 回答