Kreuz- und Skalarprodukt, welcher Operator?
-
hustbaer schrieb:
dot schrieb:
hustbaer schrieb:
Und durchgängig auf SIMD arbeiten... können aktuelle Compiler keinen Code erzeugen der SSE2 auch für einzelne floats verwendet? Ich dachte nämlich dass die das können, und dann wäre es ziemlich schnuppe ... bzw. sogar besser wenn man einzelne floats nimmt wo man nur einzelne floats braucht.
Unter x64 kann man mehr oder weniger davon ausgehen, dass der Compiler auch für skalare Operationen SSE verwendet. Unter x86 nicht unbedingt, zumindest MSVC scheint mir dort immer noch zumindest meistens die FPU zu verwenden, vermutlich vor allem aus Kompatibilitätsgründen.
MSVC verwendet im x86 Mode SSE2 nur wenn man es ihm erlaubt. Hast du bei deinen Experimenten auch den nötigen Switch mitgegeben? Wäre dann schade, aber OK, wegen eines einzigen Compilers werd ich jetzt auch nicht Code schreiben der komisch riecht und auf anderen Compilern im Falle des Falles sogar langsamer ist.
MSVC < VS 2012 generiert auch mit /arch:SSE meiner Erfahrung nach sehr oft FPU Code und offenbar bin ich mit dieser Beobachtung nicht allein: http://www.zfx.info/viewtopic.php?f=4&t=2410&p=31678&hilit=arch%3ASSE#p31678
Es sieht so aus, als ob sich mit VS 2012 da was geändert hätte, vermutlich im Zuge der Einführung des Vectorizers...hustbaer schrieb:
hustbaer schrieb:
Und auf GPUs ist es ja, soweit ich weiss, auch mittlerweile zur Sünde geworden mehr Komponenten zu verwenden als man eigentlich braucht. Skalare Shader Units und so...
Oder hab' ich da was falsch mitbekommen?Auf NVIDIA Hardware >= GeForce 8 prinzipiell wohl ja, bei ATI schaut's dagegen anders aus, die verwenden afaik zumindest bis vor kurzem noch VLIW Vektorhardware, wobei iirc zumindest eine ihrer allerletzten Architekturen auch eher in die skalare Richtung ging...
Auch interessant, danke.
Wobei... wenn es auf NIVEA Karten pöse ist, dann ist es pöse und aus
(Und nicht pöse zu sein wird einem auf ATI Karten vermutlich auch keine Probleme machen, oder etwa doch?)Naja, ich denke, es wäre wohl sinnvoller, Code einfach vektoriell zu halten, wo es Sinn macht and ansonsten skalar. Vektorieller Code ist sicherlich leichter in skalaren Code zu transformieren als umgekehrt...
-
fuer msvc sind float-sse und intrinsic-sse register unterschiedliche dinge, meistens sehe ich store und loads der daten in ein und dasselbe register, nur weil es quasi einen context-switch im compiler gab.
erstaunlicherweise erkannte der compiler manchmal dass ich von einer vector operation nur ein splat gemacht habe und auf SIMD 4mal dasselbe berechnete und hat das eigenwillig auf float umgebogen, weil es theoretische weniger cycles braucht, aber bei vielen cpus das umschaltet doch penalty ist.