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

CUDA中类每线程哈希表的数据结构实现,c,cuda,parallel-processing,C,Cuda,Parallel Processing,我的问题的简短版本: 我有一个CUDA程序,其中每个线程需要将数字存储在不同的“存储箱”中,我用一个整数标识每个存储箱。对于我的程序的典型运行,每个CUDA线程可能只在数百万个存储箱中的100个存储箱中存储数字,因此我想知道是否存在允许我保存这些数据的数据结构而不是数组。每个线程都有自己的该结构副本。如果我用Python编程,我只会使用一个以bin编号为键的字典,例如mydict[0]=1.0,mydict[2327632]=3.0,然后在运行结束时,我会查看键并对它们做一些处理(忽略没有数字存

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

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

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

我的第一个想法是实现一个哈希表,它的关键是线性化的体素索引,值是能量存储的,我只需将哈希表中的每个元素平方,并在粒子传输完成后将其添加到全局不确定性网格中。我试图实现uthash,但它破坏了代码的性能。我猜它导致了大量的线程分歧

我可以简单地使用两个动态数组,其中一个存储体素索引,另一个存储为该体素存储的能量,但我认为这对性能也非常不利。我希望有一种我不知道的数据结构能够很好地用于CUDA程序。我还试图包括许多细节,以防我在解决问题的方法上完全错误


谢谢你

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

已经有了。该链接的工作将包含在2.0版本的中。如果您愿意尝试,它已在中起作用


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

对不起,我添加了一个简短的问题版本。我制作了一个使用本地数组的工作版本,但它使我的程序慢了400%,没有我做的哈希表那么糟糕,但仍然有点不可接受。它必须是本地存储,我会使用一个全局哈希表,就像我在CUDPP中提到的那样(特别是多值哈希表)。但您需要唯一地标识每个线程的数据。也许您可以使用存储的int的高位来标识线程,并将低位用作指针/索引。