Mac OSX минимальная поддержка SSE версия

Какой минимальный поддерживаемый флаг sse можно включить в osx? большая часть оборудования, которое я использую, поддерживает sse2 в наши дни. В Windows и Linux у меня есть код для проверки поддержки sse. Я где-то читал, что osx уже давно поддерживает sse. Но я не знаю, какая минимальная версия может быть включена. Последний двоичный файл будет скопирован на другие платформы osx, поэтому я не могу использовать -march=native, как в GCC

Если он включен по умолчанию во всех сборках, нужно ли передавать флаги -msse или -msse2 при сборке кода?

Вот версия компилятора:

Apple LLVM версии 6.0 (clang-600.0.56) (на основе LLVM 3.5svn)
Цель: x86_64-apple-darwin14.1.0
Модель потока: posix

Вот вывод uname -a

uname -a
Darwin mme.local 14.1.0 Darwin Kernel Версия 14.1.0: Понедельник, 22 декабря 23:10:38 PST 2014; root:xnu-2782.10.72~2/RELEASE_X86_64 x86_64

Вот выходные данные sysctl machdep.cpu.features

machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 DTES64 Пн DSCPL VMX EST TM2 SSSE3 CX16 TPR PDM.2 POPCNT

1 ответ

Решение

SSE2 включен по умолчанию для x86-64, потому что это обязательная часть ISA x86-64.

Поскольку Apple никогда не продавала процессоры AMD или Pentium4, x86-64 на OS X также подразумевает SSSE3 (Core2 первого поколения). Первые x86 Mac были Core (не Core2), но они были только 32-битными. К сожалению, вы не можете принять SSE4.1 или -mpopcnt,

Я бы предложил -march=core2 -mtune=haswell, (-mtune не влияет на совместимость, и настройка Haswell не должна быть плохой для реального оборудования Core2 или Nehalem. См. http://agner.org/optimize/ и ссылки в вики-теге x86 для получения подробной информации о микроархитектуре о том, что происходит на разных языках (сгенерированных компилятором) быстро или медленно на разных процессорах.).

(См. Как на самом деле работает mtune? Для примера другой настройки, вызывающей различный выбор команд без изменения требуемых расширений ISA.)

-march=core2 включает все, что поддерживает core2, не только SSSE3. Поскольку вы не заботитесь о том, чтобы ваш код хорошо работал на процессорах AMD (потому что это OS X), вы можете настроить процессор Intel. Есть также -mtune=intel что является более общим, но Haswell должен быть разумным.

Возможно, вам не хватает поддержки систем Hackintosh, где кто-то установил OS X на старый процессор на оборудовании сторонних производителей, но IDK, если OS X будет работать на AMD Athlon64 / PhenomII или Intel P4.

Было бы неплохо иметь возможность включить некоторые вещи Nehalem, такие как -mpopcnt Но в Core 2 первого и второго поколения (Conroe и Penryn) этого не было. Даже SSE4.1 недоступен в Core 2 первого поколения.


Также возможно построить толстый бинарный файл с базовыми срезами и срезами Haswell, x86_64 а также x86_64h, Стивен Кэннон говорит (в комментариях ниже), что "срез x86_64h будет автоматически запускаться на Haswell и более поздних µarches". (Ломтики для других уарчей в настоящее время не вариант, но большинство программ получит небольшую выгоду.)

Ваш x86_64 (не Haswell) срез, вероятно, должен строить с -march=core2 -mtune=sandybridge,

Haswell представил AVX2, FMA и BMI2, поэтому -march=haswell это очень хорошо для Бродвелл / Скайлэйк / Kaby Lake / Coffee Lake. (Для параметров настройки, а также расширений ISA: gcc -march=haswell отключает -mavx256-split-unaligned-load и хранить, пока -mavx + tune = default или sandybridge включает его. Он сосет на Haswell, особенно когда он создает узкие места в случайном порядке. И это действительно глупо, когда ваши данные почти всегда выровнены или действительно всегда, но вы просто не сказали об этом компилятору.

Бродвелл представил ADOX/ADCX, который занимает довольно нишу (параллельно запускает две цепочки зависимостей добавления с расширенной точностью), а Skylake - clflushopt который не очень полезен.

Тем не менее, Skylake и большинство процессоров Broadwell имеют рабочую транзакционную память, что может быть важно в некоторых случаях многопоточности. (Haswell собирался получить его, но он был отключен при обновлении микрокода после того, как в реализации была обнаружена редкая ошибка.)

AVX512 - следующая большая вещь, которая широко используется, но Haswell не имеет, так что, возможно, Apple в какой-то момент добавит поддержку среза Cannonlake или Ice Lake.

Я бы не рекомендовал делать отдельную сборку для Broadwell или Skylake (с любым механизмом диспетчеризации), если только вы не знаете, что можете воспользоваться специфической новой функцией, и это имеет существенное значение.

Но это может быть потенциально полезно для Sandybridge, для поддержки AVX без AVX2, особенно для математики с 256-битной FP, но также для сохранения movdqa инструкции в целочисленном 128-битном векторном коде. Также для SSE4.x и popcnt. И нет проблем с частичным флагом в расширенной точности adc использование цикла dec/jnz,

Другие вопросы по тегам