2011-01-24 2 views
2

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

Мой вопрос: что это лучший способ

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

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

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

ответ

0

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

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

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