Читать несколько текстовых файлов параллельно, используя Cuda - PullRequest
0 голосов
/ 23 января 2012

Я хотел бы искать заданную строку в нескольких файлах параллельно, используя CUDA. Я планировал использовать библиотеку pfac для поиска заданной строки. Проблема в том, как получить доступ к нескольким файлам параллельно.

Пример: у нас есть папка, содержащая тысячи файлов, которые необходимо найти.

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

Возможно ли ????

Edit:

В этом посте: очень быстрая обработка текстовых файлов (C ++) . Он использует библиотеку Boost для чтения 3 ГБ текстового файла за 16 секунд. Хотя в моем случае я должен прочитать 1000-е меньше файлы

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Выполнение вашей задачи в CUDA не сильно поможет, если вы сделаете то же самое в CPU.

При условии, что ваши файлы хранятся на стандартном магнитном жестком диске, типичная однопоточная программа ЦП будет использовать:

  1. Около 5 мс, чтобы найти сектор, в котором хранится файл, и поместить его под считывающую головку.
  2. Около 10 мс для загрузки файла 1 МБ (при скорости чтения 100 МБ / с) в оперативную память
  3. Менее 0,1 мс для загрузки 1 МБ данных из ОЗУ в кэш-память ЦП и их обработки с использованием алгоритма линейного поиска.

Это 15,1 мс для одного файла. Если у вас есть 1000 файлов, работа займет 15.1 с.

Теперь, если я дам вам сверхмощный графический процессор с бесконечной пропускной способностью памяти, без задержек и бесконечной скоростью процессора, вы сможете выполнить задачу (3) без времени. Тем не менее, чтение с жесткого диска все равно будет занимать столько же времени. GPU не может распараллелить работу другого, независимого устройства. В результате вместо того, чтобы тратить 15,1 с, теперь вы будете делать это за 15,0 с.

Бесконечный графический процессор даст вам ускорение на 0,6%. Настоящий графический процессор был бы даже близко к этому!


В более общем случае: если вы планируете использовать CUDA, спросите себя: является ли фактическое вычисление узким местом проблемы?

  • Если да - продолжайте поиск возможных решений в мире CUDA.
  • Если нет - CUDA не может вам помочь.

Если вы имеете дело с тысячами крошечных файлов и вам нужно часто выполнять чтение, подумайте о методах, которые могут «атаковать» ваше узкое место. Некоторые могут включать в себя:

  • Буферизация ОЗУ
  • Перевод жестких дисков в конфигурацию RAID
  • Получение SSD

может быть больше вариантов, я не эксперт в этой области.

1 голос
/ 25 января 2012

Да, возможно, можно получить ускорение с помощью CUDA , если , вы можете уменьшить влияние задержки чтения / пропускной способности.Одним из способов было бы одновременное выполнение нескольких поисков.Т.е. если вы можете искать [needle1], .. [needle1000] в вашем большом стоге сена, то каждая нить может искать куски стога сена и сохранять хиты.Некоторый анализ пропускной способности, требуемой для каждого сравнения, необходим для определения вероятности улучшения поиска с помощью CUDA.Это может быть полезно http://dl.acm.org/citation.cfm?id=1855600

...