2012-05-18 2 views
2

У меня есть длинная строка символов, которая хранится в буфере cl_mem, который я отправляю в свое ядро.Строка в OpenCL

Я хочу разделить эту длинную строку на отдельные строки, которые я буду использовать в качестве шаблонов поиска для некоторой обработки совпадений.

Как я могу это достичь?

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

Я хочу разделить needlesData на несколько различных "игл".

В качестве альтернативы, есть ли лучший способ переместить массив строк из хоста в ядро ​​и использовать их отдельно?

+0

Is needlesData единая подстрока для поиска через стог сена? Вы пытаетесь найти все вхождения иглData, только первое вхождение или количество сколько их? – mfa

+1

Возможно, вам лучше было бы разделить данные на вашем хосте перед отправкой его в ядро. – vocaro

+0

Использование ядра для проскальзывания данных не кажется apropiate. Если вы не хотите выполнять переупорядочивание на основе общего метода, было бы лучше сделать этот процесс на стороне хоста. – DarkZeros

ответ

1

Я сделал это с CUDA. Для обработки файла 4M и разбиения на токены 766K занимает ~ 40 мс на карте NVidia GTX 560 (336 ядер CUDA, ширина памяти 128 Гбайт/с). Это без каких-либо оптимизаций использования общей (локальной) памяти или постоянной памяти.

Предположим, что ваши строки состоят из символов маркера и символов без знака. Основная методика проверяет каждый символ параллельно.

Каждая нить (рабочий элемент) выглядит 2 соседними символами. Если первый символ - не токен, а второй символ - токен. Затем вы нашли начало токена. Этот поток может сканировать вперед, пока не найдет конец токена или конец строки. Вам понадобятся специальные строки case длиной 1 и зондирование первого символа строки (нет предварительного разделителя). Вы можете отклонить все остальные комбинации.

Выходные данные - это два массива. Первая - начальная позиция. Второй массив - это длина. Запись на выходные массивы управляется атомарным добавлением, которое вычисляет следующее доступное местоположение в массиве. Этот счетчик также возвращается в качестве выходного параметра.

95% прошедшего времени тратится на использование жетонов. 5% тратится на передачу памяти Host-GPU.

+0

Оптимизация тестирования разделителей с использованием 256-байтной справочной таблицы в памяти __constant__ повышает производительность на 100% –