CUDA中的每线程哈希表式数据结构实现

时间:2011-07-24 19:53:27

标签: c cuda parallel-processing

我的问题的简短版本: 我有一个CUDA程序,每个线程需要将数字存储在不同的“bin”中,我用整数标识每个bin。对于我的程序的典型运行,每个CUDA线程可能只在100个数百个容器中存储数字,所以我想知道是否有一个数据结构而不是数组允许我保存这些数据。每个线程都有自己的结构副本。如果我用Python编程,我会使用一个字典,其中bin编号是键,例如mydict [0] = 1.0,mydict [2327632] = 3.0,然后在运行结束时我会看到键和他们做的事情(并忽略没有数字存储在其中的箱子,因为他们不在字典中)。我尝试为我的cuda程序中的每个线程实现一个哈希表,这会破坏性能。

长版: 我有一个CUDA蒙特卡罗模拟,它模拟粒子通过体素(简单体积元素)几何体的传输。颗粒在运输过程中沉积能量,并且这种能量以体素/体素为基础计算。体素被表示为线性化的3D网格,其非常大,大约180 ^ 3个元素。每个CUDA线程传输1-100个粒子,我通常会尝试最大化我生成内核的线程数。 (目前,我使用384 * 512线程)。沉积在给定体素中的能量被添加到线性化的3d网格中,该网格通过atomicAdd驻留在全局存储器中。

我在模拟的一部分中遇到了一些问题,这些问题涉及计算模拟中的不确定性。对于给定的粒子,我必须跟踪它在哪里(哪个体素指数)沉积能量,以及给定体素的能量,以便我可以在粒子传输结束时将这个数字平方,然后再转向新的粒子。由于我为每个线程分配了一个(或几个)粒子,因此必须将该信息存储在每个线程范围内。我只在不确定性计算中遇到这个问题的原因是,每次线程必须存储能量时,能量沉积只能作为全局变量的原子操作来完成,但是必须在粒子传输结束时进行不确定性计算。 ,所以我必须以某种方式让每个线程跟踪其指定粒子的“历史”。

我的第一个想法是实现一个哈希表,其键是线性化的体素索引,值将是能量沉积,我只是将该哈希表中的每个元素都对齐并将其添加到粒子后的全局不确定性网格中已完成运输。我试图实现uthash但它破坏了我的代码的性能。我猜它引起了大量的线程分歧。

我可以简单地使用两个动态数组,其中一个存储体素索引,另一个存储为该体素存储的能量,但我认为它对于性能也会非常糟糕。我希望有一个我不知道的数据结构,它可以很好地用于CUDA程序。我还尝试包含许多细节,以防我在处理问题时完全出错。

谢谢

1 个答案:

答案 0 :(得分:1)

你的问题有点粗暴。如果你能提炼出科学并只留下计算机科学,你可能会得到更多的答案。

CUDA hash tables implemented。该链接的工作将包含在CUDPP library的2.0版本中。如果您想尝试,它已经在SVN trunk of CUDPP中工作。

也就是说,如果你真的只需要每线程存储而不需要共享存储,你可以做一些更简单的事情,比如一些每线程暂存空间(在共享或全局内存中)或本地数组。