meiste Zeit ein Zweig in einer CUDA oder OpenCL Programm erforderlich ist, wie:CUDA/openCL; Umschreiben Verzweigungen als nicht-verzweigende Ausdruck
for (int i=0; i<width; i++)
{
if(i % threadIdx.x == 0)
quantity += i*i;
}
kann der Code immer (oder zumindest die meiste Zeit) umgeschrieben werden in nicht-Verzweigung Stil:
for (int i=0; i<width; i++)
{
quantity += i*i* (i % threadIdx.x != 0);
}
scheint der Kompromiss in einer einzigen Kette Schlitz wird entweder läuft im Vergleich zu mehr Berechnungen auf all Threads zu tun (im zweiten Fall wird die Summe ausgeführt wird, immer, nur, dass manchmal der Wert Null)
Unter der Annahme, dass Verzweigungsoperationen mehrere Warp-Slots für jeden möglichen Zweig benötigen, würde man erwarten, dass der zweite konsistent besser ist als der erste. Nun ist meine Frage; Kann ich mich auf den Compiler verlassen, um 1) in 2) zu optimieren, wann immer es Sinn macht, oder gibt es keine breit anwendbaren Kriterien, was bedeutet, dass man ohne Probieren nicht generell entscheiden kann, welches besser ist?
Welche Reihenfolge ist Breite? Wenn Sie wissen, dass die Breite ziemlich groß ist, sollten Sie nicht durch eine for-Schleife gehen, um dies zu tun, da Sie wissen, welche Werte Sie verwenden werden. 'While (i
3Pi