欢迎来到山村网

GPGPU OpenCL怎么实现精确字符串查找?

2019-03-02 12:31:13浏览:539 来源:山村网   
核心摘要:  1.加速方法  (1)将少量常量数据,如模式串长度、文本长度等,保存在线程的private memory中。  (2)将模式串保存在GPU的l

  1.加速方法

  (1)将少量常量数据,如模式串长度、文本长度等,保存在线程的private memory中。

  (2)将模式串保存在GPU的local memory中,加速线程对模式串的访问。

  (3)将待查找的文本保存在global memory中,使用尽可能多线程访问global memory,减小线程平均访存时间。

  (4)每个work-group中的线程操作文本中一段,多个work-group并行处理大文本。

  2.同步

  (1)work-group内,使用CLK_LOCAL_MEM_FENCE、CLK_GLOBAL_MEM_FENCE

  (2)全局使用对__global int 的原子操作,来保证每个线程将结果写到全局内存的正确位置。设备支持的操作可以通过查询设备的扩展获得,如下图,可知核函数支持原子操作、printf操作:

GPGPU OpenCL怎么实现精确字符串查找? 山村

  3.代码实例,大文本精确模式串搜索

  3.1 核函数(string_search_kernel.cl):

  int compare(__global const uchar* text, __local const uchar* pattern, uint length){

  for(uint l=0; l

  if (text[l] != pattern[l])

  return 0;

  }

  return 1;

  }

  __kernel void

  StringSearch (

  __global uchar* text, //Input Text

  const uint textLength, //Length of the text

  __global const uchar* pattern, //Pattern string

  const uint patternLength, //Pattern length

  const uint maxSearchLength, //Maximum search positions for each work-group

  __global int* resultCount, //Result counts (global)

  __global int* resultBuffer, //Save the match result

  __local uchar* localPattern) //local buffer for the search pattern

  {

  int localIdx = get_local_id(0);

  int localSize = get_local_size(0);

  int groupIdx = get_group_id(0);

  uint lastSearchIdx = textLength - patternLength + 1;

  uint beginSearchIdx = groupIdx * maxSearchLength;

  uint endSearchIdx = beginSearchIdx + maxSearchLength;

  if(beginSearchIdx > lastSearchIdx)

  return;

  if(endSearchIdx > lastSearchIdx)

  endSearchIdx = lastSearchIdx;

  for(int idx = localIdx; idx < patternLength; idx+=localSize)

  localPattern[idx] = pattern[idx];

  barrier(CLK_LOCAL_MEM_FENCE);

  for(uint stringPos=beginSearchIdx+localIdx; stringPos

  if (compare(text+stringPos, localPattern, patternLength) == 1){

  int count = atomic_inc(resultCount);

  resultBuffer[count] = stringPos;

  //printf("%d ",stringPos);

  }

  barrier(CLK_LOCAL_MEM_FENCE);

  }

  }

(责任编辑:豆豆)
下一篇:

GPGPU OpenCL中如何使用结构体数据?

上一篇:

winsocket局域网聊天软件怎么运行?

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com