Вопрос по sse, x86, intrinsics, sse4 – В чем разница между __popcnt () и _mm_popcnt_u32 ()?

9

MS Visual C ++ поддерживает 2 варианта инструкции popcnt на процессорах с SSE4.2:

  1. __popcnt()
  2. _mm_popcnt_u32()

Единственное отличие, которое я обнаружил, заключалось в том, что документы для__popcnt() помечены как «Специфичные для Microsoft» и_mm_popcnt_u32() кажется внутренним именем команды (Не-MS-специфический).

Разве это единственная разница, где MS__popcnt() просто звонит в HW_mm_popcnt_u32()?

Ваш Ответ

1   ответ
11

These are two different intrinsic names for the same machine instruction, thanks to Intel and AMD.  Инструкция одинакова для всех процессоров, которые ее поддерживают, и различные встроенные функции также не имеют различий в C или C ++.

Встроенные функции __popcnt * () предназначены для инструкций AMD по расширенной обработке битов (ABM). Увидетьhttp://blogs.amd.com/developer/2007/09/26/barcelona-processor-feature-advanced-bit-manipulation-abm/

Встроенные функции _mm_popcnt_u * () предназначены для реализации Intel, которая сама по себе не является частью SSE4.2, но была реализована примерно в то же время. Увидетьhttp://en.wikipedia.org/wiki/SSE4#POPCNT_and_LZCNT

В соответствии сhttps://www.chessprogramming.org/Population_Count обе реализации являются двоично-совместимыми, несмотря на их различные внутренние имена.

Intel & APOS; sруководство по архитектуре говорится, что:

Before an application attempts to use the POPCNT instruction, it must check that the processor supports SSE4.2 (if CPUID.01H:ECX.SSE4_2[bit 20] = 1) and POPCNT (if CPUID.01H:ECX.POPCNT[bit 23] = 1).

AMD & APOS; sРуководство по программированию архитектуры AMD64, том 3: Общие задачи и системные инструкции говорит

Support for the POPCNT instruction is indicated by ECX bit 23 (POPCNT) as returned by CPUID function 0000_0001h. Software MUST check the CPUID bit once per program or library initialization before using the POPCNT instruction, or inconsistent behavior may result.

Я не вижу никакой причины, по которой popcnt требует наличия SSE4.2, поэтому я считаю, что проверки 23-го бита ECX достаточно для определения присутствия popcnt.

AMD Barcelona, первый процессор AMD, имеющий popcnt, не полностью реализовал SSE4, поэтому вполне возможно, что в руководстве по архитектуре Intel предлагается метод определения присутствия, который будет работать на процессорах Intel и работать даже на квалифицированных процессорах AMD. ,

Intel's current документация дляpopcnt в их наборе инструкций vol.2 набор только говорит#UD If CPUID.01H:ECX.POPCNT [Bit 23] = 0 поэтому антиконкурентное предложение, которое приведет к тому, что программное обеспечение не будет использовать преимуществаpopcnt на некоторых процессорах AMD без SSE4.2 ушел.

Отличный ответ. Благодарю. Adi Shavit
Так есть ли разница в том, когда использовать каждый в программном обеспечении? Нужно ли проверять другой бит cpuid? Если я хочу написать агностик Intel / AMD, который по-прежнему использует команду, что мне делать? Adi Shavit
Intel Insn Ref запись дляpopcnt в настоящее время просто говорит#UD If CPUID.01H:ECX.POPCNT [Bit 23] = 0таким образом, бесполезного / антиконкурентного предложения по проверке SSE4.2 там нет.
Не похоже, что они разные или несовместимые. Смотрите мой отредактированный ответ выше.

Похожие вопросы