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

5
简短版问题: 我有一个CUDA程序,每个线程需要将数字存储在不同的“bin”中,并通过整数标识每个bin。对于我的程序的典型运行,每个CUDA线程可能只会在数百万个bin中的100个中存储数字,因此我想知道是否有一种数据结构(除了数组)可以容纳此数据。每个线程都将拥有其自己的此结构副本。如果我使用Python编程,我会使用字典,其中bin号是键,例如mydict [0] = 1.0,mydict [2327632] = 3.0,然后在运行结束时,我会查看键并对它们进行某些操作(忽略未存储数字的bin,因为它们不在字典中)。我尝试为我的cuda程序中的每个线程实现哈希表,但它会降低性能。
长版问题: 我有一个CUDA Monte Carlo模拟,用于模拟粒子通过体素化(简单体积元素)几何体的传输。粒子在传输过程中沉积能量,这种能量以体素为单位计算。体素表示为线性化的3D网格,非常大,约为180 ^ 3个元素。每个CUDA线程传输1-100个粒子,我通常尝试最大化内核中生成的线程数。(目前,我使用384 * 512个线程)。给定体素中沉积的能量通过atomicAdd添加到全局内存中的线性化3D网格中。
我在模拟中遇到了一些计算不确定性的问题。对于给定的粒子,我必须跟踪它在哪里(哪些体素索引)沉积能量,以及每个体素的多少能量,以便在粒子传输结束之前将此数字平方。由于我分配给每个线程一个(或几个)粒子,因此必须在每个线程范围内存储此信息。我之所以只在不确定性计算中遇到此问题,是因为能量沉积可以作为每次线程必须沉积能量时对全局变量的原子操作完成,但是不确定性计算必须在粒子传输结束后完成,因此我必须以某种方式让每个线程跟踪其分配的粒子的“历史记录”。
我的第一个想法是实现哈希表,其键将是线性化体素索引,值将是沉积的能量,并且我将在粒子传输完成后将该哈希表中的每个元素平方并添加到全局不确定性网格中。我尝试实现uthash,但它破坏了我的代码性能。我猜它会导致大量的线程分歧。
我可以简单地使用两个动态数组,其中一个存储体素索引,另一个存储该体素沉积的能量,但我认为这也会对性能产生很大影响。我希望有一种数据结构可以很好地用于CUDA程序中。我还尝试了包括许多详细信息,以防我在解决问题时完全错误。
谢谢
1个回答

2
您的问题有点术语化。如果您能提取出科学内容,只留下计算机科学方面的内容,您可能会得到更多的答案。
已经有实现了CUDA哈希表。该链接中的工作将包含在CUDPP库的2.0版本中。如果您想尝试,它已经在CUDPP SVN主干中运行。
话虽如此,如果您真的只需要每个线程的存储空间,而不是共享存储空间,那么您可能可以做一些更简单的事情,比如一些每个线程的临时空间(在共享或全局内存中)或一个本地数组。

抱歉使用了专业术语,我添加了一个更短、更简洁的问题描述。我用本地数组制作了一个可工作的版本,但它使我的程序减慢了400%,虽然不像我之前使用哈希表时那么糟糕,但仍有点不可接受。这确实必须使用本地存储。 - Marc
我会使用一个全局哈希表,就像我在 CUDPP 中提到的那个(特别是多值哈希表)。但你需要唯一地标识每个线程的数据。也许你可以使用存储的整数的高位来标识线程,并使用低位作为指针/索引。 - harrism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接