Диспетчеризация процессора x86 для SSE / AVX в C ++ - PullRequest
3 голосов
/ 25 января 2011

У меня есть алгоритм, который выигрывает от оптимизации рук с использованием встроенных функций SSE (2).Более того, в будущем алгоритм также сможет использовать преимущества 256-битных регистров AVX.

Мой вопрос заключается в том, как лучше всего

  • зарегистрировать варианты доступностимой класс во время компиляции;поэтому, если мои классы, скажем: Foo, FooSSE2 и FooAVX, мне требуются средства для определения во время выполнения, какие классы компилируются.
  • Определите возможности текущего ЦП.На самом низком уровне это приведет к вызову cpuid.
  • Решите во время выполнения, что использовать, основываясь на том, что скомпилировано и что поддерживается.Из всего вышесказанного представляется достаточно распространенной проблемой, что должны появиться некоторые передовые методы.В идеале я пытаюсь избежать беспорядка #ifdef
    #ifdef COMPILE_SSE2
        if (sse2_supported)
            // Use the SSE2 class
    #endif
    

1 Ответ

1 голос
/ 07 ноября 2011

Просто создайте «фабричный» класс или функцию для создания соответствующих экземпляров вашего класса и скройте всю логику в файле, который реализует фабрику.

У некоторых локальных логических значений класса или файла, таких как «isSSE2Supported»или "isAVXSupported".При запуске вызовите некоторую функцию для инициализации этих значений.Затем ваша фабричная логика может проверить значения, чтобы определить, какой класс использовать.

Поскольку SSE2 всегда доступен на чипах x64, вам не нужно избегать всех ifdef.Вы можете избежать компиляции в некоторых классах для сборок x64.

...