GPU-programmeren
In CUDA wordt __syncthreads() binnen 'if (threadIdx.x < 16)' geplaatst, zodat alleen een deel van de threads er doorheen komt. Wat kan er juist gebeuren?
- AAlleen de 16 threads synchroniseren en het werkt correct
- BOmdat de andere threads nooit aankomen, kan het block vastlopen of wordt het resultaat onbepaald
- C__syncthreads() wordt automatisch genegeerd, dus er gebeurt niets
Antwoord en toelichting tonen
Antwoord: B. Omdat de andere threads nooit aankomen, kan het block vastlopen of wordt het resultaat onbepaald
__syncthreads() wacht op de aankomst van alle threads van het block, dus als het binnen een sprong staat die slechts een deel van de threads passeert, zijn er threads die nooit komen. Het gedrag is volgens de specificatie niet gedefinieerd; in de praktijk loopt het vast of is het resultaat verkeerd, ook als het toevallig doorloopt. Als basisregel wordt synchronisatie buiten sprongen geplaatst, op een plaats die alle threads zeker passeren.