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

Mar*_*arc 5 c parallel-processing cuda

我的问题的简短版本:我有一个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程序.我还尝试包含许多细节,以防我在处理问题时完全出错.

谢谢

har*_*ism 2

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

已经实现了 CUDA 哈希表。该链接的工作将包含在CUDPP 库的 2.0 版本中。它已经在CUDPP 的 SVN 主干中运行,如果你想尝试一下。

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