【发布时间】:2012-07-05 02:56:10
【问题描述】:
我目前正在从事一个项目,该项目涉及对数据进行大量位级操作,例如比较、屏蔽和移位。本质上,我需要在 8kbytes - 32kbytes 长的比特流中搜索 20 - 40bytes 长的比特模式。
有人知道在 CUDA 中优化此类操作的一般资源吗?
【问题讨论】:
标签: optimization cuda bit-manipulation gpu
我目前正在从事一个项目,该项目涉及对数据进行大量位级操作,例如比较、屏蔽和移位。本质上,我需要在 8kbytes - 32kbytes 长的比特流中搜索 20 - 40bytes 长的比特模式。
有人知道在 CUDA 中优化此类操作的一般资源吗?
【问题讨论】:
标签: optimization cuda bit-manipulation gpu
关于如何使用 CUDA 进行文本搜索,至少有几个问题。也就是说,在长字节串中查找短字节串的实例。这与您想要做的类似。也就是说,字节串搜索很像位串搜索,其中字节串中的位数只能是 8 的倍数,并且算法只检查每 8 位是否匹配。在 SO 上搜索 CUDA 字符串搜索或匹配,看看能不能找到。
我不知道这方面的任何一般资源,但我会尝试这样的事情:
首先准备每个搜索位串的 8 个版本。每个位串移动了不同数量的位。还要准备开始和结束掩码:
start
01111111
00111111
...
00000001
end
10000000
11000000
...
11111110
然后,基本上,使用不同的位串和掩码执行字节串搜索。
如果您使用的是计算能力 >= 2.0 的设备,请将移位后的位串存储在全局内存中。开始和结束掩码可能只是程序中的常量。
然后,对于每个字节位置,启动 8 个线程,每个线程检查 8 个移位位串的不同版本与长位串(您现在将其视为字节串)。在每个块中,启动足够的线程来检查,例如,32 个字节,这样每个块的线程总数变为 32 * 8 = 256。L1 缓存应该能够保存每个块的移位位串,所以获得良好的性能。
【讨论】: