Cześć, mam do was takie pytanie z zakresu technologii CUDA.
Najpierw poproszę o weryfikację wniosków, do których doszedłem dot. ilości wątków/bloków. Załóżmy, że mam kartę GTX 750 Ti, która ma 640 rdzeni.
Z tego co gdzieś doczytałem najoptymalniej tworzyć wielokrotność 32 wątków w każdym bloku (Warp).
Mając jednak 640 rdzeni wydaje mi się, że najlepiej tworzyć 640 bloków.
Innymi słowy, jeśli ilość obliczeń na to pozwala, najlepiej tworzyć 640 bloków po 32 wątki (lub ew. ich wielokrotność) (?).
Pomijam tutaj kwestię pamięci współdzielonej wspólnej tylko dla wątków w danym bloku.
Przy okazji pytanie: czy jest sens tworzyć więcej bloków niż posiada się rdzeni na karcie? Czy nie lepiej zrobić pętlę wewnątrz funkcji urządzenia, by wykorzystywać maksymalną ilość bloków a jednocześnie nie wymuszać na karcie, by to ona organizowała które rdzenie i kiedy mają pracować?
Kolejna sprawa to:
Na karcie graficznej istnieje kilka rodzajów pamięci, tj. (kolejność wg szybkości dostępu):
- Rejestry (brak dostępu)
- Pamięć współdzielona (wspólna dla wszystkich wątków w bloku)
- Pamięć lokalna (dostępna dla pojedynczego wątku)
- Pamięć Texturowa (?)
- Pamięć globalna
Co do pamięci współdzielonej to zdaje się, że każdy rdzeń ma swoją podręczną pamięć (tzn. ma tą pamięć fizycznie - w karcie), więc jak tworzymy blok (wykonywany przez poszczególny rdzeń) w którym jest wiele wątków to wszystkie mają do niej dostęp.
Mam jednak dylemat jak interpretować pamięć lokalną, gdyż każdy wątek może dysponować aż (/tylko) 512 KB. Zakładając jednak, że zrobię tak, jak napisałem wcześniej tj. utworzę 640 bloków a każdy blok składać się będzie z 32 wątków to wychodzi mi, że będę mógł korzystać z: 512 KB x 640 x 32 ~10GB(?!?) pamięci. Mam więc pytanie: skąd jest ta pamięć (czy rezerwując taką pamięć ograniczam sobie pamięć globalną?). Jak należy to interpretować?
Co jeśli na karcie mam tylko 2 GB pamięci a będę wykorzystywał np. 5GB biorąc pod uwagę powyższe obliczenia?
Z góry dzięki za odpowiedzi.