Fragen? Antworten! Siehe auch: Alternativlos
gcc -march=native -dM -E - < /dev/nullDann gibt gcc alle vordefinierten Präprozessorsymbole aus. Besonders hilfreich ist das mit Crosscompilern oder mit -march=native, wenn man vergessen hat, dass das gcc-Symbol für "die CPU kann AES-NI" __AES__ hieß.
Bei der Gelegenheit fiel mir auch gerade auf, dass mein Haswell-Arbeitsgerät die SHA-Instruktionen gar nicht beherrscht. Ich dachte die sind seit Ewigkeiten überall drin. AMD hat die seit Zen. Die Unterschiede zwischen den Implementationen sind übrigens echt bemerkenswert. Hier ist ein sha1sum über eine 80MB-Datei:
libtomcrypt: e7d22debfee07c9da1c85114f14cb720956b7fca (313.4M cycles)Das ist auf meinem Atom-Reisenotebook mit SHA-Spezialinstruktionen. Hier sind die Timings für SHA2-256 auf die Datei auf demselben Notebook:
openssl: e7d22debfee07c9da1c85114f14cb720956b7fca (58.1M cycles)
botan: e7d22debfee07c9da1c85114f14cb720956b7fca (65.0M cycles)
gcrypt: e7d22debfee07c9da1c85114f14cb720956b7fca (190.2M cycles)
libtomcrypt: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (673.6M cycles)Man sieht, dass das schon einen Grund hat, wieso OpenSSL häufig verwendet wird.
openssl: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (139.6M cycles)
botan: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (137.6M cycles)
gcrypt: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (432.7M cycles)
vanilla: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (814.7M cycles)
Zum Vergleich die Timings von dem Haswell-Gerät:
libtomcrypt: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (844.8M cycles)Da sieht man, wessen Implementation die Extra-Meile gegangen ist.
openssl: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (457.1M cycles)
botan: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (686.1M cycles)
gcrypt: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (506.7M cycles)
vanilla: cd80cbb9adb86378eee193cf73e0c660aa2abf460cc85e1ef0611437d18cddec (1.0G cycles)
Das Präprozessor-Symbol für SHA-Instruktionen heißt übrigens __SHA__. Die Messgröße ist die Differenz im Cycle Counter für einen Hash-Lauf über die gesamte Datei. Vanilla ist eine unoptimierte C-Implementation aus dem Standard. Der Cycle Counter ist die feinste Messeinheit, die CPUs so haben. Eine 1 GHz CPU hat eine Milliarde Cycles pro Sekunde.