OpenCL Uitvoeringsmodel meerdere in de wachtrij geplaatste kernels

Ik was benieuwd hoe de GPU dezelfde kernel meerdere keren uitvoert.

Ik heb een kernel die honderden (mogelijk duizenden) keren achter elkaar in de wachtrij staat, en met behulp van de AMD App Profiler merkte ik dat het extreem snel clusters van kernels zou uitvoeren, dan als een uurwerk om de zoveel tijd dat een kernel zou "hangen" ( dat wil zeggen, neemt bestellingen van grotere omvang op om uit te voeren). Ik denk dat het elke 64e kernel is die blijft hangen.

Dit is raar omdat elke keer dat de kernel doorloopt exact dezelfde bewerkingen uitvoert met dezelfde lokale en globale grootte. Ik hergebruik zelfs dezelfde buffers.

Is er iets aan het uitvoeringsmodel dat ik mis (misschien andere programma's/het OS dat toegang heeft tot de GPU of de timingfrequentie van het GPU-geheugen). Ik test dit op een ATI HD5650-kaart onder Windows 7 (64-bit), met AMD App SDK 2.5 met in de wachtrij uitgevoerde uitvoering.

Als een kanttekening, als ik geen globale geheugentoegangen heb in mijn kernel (een nogal onpraktisch vooruitzicht), legt de profiler een gat in tussen de sneluitvoerende kernels en waar de langzame uitvoerende kernels voorheen waren, is nu een grote lege gat waar geen van mijn kernels worden uitgevoerd.

Als een vervolgvraag is er iets dat kan worden gedaan om dit op te lossen?

2

1 antwoord

Waarschijnlijk ziet u de effecten van het maximale aantal gelijktijdige taken van uw GPU. Elke taak die in wachtrij is geplaatst, is toegewezen aan een of meer multiprocessors, die vaak in staat zijn om honderden werkitems tegelijk uit te voeren - van dezelfde kernel, in wacht gezet in dezelfde aanroep. Misschien is wat u ziet de OpenCL runtime die wacht op een van de multiprocessors om vrij te maken. Dit heeft het meest direct te maken met het bezettingsprobleem - als het werkformaat de multiprocessor niet in bedrijf kan houden, door geheugenlatenties en alles, heeft het niet-actieve cycli. De limiet is hier afhankelijk van het aantal registers (lokaal of privégeheugen) dat uw kernel nodig heeft. Samenvattend wil je dat je kernel schrijft om op meerdere stukjes data te opereren, meer dan het vele keren in de wachtrij te zetten.

Bevatte je meting resultaten van de schijnbaar snelle executies?

2
toegevoegd