我有一长串字符,存储在cl_mem缓冲区中,我提交给我的内核。
我想将这个长字符串分成单独的字符串,我将把它作为搜索模式用于某些匹配处理。
我怎样才能实现这一目标?
__kernel void SetHorspoolMatch(
__global const char *haystack,
__global const char *needlesData){}
我想将needlesData
划分为多个不同的“针头”。
或者,是否有更好的方法将字符串数组从主机移动到内核并单独使用它们?
答案 0 :(得分:1)
我这样做是用CUDA做的。要处理4M文件并分成766K令牌,NVidia GTX 560卡需要大约40ms(336个CUDA核心,内存带宽为128G Bytes / s)。这没有使用共享(本地)内存或常量内存的任何优化。
假设您的字符串包含令牌字符和非令牌字符。基本技术并行探测每个字符。
每个线程(工作项)看起来是2个相邻的字符。如果第一个char是非令牌而第二个char是令牌。然后你找到了一个令牌的开头。该线程可以向前扫描,直到找到令牌的结尾或字符串的结尾。您需要长度为1的特殊字符串字符串并探测字符串的第一个字符(没有先前的分隔符)。您可以拒绝所有其他组合。
输出是两个数组。首先是起始位置。第二个数组是长度。 写入输出数组由原子添加控制,该原子添加计算数组中的下一个可用位置。此计数器也作为输出参数返回。
花费95%的经过时间来探测令牌。 5%用于主机GPU内存传输。