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