Можно ли получить улучшенную производительность при параллельном чтении на Фортране?
У меня есть код fortran90, который тратит (безусловно) большую часть времени на ввод-вывод, потому что очень большие файлы данных (по крайней мере 1 ГБ и выше) должны быть прочитаны. Меньшие, но все еще большие файлы данных с результатами расчетов должны быть записаны. Для сравнения, некоторые быстрые преобразования Фурье и другие вычисления выполняются в кратчайшие сроки. Я распараллелил (OpenMP) некоторые из этих вычислений, но общий выигрыш в производительности минимален с учетом упомянутых проблем ввода-вывода.
Моя стратегия на данный момент состоит в том, чтобы прочитать весь файл сразу:
open(unit=10, file="data", status="old")
do i=1,verylargenumber
read(10,*) var1(i), var2(i), var3(i)
end do
close(10)
а затем выполнить операции на var1
и т. д. Мой вопрос заключается в том, существует ли подходящая стратегия, использующая (предпочтительно) OpenMP, которая позволила бы мне ускорить процесс чтения, особенно с учетом (если это имеет какое-то значение), что файлы данных довольно велики.
У меня есть возможность выполнить эти вычисления на файловых системах Luster, которые в принципе предлагают преимущества для параллельного ввода-вывода, хотя общее решение для обычных файловых систем будет приветствоваться.
Моя интуиция заключается в том, что нет никаких работ по этому вопросу, но я хотел проверить наверняка.
1 ответ
Я не гуру из Фортрана, но похоже, что вы читаете значения из файла очень маленькими порциями (3x целых числа, максимум несколько десятков байт). Чтение файла большими порциями (по несколько МБ за раз) обеспечит значительное улучшение производительности, так как вы будете уменьшать количество основных read()
системные вызовы (и соответствующие накладные расходы блокировки) на много порядков.
Если ваши большие файлы написаны в блеске с несколькими полосами (например, в каталоге с lfs setstripe -c 8 -S 4M <dir>
установить количество полос по умолчанию, равное 8, с размером полосы 4 МБ для всех новых файлов в этом каталоге), тогда это может улучшить совокупную производительность чтения - при условии, что вы читаете только один файл за один раз, и вы не ограничены пропускная способность клиентской сети. Если ваша программа работает на нескольких узлах и / или потоках одновременно, и каждый из этих потоков сам читает свой собственный файл, то у вас уже будет параллелизм выше уровня файла. Даже чтение из одного файла может быть достаточно хорошим (если чтение велико), потому что клиент Luster будет выполнять чтение в фоновом режиме.
Если у вас есть несколько вычислительных потоков, каждый из которых работает с разными фрагментами файла одновременно (например, 4 МБ), то вы можете прочитать каждый из 4 МБ блоков из другого потока, что может повысить производительность, так как у вас будет больше запросов ввода-вывода в рейс. Тем не менее, существует ограничение на скорость чтения файлов по сети одним клиентом. Одновременное чтение многослойного файла с нескольких клиентов позволит вам объединить пропускную способность сети и диска от нескольких клиентов и серверов, и именно в этом Luster справляется лучше всего.