有没有人在CUDA设备上实现哈希映射的经验?具体来说,我想知道如何在设备上分配内存并将结果复制回主机,或者是否有任何有用的库可以促进这个任务。
似乎我需要事先知道哈希映射的最大大小才能分配设备内存。我以前所有的CUDA尝试都使用数组和memcpys,因此相对直接。
欢迎提供有关此问题的任何见解。谢谢。
有没有人在CUDA设备上实现哈希映射的经验?具体来说,我想知道如何在设备上分配内存并将结果复制回主机,或者是否有任何有用的库可以促进这个任务。
似乎我需要事先知道哈希映射的最大大小才能分配设备内存。我以前所有的CUDA尝试都使用数组和memcpys,因此相对直接。
欢迎提供有关此问题的任何见解。谢谢。
《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),这有助于你的实现。我还没有测试这些功能。
cuCollections(cuco)是一个开源的、仅包含头文件的GPU加速并发数据结构库。
类似于Thrust和CUB提供STL样式的GPU加速算法和原语,cuCollections提供了STL样式的并发数据结构。cuCollections不是STL数据结构(如std::unordered_map)的一对一替换。而是提供针对与GPU的高效使用而调整的功能类似的数据结构。
cuCollections仍在积极开发中。用户应该预计会经常出现破坏性变化和重构。
目前它提供了一个固定大小的哈希表cuco::static_map
和一个可以增长的哈希表cuco::dynamic_map
。
顺便提一下,warpcore
是一个框架,用于在 CUDA 加速器上创建高吞吐量、专用的哈希数据结构。在现代 CUDA 加速器上以光速进行哈希运算。你可以在这里找到它: