Was ist der Unterschied zwischen __popcnt () und _mm_popcnt_u32 ()?

8

MS Visual C ++ unterstützt zwei Varianten der popcnt-Anweisung auf CPUs mit SSE4.2:

  1. __popcnt()
  2. _mm_popcnt_u32()

Der einzige Unterschied, den ich gefunden habe, war, dass die Dokumente für __popcnt() als "Microsoft Specific" markiert sind und _mm_popcnt_u32() scheint ein intrinsischer Befehlsname zu sein (nicht MS-spezifisch).

Ist das der einzige Unterschied, wo die MS __popcnt() nur die HW _mm_popcnt_u32() aufruft?

    
Adi Shavit 20.06.2012, 06:32
quelle

1 Antwort

11

Die eingebauten __popcnt * () sind für AMDs Advanced Bit Manipulation (ABM) -Anweisungen. Siehe Ссылка

Die _mm_popcnt_u * () - Intrinsics sind für die Intel-Implementierung, die per se nicht Teil von SSE4.2 sind, aber ungefähr zur selben Zeit implementiert wurden. Siehe Ссылка

Laut Ссылка sind beide Implementierungen trotz ihrer unterschiedlichen Eigennamen binärkompatibel.

In Intels Architekturhandbuch heißt es:

  

Bevor eine Anwendung versucht, die POPCNT-Anweisung zu verwenden, muss sie überprüfen, dass die   Prozessor unterstützt SSE4.2 (wenn CPUID.01H: ECX.SESE4_2 [Bit 20] = 1) und POPCNT (wenn   CPUID.01H: ECX.POPCNT [Bit 23] = 1).

AMDs AMD64-Architektur-Programmierhandbuch Band 3: Allgemeine und Systemanweisungen sagt

  

Die Unterstützung für den POPCNT-Befehl wird durch das ECX-Bit 23 (POPCNT) angezeigt, das von der CPUID zurückgegeben wird   Funktion 0000_0001h. Die Software MUSS das CPUID-Bit einmal pro Programm oder Bibliotheksinitialisierung überprüfen   Bevor Sie die POPCNT-Anweisung verwenden, kann dies zu einem inkonsistenten Verhalten führen.

Ich kann keinen Grund sehen, warum popcnt das Vorhandensein von SSE4.2 erfordert, also denke ich, dass das Überprüfen von Bit 23 von ECX ausreicht, um die Anwesenheit von popcnt festzustellen.

AMDs Barcelona, ​​die erste AMD-CPU, hat SSE4 nicht vollständig implementiert, daher ist es möglich, dass Intels Architekturhandbuch eine Methode zur Bestimmung der Präsenz vorschlägt, die auf Intel-CPUs funktioniert und sogar auf qualifizierten AMD-CPUs fehlschlägt. p>     

mattst88 21.06.2012, 02:07
quelle

Tags und Links