2

我有一长串字符,存储在 cl_mem 缓冲区中,我将其提交给我的内核。

我想把这个长字符串分成单独的字符串,我将把它们用作一些匹配处理的搜索模式。

我怎样才能做到这一点?

__kernel void SetHorspoolMatch(
                __global const char *haystack, 
                __global const char *needlesData){}

我想needlesData分成多个不同的“针”。

或者,是否有更好的方法将字符串数组从主机移动到内核并单独使用它们?

4

1 回答 1

1

我已经用CUDA做到了。在 NVidia GTX 560 卡(336 个 CUDA 内核,内存带宽 128G 字节/秒)上处理 4M 文件并拆分为 766K 令牌需要大约 40 毫秒。这没有对使用共享(本地)内存或常量内存进行任何优化。

假设您的字符串由标记字符和非标记字符组成。基本技术并行探测每个字符。

每个线程(工作项)看起来都是 2 个相邻的字符。如果第一个字符是非令牌,第二个字符是令牌。然后你找到了一个令牌的开始。该线程可以向前扫描,直到找到标记的结尾或字符串的结尾。您需要长度为 1 的特殊情况字符串并探测字符串的第一个字符(没有先前的分隔符)。您可以拒绝所有其他组合。

输出是两个数组。第一个是起始位置。第二个数组是长度。写入输出数组由计算数组中下一个可用位置的原子加法控制。该计数器也作为输出参数返回。

95% 的已用时间用于探测令牌。5% 用于主机-GPU 内存传输。

于 2013-08-08T22:29:30.983 回答