CUDA - 实现设备哈希表?

13

有没有人在CUDA设备上实现哈希映射的经验?具体来说,我想知道如何在设备上分配内存并将结果复制回主机,或者是否有任何有用的库可以促进这个任务。

似乎我需要事先知道哈希映射的最大大小才能分配设备内存。我以前所有的CUDA尝试都使用数组和memcpys,因此相对直接。

欢迎提供有关此问题的任何见解。谢谢。

5个回答

13

《CUDA编程指南》一书中介绍了一个GPU哈希表的实现,作者是Jason Sanders和Edward Kandrot。

幸运的是,你可以在这个页面上免费获取这本书的信息以及下载示例源代码:
http://developer.nvidia.com/object/cuda-by-example.html

在这个实现中,表被预先分配在CPU上,并通过基于原子函数atomicCAS(比较并交换)的锁函数保证了安全的多线程访问。

此外,较新的硬件(2.0以上)结合CUDA >= 4.0被认为能够直接在GPU上使用new/delete运算符(http://developer.nvidia.com/object/cuda_4_0_RC_downloads.html?utm_source=http://forums.nvidia.com&utm_medium=http://forums.nvidia.com&utm_term=Developers&utm_content=Developers&utm_campaign=CUDA4),这有助于你的实现。我还没有测试这些功能。


4
cuCollections是一个相对较新的开源库,由NVIDIA工程师发起,旨在在GPU上实现高效的容器。

cuCollections(cuco)是一个开源的、仅包含头文件的GPU加速并发数据结构库。

类似于Thrust和CUB提供STL样式的GPU加速算法和原语,cuCollections提供了STL样式的并发数据结构。cuCollections不是STL数据结构(如std::unordered_map)的一对一替换。而是提供针对与GPU的高效使用而调整的功能类似的数据结构。

cuCollections仍在积极开发中。用户应该预计会经常出现破坏性变化和重构。

目前它提供了一个固定大小的哈希表cuco::static_map和一个可以增长的哈希表cuco::dynamic_map


1
我记得有人在thrust上开发了一个简单的哈希映射实现。这里有一些相关代码here,虽然我不知道它是否适用于当前的thrust版本。但至少它可能会给你一些想法。

更新:由于Google代码平台即将关闭,您可以在此GitHub存储库中找到:https://github.com/djebm2/cuda-thrust-extensions/tree/master/hash%20map - user1197918
1
那个链接也已经失效了。我找到了这个链接:https://github.com/deckar01/cuda-thrust-extensions - paleonix

1
据我所知,《Cuda by Example》中提供的哈希表性能不太好。目前,我认为CUDA上最快的哈希表是在Dan Alcantara的博士论文中给出的。请参阅第6章。

1
很遗憾,您的链接无法使用。 - Mojtaba Valizadeh

1

顺便提一下,warpcore 是一个框架,用于在 CUDA 加速器上创建高吞吐量、专用的哈希数据结构。在现代 CUDA 加速器上以光速进行哈希运算。你可以在这里找到它:

https://github.com/sleeepyjack/warpcore


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