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?

  1. AVia de returnwaarde van de kernel, die de resultaten van alle threads samen naar de CPU terugstuurt
  2. 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)
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Verwante rekentools

Meer vragen over GPU-programmeren

  1. Op een GPU met een limiet van 1024 threads per thread block wordt een CUDA-kernel gestart met blockDim.x ingesteld op 2048. Wat gebeurt er in het algemeen?
  2. Stel dat een SM van een GPU één issue-eenheid heeft die per cyclus instructies van één warp kan uitgeven. Elke warp geeft herhaaldelijk 20 cycli instructies uit en wacht dan 400 cycli op het resultaat van een geheugenlading. Hoeveel warps zijn minstens nodig om ledige tijd door het wachten op het geheugen weg te werken (latentieverberging), als het wisselen tussen warps geen tijd kost?
  3. Welke uitspraak over het verschil in ontwerpfilosofie tussen CPU en GPU is juist?
  4. Welk kenmerk van werk dat op een GPU snel kan worden verwerkt is het meest passend?
  5. Welke bewerking wordt op een GPU waarschijnlijk inefficiënt uitgevoerd?

Vergelijkingen bij dit onderwerp