CUDA - память устройства, поиск строки в тексте - PullRequest
0 голосов
/ 17 марта 2012

У меня есть строка длиной не более 500 символов и текстовый файл размером 200 МБ.Я хочу написать программу в CUDA для поиска строки в текстовом файле.Мой текстовый файл слишком большой, и я думаю, что должен поместить его в глобальную память устройства, но как насчет моей строки?Что является лучшим среди общей, постоянной и текстурной памяти?и почему?Также у меня есть массив размером максимум 2500. Какие типы памяти устройства подходят для его хранения?

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Для наивной реализации на 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, обозначает начальную точку матча.

0 голосов
/ 17 марта 2012

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

Вот некоторый псевдокод для простой базовой реализации

...load blocksize+strlen bytes of the file into shared memory...
__syncthreads();
bool found = true;
for (int i = 0; i < strlen; i++) {
    if (file_chunk_in_sharedmem[threadIdx.x + i] !=
        search_str_in_constantmem[i])
    {
        found = false;
        break;
    }
}
if (found) {
    ...output the result...
}

Если цикл структурирован таким образом, что каждый поток обращается к отдельному элементу строки поиска, память 1d текстуры может быть быстрее.

Функции профилирования и / или синхронизации cuda - ваши друзья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...