1

我正在想办法使用 CUDA 实现以下算法:

处理大量体素,我为每个体素计算一个 indexi和一个 value c。计算后我需要执行histogram[i] += c
c的是一个浮点值,直方图最多可以有 15,000 个 bin。

我正在寻找一种使用 CUDA 有效实现这一点的方法。第一个明显的问题是,对于我正在使用的计算能力 1.3,我什至不能做一个atomicAdd()浮点数,所以我怎样才能可靠地积累任何东西?

nVidia 的这个例子做了一些更简单的事情。直方图保存在共享内存中(由于它的大小,我不能这样做)并且它只累积整数。这种方法可以推广到我的情况吗?

4

2 回答 2

1

两步法可能是最好的。您可以为体素子集创建多个直方图,并将它们全部加起来以形成全局直方图

假设您有 N 个体素,首先创建大小为 M x 15000 的全局设备内存(其中 M < N 但大到足以让所有内核保持忙碌)

运行一个 cuda 内核来计算每个线程索引的 N/M 个体素的直方图。完成所有线程后,您现在可以运行另一个 cuda 内核,将 M 直方图求和以作为最终直方图。

于 2010-06-04T00:49:38.463 回答
0

使用 atomicAdd() 将直方图直接写入外部存储器将非常低效。根据直方图的范围,您可能需要考虑多次通过源数据,更新共享内存中的部分直方图,然后在每次通过后写出部分直方图。只要您不必对输入数据进行大量传递,这应该会更有效率。显然,您会希望尽可能大的部分直方图,受可用共享内存的限制,以尽量减少所需的通过次数。

于 2010-05-31T16:38:31.287 回答