2012-05-18 33 views
2

我有一長串字符存儲在一個cl_mem緩衝區中,並提交給我的內核。在OpenCL中切片字符串

我想把這個長的字符串分成單獨的字符串,我將用它作爲一些匹配處理的搜索模式。

我該如何做到這一點?

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

我想將needlesData分成多個不同的「針」。

或者,有沒有更好的方法將字符串數組從主機移動到內核並單獨使用它們?

+0

Is needlesData是一個單一的子字符串來搜索跨乾草堆?你是否想要查找needlesData的所有事件,只是第一次出現,或者計算出有多少次? – mfa

+1

在將內容提交給內核之前,您可能會更好地分離主機上的數據。 – vocaro

+0

使用內核來傳輸數據似乎並不合適。除非你想根據常用的方法做一些欺騙重新排序,否則最好在主機端進行這個過程。 – DarkZeros

回答

1

我這樣做是與CUDA。在NVidia GTX 560卡(336 CUDA內核,內存帶寬128G Bytes/s)上處理4M文件並拆分爲766K令牌需要約40ms。這沒有使用共享(本地)內存或常量內存的任何優化。

假設您的字符串包含令牌字符和非令牌字符。基本技術並行探測每個字符。

每個線程(工作項)看起來是2個相鄰的字符。如果第一個字符是非標記,第二個字符是標記。然後你找到了一個令牌的開始。該線程可以向前掃描,直到找到標記的結尾或字符串的結尾。您需要長度爲1的特殊字符串並探測字符串的第一個字符(沒有事先分隔符)。您可以拒絕所有其他組合。

輸出是兩個數組。首先是開始位置。第二個數組是長度。 寫入輸出數組由計算數組中下一個可用位置的原子添加控制。該計數器也作爲輸出參數返回。

經過時間的95%用於探測令牌。 5%用於主機GPU內存傳輸。

+0

使用__constant__內存中的256字節查找表優化對分隔符的測試,可使性能提高100% –