Chciałbym zrozumieć, jak poprawnie używać wywołania async_work_group_copy() w OpenCL. Rzućmy okiem na uproszczonym przykładzie.Jak korzystać z async_work_group_copy w OpenCL?
__kernel void test(__global float *x) {
__local xcopy[GROUP_SIZE];
int globalid = get_global_id(0);
int localid = get_local_id(0);
event_t e = async_work_group_copy(xcopy, x+globalid-localid, GROUP_SIZE, 0);
wait_group_events(1, &e);
}
Odniesienie http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/async_work_group_copy.html mówi „Wykonaj kopię asynchronicznej elementów num_elements gentype z src do dst Kopia asynchroniczny jest wykonywany przez wszystkich roboczych elementów w pracy grupowej i ta wbudowana funkcja musi więc zostać napotkana przez wszystkie elementy pracy w grupie roboczej wykonującej jądro z tymi samymi wartościami argumentów, w przeciwnym razie wyniki nie zostaną zdefiniowane. "
Ale to nie wyjaśnia moje pytania ...
Chciałbym wiedzieć, jeżeli następujące założenia są poprawne:
- Wezwanie do async_work_group_copy() musi być wykonany przez wszystkich prac -pis w grupie.
- Połączenie powinno być takie, że adres źródłowy jest identyczny dla wszystkich elementów roboczych i wskazuje na pierwszy element obszaru pamięci, który ma zostać skopiowany.
- Ponieważ mój adres źródłowy jest względny w oparciu o globalny identyfikator elementu pracy pierwszego elementu roboczego w grupie roboczej. Więc muszę odjąć lokalny identyfikator, aby adres był taki sam dla wszystkich elementów pracy ...
- Czy trzeci parametr to naprawdę liczba elementów (nie rozmiar w bajtach)?
pytania Bonus:
a. Czy mogę po prostu użyć bariery (CLK_LOCAL_MEM_FENCE) zamiast wait_group_events() i zignorować zwracaną wartość? Jeśli tak, czy byłoby to prawdopodobnie szybsze?
b. Czy kopia lokalna ma sens również w przypadku przetwarzania na procesorach, czy jest to obciążenie ogólne, ponieważ mimo to współużytkują pamięć podręczną?
Pozdrawiam, Stefan
Dziękujemy! Odnośnie 3. get_group_id() - dobra wskazówka, ale w tym specjalnym wymagałoby mnożenia przez wielkość grupy roboczej, nawet dla znanych rozmiarów grup roboczych wielkości 2^n można to przyspieszyć o przesunięcie w lewo. Jednak w innych przypadkach może to być bardzo przydatne wiedzieć, że również istnieje! Dziękujemy za podzielenie się wrażeniami! --- Stefan – SDwarfs
Mam pytanie dotyczące twojej odpowiedzi na "a": O ile mi wiadomo, kopiowanie powinno być przetwarzane przez co najmniej jedną pozycję pracy. Ponieważ wszystkie inne węzły w grupie roboczej potrzebują danych lokalnych, aby były gotowe, to ma sens dla mnie, że wszyscy czekają, aż dane będą dostępne. Oczekiwanie na wydarzenie powinno dokładnie to zrobić. Ale bariera powinna zapewnić to samo, ponieważ wszystkie inne elementy pracy grupy będą czekać na elementy robocze, które są zaangażowane w proces kopiowania. Bariera może być prostsza (najwyżej 1 bariera na grupę roboczą, a nie więcej niż 1 wydarzenie na jedno zadanie), a przez to szybsza. – SDwarfs
re: 'a' ... W przyszłości może istnieć urządzenie, które będzie obsługiwać asynchroniczną kopię bez używania jakichkolwiek elementów pracy. bariera zadziałałaby, gdyby podczas kopiowania zatrzymano przynajmniej jeden przedmiot pracy. – mfa