【问题标题】:Slicing string in OpenCL在 OpenCL 中切片字符串
【发布时间】:2012-05-25 22:07:16
【问题描述】:

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

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

我怎样才能做到这一点?

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

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

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

【问题讨论】:

  • needlesData 是要在 haystack 中搜索的单个子字符串吗?您是要查找所有出现的 needlesData、只是第一次出现,还是计算有多少?
  • 您最好先在主机上拆分数据,然后再将其提交给内核。
  • 使用内核滑动数据似乎并不合适。除非您想根据常用方法进行一些欺骗性的重新排序,否则最好在主机端进行处理。

标签: c string kernel opencl gpu


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 使用 constant 内存中的 256 字节查找表优化分隔符测试,将性能提高 100%
猜你喜欢
  • 2020-11-27
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2021-05-01
  • 2014-07-21
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多