MSVC und ICC unterstützen beide die Eigen- schaften und _addcarryx_u64
._addcarry_u64 und _addcarryx_u64 mit MSVC und ICC
Entsprechend Intel's Intrinsic Guide und white paper sollten diese auf adcx
bzw. adox
abgebildet werden. Wenn man sich jedoch die erzeugte Baugruppe ansieht, wird deutlich, dass sie adc
bzw. adcx
zugeordnet werden und es gibt keine intrinsische, die auf adox
zuordnet.
Zusätzlich erzählt die Compiler AVX2 mit Ich bin mir nicht sicher, wie man ADX mit MSVC und ICC aktiviert./arch:AVX2
in MSVC oder -march=core-avx2
mit ICC auf Linux macht keinen Unterschied zu ermöglichen.
Die documentation for MSVC Listen _addcarryx_u64
mit der Technologie von ADX, während keine gelistete Technologie hat. Der Link in MSVCs Dokumentation für diese intrinsischen Komponenten geht jedoch direkt auf den Intel Intrinsic-Leitfaden zurück, der der eigenen Dokumentation von MSVC und der generierten Baugruppe widerspricht.
Daraus schließe ich, dass Intels Intrinsic Leitfaden und Whitepaper falsch sind.
Dies macht Sinn für MSVC Sinn es nicht erlaubt Inline-Montage sollte es eine Möglichkeit zur Verwendung adc
, die es mit tut.
Einer der großen Vorteile von adcx
und adox
ist, dass sie auf verschiedene Flags (carry CF
und Überlauf OF
), und dies ermöglicht es, zwei unabhängige parallele Übertrags-Ketten arbeiten. Da es jedoch keinen intrinsischen für adox
gibt, wie ist das möglich? Mit ICC kann mindestens eine Inline-Assembly verwendet werden, dies ist jedoch mit MSVC im 64-Bit-Modus nicht möglich.
Die Dokumentation von Microsoft und Intel (sowohl das Whitepaper als auch die Online-Anleitung) stimmen jetzt überein.
Die intrinsische Dokumentation sagt produziert nur adc
. Die _addcarryx_u64
intrinsische kann entweder adcx
oder adox
produzieren. Mit MSVC 2013 und 2015 produziert jedoch nur adcx
. ICC produziert beides.
ADOX und ADCX werden seit Broadwell eingeführt, also wie können Sie es mit AVX2 arbeiten lassen? –
@ LưuVĩnhPhúc, sehr guter Punkt. Wie aktivieren Sie 'ADX' mit MSVC und ICC? In jedem Fall erzeugte der Compiler adcx mit _addcarryx_u64 –
@ LưuVĩnhPhúc, ICC 13.0.1 (was ich von https://gcc.godbolt.org/ verwende) kam Ende 2012 heraus, also unterstützt es wahrscheinlich nicht 'ADX'. ICC ist jetzt bis zu 15.0.2. Ich denke, wenn ADX nicht aktiviert ist, verwenden sowohl MSVC als auch ICC 'adc' mit' _addcarry_u64'. Das würde erklären, was ich beobachte. Die Kompilierung sollte für '_addcarryx_u64' fehlschlagen, wenn' ADX' nicht aktiviert ist (und '_addcarryx_u64' soll meiner Meinung nach' adox' und nicht 'adcx' erzeugen). –