我目前正在开发一个项目,涉及对比较,屏蔽和移位等数据的大量位操作。基本上我需要搜索8kbytes之间的比特流 - 长度为32kbytes,用于20到40bytes之间的位模式。
是否有人知道在CUDA中优化此类操作的一般资源?
答案 0 :(得分:1)
关于如何使用CUDA进行文本搜索,至少有几个问题。也就是说,在长字节串中查找短字节串的实例。这与您想要做的类似。也就是说,字节串搜索非常类似于位串搜索,其中字节串中的位数只能是8的倍数,并且算法仅检查每8位的匹配。在SO上搜索CUDA字符串搜索或匹配,看看是否可以找到它们。
我不知道有任何一般资源,但我会尝试这样的事情:
首先准备每个搜索位串的8个版本。每个位串移位不同的位数。还要准备开始和结束面具:
start
01111111
00111111
...
00000001
end
10000000
11000000
...
11111110
然后,基本上,使用不同的位串和掩码执行字节串搜索。
如果您使用的计算能力> = 2.0,则将移位的位串存储在全局内存中。开始和结束掩码可能只是程序中的常量。
然后,对于每个字节位置,启动8个线程,每个线程检查8个移位位串的不同版本与长位串(现在将其视为字节串)。在每个块中,启动足够的线程来检查,例如,32个字节,这样每个块的线程总数变为32 * 8 = 256.L1缓存应该能够保存每个块的移位位串,所以你的表现很好。