Производительность параллельного кода OpenMP с оптимизацией компилятора и без него (Sun CC)
Я работаю над проектом, в котором нас попросили написать простой код OpenMP для распараллеливания программы, работающей с дифференциальными уравнениями. Нас также попросили проверить производительность кода с оптимизацией компилятора и без нее. Я работаю с компилятором Sun CC, поэтому для оптимизированной версии я использовал параметры
-xopenmp -fast
и для неоптимизированных
-xopenmp=noopt
Не удивительно, что время работы с оптимизацией компилятора было намного меньше, чем в другом случае. Что меня удивляет, так это то, что показатели масштабирования намного лучше в неоптимизированной версии. Здесь под производительностью я подразумеваю коэффициент ускорения, то есть отношение времени выполнения программы на М процессорах и времени работы программы на 1 процессоре.
Намекнули, что это может зависеть от того факта, что оптимизированная версия связана с памятью, а неоптимизированная версия - с процессором. Я не уверен, как "ограниченность" может повлиять на масштабируемость моего кода. Есть ли у вас предложения?
1 ответ
В большинстве многопроцессорных систем несколько ядер ЦП имеют общий путь к памяти. У данного выходного двоичного файла будет определенная внутренняя вычислительная интенсивность (вычисления на доступ к байту) на поток. Когда количество ядер, на которых вы запускаете код, позволяет ему превысить скорость работы, превышающую необходимую пропускную способность памяти для его поддержки, он прекратит масштабирование с использованием дополнительных ядер. Чтобы получить четкое представление о том, как рассуждать об этой проблеме, посмотрите "модель крыши".
Есть два изменения, которые я ожидаю увидеть от включения оптимизации. Одним из них является то, что интенсивность вычислений должна несколько увеличиться, если оптимизация обеспечит какой-либо вид циклической блокировки для уменьшения доступа к памяти. Другое заключается в том, что необработанная скорость работы должна увеличиваться при лучшей идентификации возможностей векторизации и последующего выбора и планирования команд. Эти две вещи должны оказывать противоположное влияние на эффективность масштабирования, но последняя явно доминирует в вашем случае.