Кросс-платформенные вызовы SIMD возможны только с одним исполняемым файлом? - PullRequest
0 голосов
/ 27 июня 2018

Я недавно заинтересовался оптимизацией SIMD после того, как через некоторое время снова захотел программировать на C ++. Пожалуйста, будьте понятны, так как я все еще новичок с инструкциями SIMD.

Мой вопрос: возможно ли скомпилировать один кросс-платформенный исполняемый файл на C ++, который поддерживает множество наборов команд SIMD и который в режиме реального времени выбирает лучший набор команд для использования? Лучше всего с точки зрения производительности, обычно самые последние наборы инструкций лучше.

Пример: я компилирую игру на Windows 10 с i7-7700K и помещаю ее в Steam. Вероятно, у разных пользователей разные процессоры, которые поддерживают разные наборы команд SIMD. При запуске игры определяется и используется лучший набор инструкций SIMD.

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

1 Ответ

0 голосов
/ 28 июня 2018

Обычно проблема заключается в том, какой уровень детализации вы хотите использовать SIMD ... Старые математические библиотеки, такие как D3DXMath, используют косвенный переход (то есть виртуальные методы) для выбора во время выполнения версии функции, оптимизированной для этого набора команд. Хотя теоретически это работает, функция должна выполнять достаточно работы, чтобы покрыть издержки косвенного вызова.

Например: если вы звоните D3DXVec3Dot и выбираете другую версию для SSE / SSE2, SSE3 или SSE4.1, скорее всего, стоимость вызова функции в первую очередь будет выше, чем экономия производительности. Чтобы действительно получить выгоду от такого рода оптимизации, вам нужно иметь более масштабные подпрограммы, которые выполняют тысячи вычислений одновременно, а не микрофункции.

Обратите внимание, что именно поэтому DirectXMath является полностью встроенной библиотекой, которая вообще не использует косвенный переход / диспетчеризацию. Вы можете рассчитывать на то, что SSE / SSE2 всегда поддерживаются для x64, и в основном это всегда поддерживается для x86. Если вам случается создать EXE / DLL для платформы, которая всегда имеет AVX (например, Xbox One), тогда используйте /arch:AVX, а библиотека DirectXMath будет использовать AVX, SSE4.1, SSE3, SSE2 / SSE, где это имеет смысл , Смотрите этот пост в блоге .

...