GPU-programmeren
Hoe ontvangt bij CUDA het programma aan de CPU-kant de resultaten die een GPU-kernel (een functie gemarkeerd met __global__) heeft berekend?
- AVia de returnwaarde van de kernel, die de resultaten van alle threads samen naar de CPU terugstuurt
- BDe kernel schrijft zijn resultaten naar een array in het GPU-geheugen, en na afloop van de kernel kopieert de CPU-kant die array naar het CPU-geheugen (of leest ze unified memory)
- CHet programma aan de CPU-kant leest de waarden die elke thread met printf heeft afgedrukt als variabelen in
Antwoord en toelichting tonen
Antwoord: B. De kernel schrijft zijn resultaten naar een array in het GPU-geheugen, en na afloop van de kernel kopieert de CPU-kant die array naar het CPU-geheugen (of leest ze unified memory)
Een GPU-kernel wordt door veel threads tegelijk uitgevoerd en kan zijn resultaten dus niet met één returnwaarde teruggeven, en bij CUDA moet het type van de returnwaarde van een __global__-functie void zijn. De CPU-kant reserveert een array in het GPU-geheugen en geeft de pointer ervan als argument mee, en elke thread schrijft zijn resultaat naar het element waarvoor hij verantwoordelijk is. Omdat het starten van een kernel asynchroon is, kopieert de CPU-kant de array met cudaMemcpy of iets vergelijkbaars terug nadat de kernel klaar is (in dezelfde stream wacht de kopie op het einde van de voorgaande kernel). printf in een kernel is een debughulpmiddel om uitvoer te tonen, en het programma kan die waarden niet terug inlezen.