2012-09-20 3 views
6

aufgerufen wird Ich versuche, einen Kernel auf der GPU auszuführen und zusätzliche Berechnungen auf dem Host (CPU) durchzuführen. Ich sehe diesen Effekt:OpenCL-Kernel-Ausführung wird nicht gestartet, bis clFinish oder clWaitForEvents

nur der Kernel benötigt etwa 2000 ms:

clEnqueueNDRangeKernel ...

clFinish (oder clWaitForEvents habe ich versucht, beide)

I simuliert zusätzliche Rechen auf der CPU mit Schlaf (10):

clEnqueueNDRangeKernel ...

Schlaf (10);

clFinish (oder clWaitForEvents)

In der Theorie der Kernel auf GPU und nach dem 10 Sekunden Schlaf der Kernel fertig sein soll ausgeführt werden soll. Aber Zeitmessung sagte, dass alles 12000ms anstelle von 10000 benötigt.

Ruft clFinish oder clWaitForEvents den Kernel zum Starten auf oder habe ich etwas übersehen?

Ich benutze eine AMD Fusion CPU/GPU und Linux.

Vielen Dank.

+0

Wie groß sind Ihre Daten? Ist es möglich, dass 2000 ms die Zeit darstellen, die benötigt wird, um Ihre Daten von der GPU auf die CPU zu übertragen? – user1202136

+0

Die Daten liegen unter 1 MB. Aber es sollte nicht in meiner Messung sein. Ich kopiere Daten auf das Gerät, beginne zu messen, führe den Kernel aus + sleep + clFinish, höre auf zu messen, kopiere Daten zurück zum Host – Tomas

+0

Wie genau misst du? Kopieren Sie Ihre Daten synchron auf das Gerät? – reima

Antwort

2

clFinish() garantiert nur, dass der Kernel beendet ist, wenn das Programm vor dieser Funktion geht, aber wenn der Kernel ausführen gestartet wird, ist nicht sicher. clFlush() kann garantieren, dass der Kernel auf dem Gerät gestartet wurde, während das Programm mit dem clFlush() -Satz fortfährt, aber wann es fertig ist, ist nicht sicher, also benötigen Sie clFlush(), um sicherzustellen, dass der Kernel auf dem Gerät gestartet wurde Die Zeit (2000 ms) kann vom Ruhezustand (10000 ms) am Host-Ende überlappt werden. Ich hoffe, es kann hilfreich sein.

Verwandte Themen