Эффективное использование (современных x86-совместимых) CPU

Доклад принят в Программу конференции
Алексей Тутубалин Алексей Тутубалин

Проблема: однопоточная производительность CPU перестала расти: тактовая частота не растет, частые команды и так очень быстрые, суперскалярность почти не развивается. Привычный способ ускорения программ апгрейдом компьютера перестал работать. Развитие CPU сейчас идет в сторону увеличения параллельности:

К сожалению, эти новые возможности не могут быть использованы автоматически, старый код не станет сам параллельным и векторным, его придется полностью или частично переписывать.

SIMD-инструкции позволяют выполнять операции над «векторами»  т.е. над несколькими элементами данных (например, сложить попарно 4 пары float-чисел одной командой).  SIMD-блоки имеют высокую производительность,  ее можно увеличивать дальше, удлиняя вектор.

Получение эффективного SIMD-кода возможно несколькими путями:

Эффективное использование многопоточности требует от исполняемого кода минимума синхронизаций. Весьма эффективным подходом является «data-parallel» программирование (частным случаем которого является map-reduce в кластерных системах):

При использовании этого подхода в коде возникают параллельные секции (возможно, с последовательным reduce после них), которые могут быть реализованы многими способами:

Массивно-параллельные языки программирования позволяют (в рамках своей семантики) получать эффективные программы, использующие и SIMD и многопоточность.

CUDA-x86: привязка к одному вендору, смысл, только если есть готовый код (но проще перенести на OpenCL).