2011-12-05 15 views
5

Używam CUDA/Thrust/CUDPP. Jak rozumiem, w kompresji Stream niektóre elementy w tablicy są oznaczone jako nieprawidłowe, a następnie "usunięte".Kompresja strumienia CUDA: zrozumienie pojęcia

Co tak naprawdę oznacza "usunięcie"? Załóżmy oryginalną tablicę A i ma długość 6. Jeżeli 2 elementy są nieważne (przez co stan możemy dostarczyć), a następnie

  1. Czy system tworzenia nowy tablicę o rozmiarze 4 w GPU-pamięci do zapamiętywania prawidłowe elementy, aby uzyskać końcowy wynik?

  2. Czy fizycznie usuwa z pamięci nieprawidłowe elementy i zmniejsza oryginalną tablicę? A do rozmiaru 4 zachowującego tylko ważne elementy?

W obu przypadkach nie oznacza to, że dynamiczny przydział pamięci dzieje się pod maską? Ale słyszałem, że dynamiczne przydzielanie pamięci nie jest możliwe w świecie CUDA.

+2

Jest jeszcze jedna możliwość, że rozmiar alokacji pamięci się nie zmienia, a pierwsze 4 elementy są poprawne, ostatnie 2 są niezdefiniowane. Ale tak naprawdę to pytanie dotyczy kwestii związanych z implementacją, a kto mówi, że CUDPP lub ciąg działa tak samo? – talonmies

+0

ArrayFire to lepsza/łatwiejsza opcja niż Thrust, a także darmowa, przynajmniej dla pojedynczego użycia GPU. http://accelereyes.com/arrayfire – arrayfire

Odpowiedz

4

Po pierwsze, dynamiczny przydział pamięci jest możliwy w CUDA na Compute Capability 2.0 i wyższych urządzeniach. Biblioteka uruchomieniowa CUDA obsługuje funkcje malloc/free i new/delete w funkcjach __device__. Ale to nie jest istotne dla odpowiedzi.

Zazwyczaj dostarczana jest wystarczająco duża macierz wyjściowa (wstępnie przydzielona, ​​często o tej samej wielkości, co tablica wejściowa), a dane wyjściowe są do niej zapisywane. Nie jest wymagana żadna alokacja dynamiczna, ale istnieje potencjalnie strata pamięci masowej. Właśnie to robi CUDPP i ciąg. Alternatywą byłoby najpierw wykonać liczenie ważnych elementów, a następnie dynamicznie przydzielać wyjściową pamięć GPU przy użyciu funkcji cudaMalloc wywoływanej z procesora głównego.

+1

To nie jest to, co robi Thrust :) Algorytmy kompresji w ciągu (np. '' pchnięcie :: kopiowanie_''') zwykle wymagają bufora wyjściowego. –

+0

Dzięki. Zmieniono moją odpowiedź. Co jeśli wynik iteratora wskazuje na nieprzydatność alokacji? Czy istnieje automatyczne wymiarowanie? – harrism

+0

Nie; jeśli iterator wskazuje na niewystarczający bufor, zachowanie jest niezdefiniowane (tzn. ulega awarii). –