Проблема: однопоточная производительность CPU перестала расти: тактовая частота не растет, частые команды и так очень быстрые, суперскалярность почти не развивается. Привычный способ ускорения программ апгрейдом компьютера перестал работать. Развитие CPU сейчас идет в сторону увеличения параллельности:
К сожалению, эти новые возможности не могут быть использованы автоматически, старый код не станет сам параллельным и векторным, его придется полностью или частично переписывать.
SIMD-инструкции позволяют выполнять операции над «векторами» т.е. над несколькими элементами данных (например, сложить попарно 4 пары float-чисел одной командой). SIMD-блоки имеют высокую производительность, ее можно увеличивать дальше, удлиняя вектор.
Получение эффективного SIMD-кода возможно несколькими путями:
Эффективное использование многопоточности требует от исполняемого кода минимума синхронизаций. Весьма эффективным подходом является «data-parallel» программирование (частным случаем которого является map-reduce в кластерных системах):
При использовании этого подхода в коде возникают параллельные секции (возможно, с последовательным reduce после них), которые могут быть реализованы многими способами:
Массивно-параллельные языки программирования позволяют (в рамках своей семантики) получать эффективные программы, использующие и SIMD и многопоточность.
CUDA-x86: привязка к одному вендору, смысл, только если есть готовый код (но проще перенести на OpenCL).