c + + - Windows multitasking bryder OpenCL perfomance

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver Qt-applikation med en simpel ide: Der er flere OpenCL-kompatible enheder, hver af dem får egen kontroltråd, som forbereder data, kører OpenCL-kernen og behandler resultater. OpenCL-kode er faktisk bitcoin mining kernel (for nu er det her en, men det betyder ikke noget). [5]


Når du arbejder med 2 GPU'er, er alt ok.
Når jeg bruger GPU og CPU er der et problem. CPU arbejder med rimelig hastighed, men GPU sænker ned til nulperformance.


Der er ikke noget sådant problem under Linux. Under Windows opfører poclbm på samme måde: Når du starter flere forekomster (1 til GPU, 1 for CPU), er GPU-perfomance 0.


Jeg er ikke sikker på, hvilken del af kode jeg skal skrive, så det vil være nyttigt. Jeg kan kun nævne, at tråden er et QThread barn med run() genimplementeret med en travl loop while( !\_stop ) { mineBitcoins(); }. Logikken af ​​den sløjfe er stort set kopieret fra poclbm s s BitcoinMiner::mining\_thread (her). [6]


I hvilken retning skal jeg grave? Tak.


UPD:
Jeg bruger QtOpenCL med AMD APP SDK. [7] [8]

Bedste reference


Hvis du kører kernen på CPU'en med fuld udnyttelse af alle kerner, kan trådene, der håndterer de andre enheder, muligvis ikke holde op med GPU'en, hvilket effektivt begrænser ydeevnen.


Prøv at reducere antallet af tråde, der kører kernen på CPU'en, f.eks. Hvis dit program kører på en quad-core med hyper-tråde, skal du begrænse trådene til 7.

Andre referencer 1


skal du ikke bruge værtsenheden som opencl-enhed. Hvis du virkelig har det, skal du begrænse mængden af ​​beregningsenheder (af CPU'en brugt som vært), der er tildelt CL ved at oprette en subdevice.

Andre referencer 2


Jeg ved ikke, om du bruger begge enheder i samme kontekst. Men hvis det er tilfældet, kan hukommelseskonsistensen inden for en kontekst være dit problem, og hvordan den forskellige OpenCL-implementering håndterer det.


OpenCL forsøger at mantain hukommelsen inde i en kontekst opdateret (i hvert fald i Windows), og kan medføre, at GPU'en kontinuerligt kopierer den hukommelse, der bruges tilbage til 'CPU-side'.


Jeg prøvede det længe siden og resulterede som i jeres tilfælde med '~=0 ydeevne i GPU'en'.