Диспетчеризация процессора x86 для SSE / AVX в C ++

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

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

  • Зарегистрируйте варианты доступности моего класса во время компиляции; поэтому, если мои классы, скажем: Foo, FooSSE2 и FooAVX, мне нужны средства определения во время выполнения, какие классы скомпилированы.
  • Определите возможности текущего процессора. На самом низком уровне это приведет к cpuid вызову.
  • Во время выполнения решите, что использовать, в зависимости от того, что скомпилировано и что поддерживается.

Хотя я могу взломать большую часть вышеперечисленного, это, кажется, достаточно распространенная проблема, и, должно быть, появились некоторые передовые методы. В идеале я пытаюсь избежать #ifdef беспорядка

#ifdef COMPILE_SSE2
    if (sse2_supported)
        // Use the SSE2 class
#endif

person Freddie Witherden    schedule 24.01.2011    source источник


Ответы (1)


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

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

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

person Scott Conger    schedule 07.11.2011