GPU-programmeren
Wat is het belangrijkste doel van het laten lopen via shared memory bij het transponeren van een grote matrix op een GPU (b[j][i] = a[i][j])?
- AHet aantal transpositieberekeningen halveren
- BDe waarden van de matrix in shared memory herordenen, zodat ze van klein naar groot staan
- CEen tile met coalesced toegang in de rijrichting laden, de richting in shared memory omdraaien en ook het schrijven coalesced maken
Antwoord en toelichting tonen
Antwoord: C. Een tile met coalesced toegang in de rijrichting laden, de richting in shared memory omdraaien en ook het schrijven coalesced maken
Bij een naïeve implementatie is het lezen van a in de rijrichting coalesced, maar het schrijven naar b gebeurt in de kolomrichting, met verspreide adressen en dus traag. Als de tile eerst in shared memory wordt geladen en daarna met verwisselde verantwoordelijkheid van de threads wordt uitgelezen, kunnen zowel het lezen als het schrijven in global memory op opeenvolgende adressen plaatsvinden. Daarbij wordt ook de maatregel gecombineerd om één kolom extra te reserveren, zodat bij uitlezen in de kolomrichting van shared memory geen bank conflicts optreden.