Производительность параллельного кода OpenMP с оптимизацией компилятора и без нее (Sun CC)

Я работаю над проектом, в котором нас попросили написать простой код OpenMP для распараллеливания программы, работающей с дифференциальными уравнениями. Нас также попросили протестировать производительность кода с оптимизацией компилятора и без нее. Я работаю с компилятором Sun CC, поэтому для оптимизированной версии я использовал параметры

-xopenmp -fast

и для неоптимизированных

-xopenmp=noopt

Неудивительно, что время работы с включенной оптимизацией компилятора было намного меньше, чем в другом случае. Что меня удивляет, так это то, что производительность масштабирования намного лучше в неоптимизированной версии. Здесь под производительностью я подразумеваю коэффициент ускорения, то есть отношение времени работы программы на M процессорах к времени работы программы на 1 процессоре.

Намекнули, что это может зависеть от того факта, что оптимизированная версия привязана к памяти, а неоптимизированная версия привязана к процессору. Я не уверен, как «связанность» может повлиять на возможности масштабирования моего кода. У вас есть какие-либо предложения?


person papafe    schedule 17.01.2013    source источник


Ответы (1)


В большинстве многопроцессорных систем несколько ядер ЦП совместно используют один путь к памяти. Заданный выходной двоичный файл будет иметь определенную присущую вычислительную интенсивность (вычисления на каждый доступный байт) для каждого потока. Когда количество ядер, на которых вы запускаете код, позволяет ему превысить скорость работы, превышающую необходимую пропускную способность памяти для его поддержки, он перестанет масштабироваться с дополнительными ядрами. Чтобы получить хорошее представление о том, как рассуждать о такого рода проблемах, посмотрите «модель линии крыши».

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

person Phil Miller    schedule 17.01.2013