2012-09-20 11 views
6

Próbuję uruchomić jądro na GPU i wykonać dodatkowe obliczenia na hoście (CPU). Widzę ten efekt:Wykonywanie jądra OpenCL nie rozpoczyna się, dopóki nie zostanie wywołany clFinish lub clWaitForEvents

tylko jądro potrzebuje około 2000 MS:

clEnqueueNDRangeKernel ...

clFinish (lub clWaitForEvents, próbowałem obu)

I symulowane dodatkowych obliczeń na procesorze ze snem (10):

clEnqueueNDRangeKernel ...

sleep (10);

clFinish (lub clWaitForEvents)

Teoretycznie jądro powinno uruchomić na GPU i po śnie 10 sek jądro powinno być zakończone. Ale pomiar czasu powiedział, że to wszystko wymaga 12000ms zamiast 10000.

Czy clFinish lub clWaitForEvents wywołają jądro, aby uruchomić czy czy coś przegapiłem?

Używam procesora/procesora AMD Fusion i Linuksa AMD.

Wielkie dzięki.

+0

Jak duże są Twoje dane? Czy to możliwe, że 2000 ms reprezentuje czas potrzebny na przesłanie danych z procesora graficznego do procesora? – user1202136

+0

Dane mają mniej niż 1 MB. Ale nie powinno to być w moim pomiarze. Skopiowuję dane do urządzenia, zaczynam odmierzanie, wykonuję jądro + sleep + clFinish, zatrzymuję pomiar, kopiuję dane z powrotem do hosta – Tomas

+0

Jak dokładnie mierzysz? Czy synchronizujesz swoje dane z urządzeniem? – reima

Odpowiedz

2

clFinish() gwarantuje jedynie, że jądro zostało zakończone, gdy program przechodzi do przodu tej funkcji, ale gdy jądro zostanie uruchomiona do wykonania nie jest pewny. clFlush() może zagwarantować, że jądro zostało uruchomione na urządzeniu, podczas gdy program przechodzi dalej naprzód clFlush() zdanie, ale kiedy zostanie zakończone nie jest pewne, więc potrzebujesz clFlush(), aby upewnić się, że jądro zostało uruchomione na urządzeniu, a następnie czas (2000ms) może pokrywać się z czasem snu (10000ms) na końcu hosta. Mam nadzieję, że to może być pomocne.

Powiązane problemy