Преимущество одновременного использования нескольких наборов инструкций SIMD
Я пишу очень параллельное приложение, которое является многопоточным. У меня уже написан класс ускоренного потока SSE. Если бы я написал класс ускоренного потока MMX, то запустил бы оба одновременно (один поток SSE и один поток MMX на ядро), заметно ли повысилась бы производительность?
Я бы подумал, что эта настройка поможет скрыть задержку памяти, но я хотел бы убедиться, прежде чем я начну тратить на это время.
2 ответа
Наборы команд SSE и MMX совместно используют один и тот же набор исполнительных блоков векторной обработки в CPU. Следовательно, для выполнения потока SSE и потока MMX каждый поток будет иметь одинаковые ресурсы, как если бы выполнялись два потока SSE (или два потока MMX). Единственная разница заключается в инструкциях, которые существуют в SSE, но не в MMX (поскольку SSE является расширением MMX). Но в этом случае MMX, вероятно, будет работать медленнее, потому что в нем нет более продвинутых инструкций.
Поэтому ответ таков: нет, вы не увидите улучшения производительности по сравнению с запуском двух потоков SSE.
SSE и MMX используют одни и те же регистры, поэтому не имеет значения, какой из двух вы используете (конечно, кроме сосания MMX и SSE)
Лучший вопрос - как SSE реализован на вашем целевом процессоре. У него есть блок SSE на ядро? (вероятно) Если это так, то вы могли бы также запустить инструкции SSE в каждом потоке.
Если у него есть общий SSE-модуль между ядрами, то за него будут бороться разные потоки, так что выполнение инструкций SSE в нескольких потоках не принесет особой выгоды. (Я не знаю, действительно ли какие-либо процессоры разделяют единицу SSE между потоками, поэтому примите это как гипотетический случай)