GPU-programmeren
Zowel (1) als (2) hierboven laat de helft van de threads A en de rest B uitvoeren. Welke uitleg is juist met betrekking tot de efficiëntie van de warps (uitgaande van 32 threads per warp)?
if (threadIdx.x % 2 == 0) A(); else B(); // (1)
if ((threadIdx.x / 32) % 2 == 0) A(); else B(); // (2)
- A(1) is efficiënter, omdat de sprongen gelijk zijn
- BBij (1) splitsen de sprongen zich in alle warps, maar bij (2) zijn ze per warp gelijk, dus (2) is efficiënter
- CBeide zijn precies even efficiënt
Antwoord en toelichting tonen
Antwoord: B. Bij (1) splitsen de sprongen zich in alle warps, maar bij (2) zijn ze per warp gelijk, dus (2) is efficiënter
Bij (1) wordt gesplitst tussen even en oneven threads, dus in elke warp zitten threads van zowel de A-zijde als de B-zijde en voeren alle warps A en B na elkaar uit. Bij (2) wordt gesplitst op de waarde van het threadnummer gedeeld door 32, dus alle 32 threads van een warp staan aan dezelfde kant en voert elke warp alleen A of alleen B uit. Ook voor hetzelfde werk verdwijnt divergence als de voorwaarde per warp gelijk wordt gemaakt.