Есть достаточно известная статья Герба Саттера "The Free Lunch Is Over. A Fundamental Turn Toward Concurrency in Software". В ней говорится, что не стоит более надеяться на рост тактовой частоты микропроцессоров. Для повышения производительности программ теперь необходимо использовать несколько ядер в микропроцессоре. Хотя статья написана в 2005 году, до настоящего времени она для меня была скорее теоретической, чем практическим руководством к действию. Ранее я всегда получал ускорение, приобретая новый компьютер. Но вот настал тот момент, когда этого не произошло.
Рисунок 1 — Время работы unit-тестов на моей старой и новой машине.
Разрабатывая проект PVS-Studio, мы регулярно используем тесты, время выполнения которых на моей машине с двумя ядрами составляло порядка 90 минут. Это не очень долго, но в обед уже не укладывается. Работа PVS-Studio заключается в анализе исходного кода на языке Си/Си++ и выдаче дополнительных предупреждений пользователям Visual Studio 2005/2008, там, где их программа может быть некорректна для 64-битных или параллельных систем. При этом основным потребляемым ресурсом является количество и скорость ядер, а также объем оперативной памяти. Классическая счетная задача. Кроме того, мне иногда не хватало 4 Гбайт памяти для экспериментов с 64-битными ошибками, возникающими при обработке больших массивов. Одним словом, захотелось чуть более мощную рабочую машину :-).
Было:
Intel® Core™2 Duo Processor E7200, 2.40 Ghz, 4Gb, 64-bit. Операционная система Windows Vista 64-bit.
Стало:
Intel® Core™2 Quad Processor Q9400, 2.66 Ghz, 8Gb, 64-bit. Операционная система Windows 7 64-bit.
Остальные параметры приводить смысла нет. Видеокарты хоть и различные, на скорость статического анализа кода, это никак не влияет. Жесткие диски разного объема, но одинакового класса.
А теперь приступим к сравнению этих систем. Сразу подчеркну, что анализ однобокий и не может отражать целой картины. Целью не являлось точно сравнить производительность двух процессоров. Я исследовал скорость решений той задачи, которая мне интересна.
Для начала я сравнил скорость работы внутренних юнит-тестов. Юнит-тесты используют только одно ядро, но я ожидал увидеть небольшой прирост производительности за счет чуть более высокой тактовой частоты. Результат оказался прямо противоположным!
Рисунок 2 – Замеры скорости работы unit-тестов 64-битной версии анализатора. Приведено среднее время работы по 5 проведенным запускам.
Я не знаю, чем вызван такой провал производительности. Поэтому комментировать этот замер не буду.
Данный эксперимент может быть достаточно неточным. Перейдем к настоящим испытаниям. Сравним скорость работы больших тестов:
Рисунок 3 – Запуск длительных тестов, в ходе которого проверяется 32 программных проекта. В процессе тестирования участвует компилятор Visual C++, анализатор PVS-Studio и система сравнения выдаваемых результатов.
Рисунок 4 — Тоже самое, но в виде графика.
Если на новой системе использовать только два ядра, то скорость работы совпадает со скоростью работы на старой машине с двумя ядрами. Никакого ускорения за счет более высокой частоты ядра нет. При использовании четырех ядер результат значительно лучше. Цель достигнута — тесты укладываются в один час. То, что ускорение происходит не в два раза связано с тем, что процесс тестов не полностью параллелен и содержит последовательные процедуры.
Я не хочу строить теории, почему получены именно такие данные по замерам скорости и в чем может быть ошибка. Я хочу сказать, что пришло то самое время, когда халява закончилась. Приобретая новый компьютер с большим количеством ядер, не стоит надеяться, что старые программы будут работать на нем быстрее. Преимущество можно получить только от использования программ, которые умеют использовать несколько ядер.
Рисунок 1 — Время работы unit-тестов на моей старой и новой машине.
Разрабатывая проект PVS-Studio, мы регулярно используем тесты, время выполнения которых на моей машине с двумя ядрами составляло порядка 90 минут. Это не очень долго, но в обед уже не укладывается. Работа PVS-Studio заключается в анализе исходного кода на языке Си/Си++ и выдаче дополнительных предупреждений пользователям Visual Studio 2005/2008, там, где их программа может быть некорректна для 64-битных или параллельных систем. При этом основным потребляемым ресурсом является количество и скорость ядер, а также объем оперативной памяти. Классическая счетная задача. Кроме того, мне иногда не хватало 4 Гбайт памяти для экспериментов с 64-битными ошибками, возникающими при обработке больших массивов. Одним словом, захотелось чуть более мощную рабочую машину :-).
Было:
Intel® Core™2 Duo Processor E7200, 2.40 Ghz, 4Gb, 64-bit. Операционная система Windows Vista 64-bit.
Стало:
Intel® Core™2 Quad Processor Q9400, 2.66 Ghz, 8Gb, 64-bit. Операционная система Windows 7 64-bit.
Остальные параметры приводить смысла нет. Видеокарты хоть и различные, на скорость статического анализа кода, это никак не влияет. Жесткие диски разного объема, но одинакового класса.
А теперь приступим к сравнению этих систем. Сразу подчеркну, что анализ однобокий и не может отражать целой картины. Целью не являлось точно сравнить производительность двух процессоров. Я исследовал скорость решений той задачи, которая мне интересна.
Для начала я сравнил скорость работы внутренних юнит-тестов. Юнит-тесты используют только одно ядро, но я ожидал увидеть небольшой прирост производительности за счет чуть более высокой тактовой частоты. Результат оказался прямо противоположным!
Рисунок 2 – Замеры скорости работы unit-тестов 64-битной версии анализатора. Приведено среднее время работы по 5 проведенным запускам.
Я не знаю, чем вызван такой провал производительности. Поэтому комментировать этот замер не буду.
Данный эксперимент может быть достаточно неточным. Перейдем к настоящим испытаниям. Сравним скорость работы больших тестов:
Рисунок 3 – Запуск длительных тестов, в ходе которого проверяется 32 программных проекта. В процессе тестирования участвует компилятор Visual C++, анализатор PVS-Studio и система сравнения выдаваемых результатов.
Рисунок 4 — Тоже самое, но в виде графика.
Если на новой системе использовать только два ядра, то скорость работы совпадает со скоростью работы на старой машине с двумя ядрами. Никакого ускорения за счет более высокой частоты ядра нет. При использовании четырех ядер результат значительно лучше. Цель достигнута — тесты укладываются в один час. То, что ускорение происходит не в два раза связано с тем, что процесс тестов не полностью параллелен и содержит последовательные процедуры.
Я не хочу строить теории, почему получены именно такие данные по замерам скорости и в чем может быть ошибка. Я хочу сказать, что пришло то самое время, когда халява закончилась. Приобретая новый компьютер с большим количеством ядер, не стоит надеяться, что старые программы будут работать на нем быстрее. Преимущество можно получить только от использования программ, которые умеют использовать несколько ядер.