Ned Flanders schrieb:
Man darf also gespannt sein.
Ich habe die MKL Core Library mal genauer angesehen.
Sie unterscheidet offensichtlich nicht nur 6x zwischen AMD und Intel, sondern auch sehr fein zwischen CPU-Architekturen. So gibt es CPU-Einordnungsfunktionen für
- Atom mit SSE 4.2 (Funktion mkl_serv_cpuisatomssse4_2)
- Atom mit SSE 3 (Funktion mkl_serv_cpuisatomssse3)
- Bulldozer (Funktion mkl_serv_cpuisbulldozer)
- CLX (Keine Ahnung was das ist. Vielleich Cascade Lake X?) Funktion: mkl_serv_cpuisclx
- Barcelona (Funktion mkl_serv_cpuisbarcelona)
- KNM (No Clue) (Funktion mkl_serv_cpuisknm)
- SKL (Analog zu CLX womöglich Skylake) (Funktion mkl_serv_cpuisskl)
- Zen (Funktion mkl_serv_cpuiszen)
Die VendorID wird über 3 Vergleiche zu 756e6547, 6C65746E, 49656E69 geprüft.
756e6547 = Hex für "uneG"
6C65746E = Hex für "letn"
49656E69 = Hex für "Ieni"
Zusammen: Genu ineI ntel
Ich kann aber nicht erkennen ob das dazu benutzt wird AVX2 zu disablen.
Für mich sieht es im Moment wie ein einfacher Bug aus.
Diesen umgeht man übrigens am Besten mit der Environment-Variable MKL_ENABLE_INSTRUCTIONS, die man auf AVX2 setzt.
Damit wird der CPU-Typ ebenfalls auf 5 statt 4 gesetzt. Jede Erweiterungs-DLL bietet eine Funktion "dll_cpu_version". Der Rückgabewert wird bei AVX fix auf 4 gesetzt, bei AVX2 auf 5. Anhand dieses Werts lädt der Core die DLL oder eben auch nicht. Darum funktioniert der Wert 5 den man über die Env-Variable setzt.
Würde man beispielsweise den CPU-Typ auf 7 setzen, wäre das Äquivalent zu AVX512.
Leider habe ich weder Matlab noch Kenntnis darüber wie man die MKL benutzt.
Wenn man die Bytes des Vendor Strings ein wenig ändert, z.B. in FenuineIntel (
) dann sollten weder Intel noch AMD Prozessoren AVX(2) nutzen können und gleich langsam sein.