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

Доклад принят в Программу конференции
Наталия Багрова (билайн — технологичная компания, предоставляющая клиентам услуги в области Big Data, IT, безопасности, облачных технологий, интернета вещей и рекламных инструментов. В штате работают более 3000 IT-специалистов, они помогают более 80 000 клиентам из разных отраслей бизнеса быть более эффективными.)Наталия Багрова

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

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

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

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

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

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

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

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