2013-01-22 10 views
8

Jestem zdezorientowany różnicą między zamierzonym użyciem wskaźników urządzeń a strukturami cudaArray. Czy ktoś mógłby wyjaśnić, dlaczego użyłbym jednego w porównaniu do drugiego? Moim podstawowym problemem jest to, że po przejrzeniu dokumentacji i przeczytaniu książki "CUDA z przykładu" nie rozumiem intencji projektantów API.cudaArray vs. wskaźnik urządzenia

Z tego, co widziałem, wydaje się, że do tekstur należy użyć cudaArray, a do bezpośredniego dostępu do pamięci należy użyć wskaźników. Wydaje się również, że tekstury 3D można tworzyć tylko za pomocą cudaArray. Czy wszystkie tekstury powinny być przydzielane za pomocą cudaArray? Liczne przykłady zdają się nie. Ponadto, dlaczego istnieje funkcja cudaMallocArray i cudaMallocArray3D, ale nie ma odpowiednika dla cudaMallocArray2D? I odwrotnie, istnieje cudaBindTexture i cudaBindTexture2D, ale nie cudaBindTexture3D?

Odpowiedz

16

cudaArray to nieprzezroczysty blok pamięci zoptymalizowany pod kątem wiązania z teksturami. Tekstury mogą wykorzystywać pamięć zapisaną w pliku space filling curve, która pozwala uzyskać lepszą częstość trafień w pamięci podręcznej tekstury dzięki lepszej przestrzennej lokalizacji 2D. Kopiowanie danych do cudaArray spowoduje, że zostanie sformatowany do takiej krzywej.

Przechowywanie danych w cudaArray jest techniką optymalizacji, która może zapewnić lepsze współczynniki trafień w pamięci podręcznej tekstur. Na wczesnych architekturach CUDA, cudaArray również nie może być dostępny przez jądro. Jednak architektura możliwości obliczeniowych> = 2,0 może uzyskać dostęp do macierzy za pośrednictwem powierzchni CUDA.

Ustalenie, czy należy użyć cudaArray lub zwykłego bufora w pamięci globalnej, sprowadza się do zamierzonych wzorców użycia i dostępu do pamięci. Będzie to zależało od konkretnego projektu.

cudaMallocArray() faktycznie przydziela tablicę 2D, więc myślę, że problem jest tylko niespójną nazwą. Może byłoby bardziej logicznie nazywać to cudaMallocArray2D().

Nie użyłem tekstur 3D. Mamy nadzieję, że ktoś odpowie i da nam znać, dlaczego nie ma potrzeby, aby cudaBindTexture3D().

1

Możesz użyć cudaBindTextureToArray, działa zarówno w 2D, jak i 3D.

Powiązane problemy