Использование pthreads с CUDA - вопросы дизайна - PullRequest
4 голосов
/ 09 июля 2011

Я пишу некоторый код, который требует некоторого дискового ввода-вывода, и вызываю библиотеку, которую я написал, которая выполняет некоторые вычисления и работу с графическим процессором, а затем еще больше дискового ввода-вывода для записи результатов обратно в файл.

Я хотел бы создать это как многопоточный код, потому что файлы довольно большие. Я хочу иметь возможность прочитать часть файла, отправить его в библиотеку графического процессора и записать часть обратно в файл. Дисковый ввод / вывод довольно большой (например, 10 ГБ), и вычисления выполняются на GPU довольно быстро.

Мой вопрос - скорее вопрос дизайна. Должен ли я использовать отдельные потоки для предварительной загрузки данных, которые поступают в библиотеку GPU, и только основной поток должен фактически выполнять вызовы библиотеки GPU, а затем отправлять полученные данные в другие потоки для последующей записи на диск, или Должен ли я пойти дальше и сделать так, чтобы все отдельные потоки выполняли свою часть работы - собрать часть данных, выполнить на графическом процессоре и записать на диск, а затем перейти к следующему фрагменту данных?

Я использую CUDA для своей библиотеки GPU. Cuda достаточно умен, чтобы не пытаться запустить два ядра на GPU одновременно? Думаю, мне придется выполнять управление вручную, чтобы два потока не пытались добавить больше данных в графический процессор, чем в нем есть место?

Будем благодарны за любые полезные ресурсы по многопоточности и CUDA, которые используются в комбинации.

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Потоки не помогут с дисковым вводом / выводом. Обычно люди, как правило, решают проблемы блокировки, создавая тонны потоков. На самом деле, это только усугубляет ситуацию. Вам нужно использовать асинхронный ввод-вывод , а не блокировать запись (и чтение). Для этого вы можете использовать некоторые общие решения, такие как libevent или Asio или работать с API более низкого уровня, доступным на вашей платформе. В Linux AIO кажется лучшим для файлов, но я еще не пробовал. Надеюсь, это поможет.

1 голос
/ 12 июля 2011

Я столкнулся с такой ситуацией с большими файлами в моей исследовательской работе.

Насколько я помню, нет большого выигрыша в потоковой работе дискового ввода-вывода, потому что она очень медленная по сравнению с вводом-выводом графического процессора,

Стратегия, которую я использовал, заключалась в том, чтобы синхронно читать с диска, загружать данные и выполнять асинхронно на GPU.

Что-то вроде:

read from disk
loop:
 async_load_to_gpu
 async_execute
 push_event
 read from disk
 check event complete or read more data from disk
...