W OpenCL rozumiem, że można użyć funkcji barrier()
do synchronizowania wątków w grupie roboczej. Robię (ogólnie) rozumiem, do czego służą i kiedy z nich korzystać. Jestem również świadomy, że wszystkie wątki w grupie roboczej muszą trafić w barierę, w przeciwnym razie wystąpią problemy. Jednak za każdym razem, gdy próbowałem dotychczas korzystać z barier, wydaje mi się, że albo zawiesza się sterownik wideo, albo pojawia się komunikat o błędzie dostępu do nieprawidłowej pamięci. Widziałem to na 2 różnych kartach wideo (1 ATI, 1 NVIDIA).Bariery w OpenCL
Więc moje pytania to:
- Każdy pomysł, dlaczego tak się stało?
- Jaka jest różnica między
barrier(CLK_LOCAL_MEM_FENCE)
abarrier(CLK_GLOBAL_MEM_FENCE)
? Czytałem dokumentację, ale nie było dla mnie jasne. - Czy istnieje ogólna zasada dotycząca stosowania
barrier(CLK_LOCAL_MEM_FENCE)
kontrabarrier(CLK_GLOBAL_MEM_FENCE)
? - Czy jest jakiś czas, że wywołanie
barrier()
z nieprawidłowym typem parametru może spowodować błąd?
Oczywiście CLK_GLOBAL_MEM_FENCE często mniejsza niż CLK_LOCAL_MEM_FENCE. Powodem jest, że wszystkie wątki wewnątrz bloku będą musiały poczekać na zakończenie dostępu do pamięci. A oczekiwanie, że dostęp do pamięci globalnej zostanie zakończony, jest znacznie droższe niż dostęp do pamięci lokalnej. Oczywiście nie zawsze jest to prawdą, zależy to od wzorców dostępu (Fermi ma teraz pamięć podręczną, co oznacza, że globalne dostępy mogą być buforowane na L1, które ma podobne opóźnienie z pamięcią wspólną), liczba globalnych/lokalnych dostępów do pamięci w jądrze obłożenie, konflikty bankowe, koalescencje itp. – Zk1001