Все мои программы работают медленнее, чем хотелось бы.Во всех (хорошо, не во всех, но во многих) моих научных программах есть гнездо с глубоким циклом, в котором самые внутренние утверждения занимают большую часть времени вычислений.Обычно я ожидаю, что 90% моих вычислений будут приняты этими утверждениями.Это ваше самое внутреннее утверждение выполняется 2,5x10 ^ 9 раз, поэтому вы должны ожидать, что оно займет значительную долю общего времени.
Учитывая это, я предлагаю вам:
a) Воспользуйтесь советом @ Alexandre, чтобы использовать BLAS вместо умножения собственного матричного вектора на вектор.
b) игнорировать совет @ Yuval о выводе операций из цикла - хороший компилятор Fortran сделает это за вас, еслиВы повышаете оптимизацию (ВНИМАНИЕ: это самоисполняющееся пророчество настолько, насколько компилятор этого не делает, не является хорошим).Есть много других оптимизаций, которые я ожидаю от хорошего Фортрана в эти дни, см. (D).(Я не ожидаю оптимизации доступа к памяти компилятором, я ожидаю, что от BLAS.)
c) Сформируйте реалистичное ожидание того, какую производительность вы должны получить от своей программы.Если вы получаете устойчивый показатель FLOP, превышающий 10% от номинальной производительности процессоров, вы делаете это очень хорошо и должны тратить свое время на другие задачи, а не на оптимизацию.
d) Внимательно прочитайте документацию по компилятору.Убедитесь, что вы понимаете, что на самом деле делают флаги оптимизации.Убедитесь, что вы генерируете код для используемых процессоров, а не какой-то более старый вариант.Включите быстрые векторные операции, если они доступны.Все подобные вещи.
e) Начните распараллеливание.OpenMP - хорошее место для начала, и, как указывает @Nicolas, кривая обучения поначалу довольно мягкая.
О, и совет 0, которому вы, похоже, следовали, - это измерить производительность кода и измеритьвлияние любых изменений, которые вы делаете.