Для наивной реализации на Fermi:
Сохранение текстового файла в глобальной памяти и строки поиска в постоянной памяти. Установите буфер результатов того же размера, что и текстовый файл. Заполните буфер результатов нулями.
Пусть количество потоков в блоке t будет равно длине строки поиска. Чтобы определить размеры сетки, рассмотрите размер вашего текстового файла и ограничение размера сетки в 64 КБ. Чтобы покрыть весь файл, выберите размер для x , например, 10K. Затем найдите размерность для y , разделив размер вашего текстового файла на x и округлив результат. Таким образом, 200M / 10K = 20K (что в пределах 64K). Запустите ядро с потоками t и сеткой ( x , y ).
В ядре:
Рассчитать смещение в текстовом файле как d = x + 1024 * y .
Поскольку размерность y была округлена выше, некоторые ядра в конце цикла должны быть прерваны. Прервать поток, если d + t больше, чем размер текстового файла.
Иначе, пусть поток загрузит один символ по индексу t из строки поиска и сравнит его с одним символом по индексу t + d в тексте файл. Если символы не совпадают, сохраните «1» в буфере результатов с индексом d , иначе ничего не делайте.
Когда ядро завершит работу, просканируйте буфер результатов с помощью Thrust. Каждое местоположение, равное 0, обозначает начальную точку матча.