GPU-programmeren

Als zoals hierboven elke 32 elementen van de array wordt gelezen, waarbij i het nummer van elke thread is, is dat trager dan het lezen van a[i]. Wat is de belangrijkste reden?

float x = a[i * 32];
  1. AOmdat de adressen van naburige threads 128 bytes uit elkaar liggen, is de toegang niet gecoalesced en leest elke thread een ander geheugenblok
  2. BOmdat de vermenigvuldiging rekentijd kost
  3. COmdat waarden niet juist worden gelezen als elke 32 elementen wordt gelezen
Antwoord en toelichting tonen

Antwoord: A. Omdat de adressen van naburige threads 128 bytes uit elkaar liggen, is de toegang niet gecoalesced en leest elke thread een ander geheugenblok

Een float is 4 bytes, dus bij a[i*32] liggen de adressen van naburige threads 128 bytes uit elkaar. De 32 threads van een warp lezen 32 afzonderlijke blokken en gebruiken van elk blok slechts 4 bytes. Bij a[i] volstaat één blok van 128 bytes voor de 32 threads, zodat de hoeveelheid aangevoerde data tientallen keren verschilt. Bij een tweedimensionale array is de basisregel het threadnummer te laten overeenkomen met de binnenste index (opeenvolgende adressen).

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Welke rangschikking is voordelig voor coalesced geheugentoegang wanneer data van deeltjes met posities x, y en z op een GPU wordt verwerkt?
  2. Welke uitspraak over de kenmerken van CUDA shared memory is juist?
  3. Welke uitspraak over de werking van __syncthreads() in CUDA is juist?
  4. 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?
  5. Welke uitspraak over bank conflicts van CUDA shared memory is juist?

Vergelijkingen bij dit onderwerp