Использование инструкций SSE - PullRequest
28 голосов
/ 25 февраля 2009

У меня есть цикл, написанный на C ++, который выполняется для каждого элемента большого целочисленного массива. Внутри цикла я маскирую некоторые биты целого числа, а затем нахожу минимальное и максимальное значения. Я слышал, что если я использую инструкции SSE для этих операций, они будут выполняться намного быстрее по сравнению с обычным циклом, написанным с использованием побитового И и условий if-else. У меня вопрос, должен ли я пойти по этим инструкциям SSE? Кроме того, что произойдет, если мой код работает на другом процессоре? Это все еще будет работать или эти инструкции относятся к конкретному процессору?

Ответы [ 15 ]

1 голос
/ 26 февраля 2009

Посмотрите на встроенный ассемблер для C / C ++, вот статья DDJ . Если вы не уверены на 100%, что ваша программа будет работать на совместимой платформе, вы должны следовать рекомендациям, приведенным здесь.

1 голос
/ 26 февраля 2009

Просто вкратце добавим к сказанному ранее о том, что разные версии SSE доступны на разных процессорах: это можно проверить, посмотрев соответствующие флаги функций, возвращаемые инструкцией CPUID (подробности см., Например, в документации Intel).

1 голос
/ 26 февраля 2009

Встроенные функции SIMD (такие как SSE2) могут ускорить такие вещи, но требуют опыта для правильного использования. Они очень чувствительны к выравниванию и задержке конвейера; неосторожное использование может сделать производительность еще хуже, чем было бы без них. Вы получите намного более простое и более быстрое ускорение от простого использования предварительной выборки из кэша, чтобы убедиться, что все ваши целые находятся в L1 вовремя, чтобы вы могли работать с ними.

Если вашей функции не требуется пропускная способность, превышающая 100 000 000 целых чисел в секунду, SIMD, вероятно, не стоит ваших проблем.

1 голос
/ 25 февраля 2009

Хотя верно, что SSE специфичен для некоторых процессоров (SSE2 может быть относительно безопасным, SSE2 намного меньше по моему опыту), вы можете обнаружить CPU во время выполнения и динамически загружать код в зависимости от целевого CPU. *

0 голосов
/ 25 февраля 2009

Я не рекомендую делать это самостоятельно, если вы не очень хорошо разбираетесь в сборке. Использование SSE, скорее всего, потребует тщательной реорганизации ваших данных, как указывает Skizz , и преимущество в лучшем случае часто сомнительно.

Возможно, для вас было бы гораздо лучше написать очень маленькие циклы и держать ваши данные очень плотно организованными, и просто полагаться на то, что компилятор сделает это за вас. И компилятор Intel C, и GCC (начиная с 4.1) могут автоматически векторизовать ваш код и, вероятно, справятся с этим лучше, чем вы. (Просто добавьте -ftree-vectorize к своим CXXFLAGS.)

Редактировать : Еще одна вещь, которую я должен упомянуть, - это то, что несколько компиляторов поддерживают встроенные функции , которые, вероятно, в IMO проще использовать, чем синтаксис asm () или __asm ​​{} .

...