Podejrzewam, że masz pewne nieporozumienia na temat CUDA i jak z niego korzystać, zwłaszcza, że odnoszą się do "procesu", gdy w terminologii CUDA nie ma czegoś takiego.
W przypadku większości aplikacji CUDA istnieją dwie ważne rzeczy, aby uzyskać dobrą wydajność: optymalizacja dostępu do pamięci i upewnienie się, że każdy "aktywny" wątek CUDA w osnowie wykonuje tę samą operację w tym samym czasie, co inne aktywne wątki w osnowie. Oba te dźwięki brzmią, jakby były ważne dla twojej aplikacji.
Aby zoptymalizować dostęp do pamięci, należy się upewnić, że odczyty z pamięci globalnej i zapisy do pamięci globalnej są połączone. Możesz przeczytać więcej na ten temat w przewodniku programowania CUDA, ale zasadniczo oznacza to, że sąsiednie wątki w połowie przeskoku muszą czytać lub zapisywać w sąsiednich lokalizacjach pamięci. Każdy wątek powinien jednocześnie czytać lub zapisywać 4, 8 lub 16 bajtów.
Jeśli wzorzec dostępu do pamięci jest losowy, może być konieczne użycie pamięci tekstury. Kiedy chcesz odwołać się do pamięci, która została odczytana przez inne wątki w bloku, powinieneś skorzystać z pamięci współdzielonej.
W twoim przypadku nie jestem pewien, jakie są twoje dane wejściowe, ale powinieneś przynajmniej upewnić się, że twoje zapisy są połączone. Prawdopodobnie będziesz musiał zainwestować trochę trywialne wysiłki, aby twoje lektury działały sprawnie.
Dla drugiej części, poleciłbym, aby każdy wątek CUDA przetwarzał jeden piksel na wyjściowym obrazie. Przy tej strategii powinieneś uważać na pętle w jądrze, które będą działać dłużej lub krócej w zależności od danych dotyczących wątków. Każdy wątek w twoich osnach powinien wykonać tę samą liczbę kroków w tej samej kolejności. Jedynym wyjątkiem jest to, że nie ma rzeczywistej kary za wydajność, ponieważ niektóre wątki w osnowie nie wykonują żadnej operacji, podczas gdy pozostałe wątki wykonują tę samą operację łącznie.
Dlatego zaleca się, aby każdy wątek sprawdzał, czy jego piksel znajduje się w danym trójkącie. Jeśli nie, nie powinien nic robić. Jeśli tak, powinien obliczyć wyjściowy kolor dla tego piksela.
Ponadto, zdecydowanie polecam więcej informacji na temat CUDA, ponieważ wygląda na to, że skaczę w głęboki kraniec bez dobrego zrozumienia niektórych podstawowych zasad.
Przepraszam za mój język, angielski nie jest moim ojczystym. Więc jaka jest właściwa terminologia do przetwarzania na kartach graficznych? Cóż, myślę, że rozumiem CUDA całkiem dobrze, ale tak, mam brak wiedzy w algorytmach równoległych. Moje wejście to zbiór wierzchołków w przestrzeni obcinania i musiałem narysować trójkąty. Myślę, że algorytm, w którym każdy piksel powinien sprawdzać każdy trójkąt, nie byłby optymalny. – qba
Unikanie każdego piksela sprawdzania każdego trójkąta można wykonać poprzez podział trójkątów za pomocą BVH, KD-Tree lub R-Tree. – whatnick