MS Visual C ++ unterstützt zwei Varianten der popcnt-Anweisung auf CPUs mit SSE4.2:
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?
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>
Tags und Links sse intrinsics