0

Я новичок в программировании, и я на самом деле инженер-механик. Для моих исследований я написал программу fortran для моделирования процесса. Эта процедура довольно медленная, потому что либо она была написана мной (и поэтому она не является совершенной вычислительной), и она выполняет много итераций для достижения конвергенции, поэтому ей нужно время.Запуск программы fortran с несколькими процессорами

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

Процедура такова:

PROGRAM my routine 

    INCLUDE 'dimensions_of_arrays.dim' 
    INCLUDE 'subroutines.sub' 
    INCLUDE 'subroutines2.sub' 

    DECLARATION OF VARIABLES 
    .. 
    . 
    DO LOOP OVER MANY STEPS 
    . 
    CALL MANY SUBROUTINES 
    . 
    . 
    . 
    PERFORM SOME ITERATION 
    END LOOP 
    . 
    WRITE RESULTS 
    END 

В файле Подпрограммы 'subroutines.sub' У меня есть более чем 20 подпрограмм, как это:

SUBROUTINE xxx(a,b) 

    INCLUDE 'dimensions_of_arrays.dim' 

    DECLARATION OF VARIABLES 
    COMMON/PATH1/PATH2/G,J,K 

    . 
    . 
    SOME CALCULATION 
    . 
    END 

В файле «dimensions_of_arrays .dim 'есть общие и параметры, используемые во время компиляции.

Возможно ли это, по вашему мнению, использовать многопроцессорную систему с этой рутиной? Попытка не изменять его «сильно».

Я использую Intel Composer XE2011 с Visual Studio 2010 как компилятор кода.

Любая помощь очень ценится. Thanks

+3

Ответ почти наверняка, но это может быть много работы, и с деталью здесь мы просто не можем сказать. Однако вы начинаете с неправильного места. Fortran 77 мертв - пожалуйста, изучите Fortran95 или позже и попытайтесь забыть все, что вы когда-либо знали об общих и подобных. Я говорю это как методологию для параллелизма (OpenMP) работает гораздо легче с современным кодом, чем стандартом, который был заменен четверть века назад. –

+0

Основная проблема заключается в том, что эта процедура не была полностью написана мной, но я сделал важные изменения в исходной версии кода.Считаете ли вы, что потребуется время для «скрытия» всего в новом fortran90-95? –

+0

Как рекомендовано @Ian, было бы разумно перенести ваш код с f77 на f90 по крайней мере. Прежде чем пытаться распараллелить свой код, который не так-то просто сделать, воспользуйтесь функциями Fortran 90, такими как модули и интерфейсы, ваш код будет более чистым и читаемым. Вы также должны взглянуть на некоторые опции компиляции и флаги оптимизации, которые должны немного помочь. Найдите «узкие места» в своем коде, профилируя его, возможно, перерисовка какого-либо алгоритма или части вашего кода улучшит его скорость. Только тогда вы можете рассмотреть OPENMP/MPI, чтобы воспользоваться преимуществами многоядерного процессора. – Coriolis

ответ

0

Поскольку вы используете Intel Fortran, я предлагаю, чтобы ваш первый шаг должен был добавить параметр автоматического распараллеливания. В Visual Studio в Windows это свойство проекта Fortran> Оптимизация> Параллелизация> Да. Пока вы на нем, я предлагаю установить параметр/QxHost. Я не помню, поддерживает ли используемая вами старая версия как свойство проекта - если это так, то это будет Fortran> Generator> Оптимизация процессоров Intel> То же, что и основной процессор. Конечно, вы должны создать конфигурацию Release, чтобы включить оптимизацию.

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

Вы используете довольно старую версию компилятора - более новые версии намного лучше распараллеливают и оптимизируют, и я бы рекомендовал вам использовать новейшую версию, к которой у вас есть доступ. Если ни одно из этих результатов не дает желаемых результатов, я согласен, что вам нужно «замарать руки» и добавить директивы OpenMP, но это потребует, чтобы вы хорошо понимали, как работает программа, какие переменные должны быть разделены и который частный. Промежуточным шагом было бы использовать директивы Intel по распараллеливанию, но они не сильно отличаются от OpenMP.

При преобразовании последовательной программы в параллель, особенно в старом коде Fortran, вы должны быть очень осторожны, когда дело доходит до глобальных переменных (обычно COMMON). Они могут либо блокировать распараллеливание, либо приводить к неправильным результатам. Инструмент Intel Inspector XE (часть более крупных выпусков Intel Parallel Studio XE) может быть полезен для их поиска.

+0

благодарит вас за исчерпывающий ответ и прост для понимания даже для меня;) –