2012-09-17 16 views
7

Jak skutecznie usunąć wartości zerowe z macierzy równolegle za pomocą CUDA. Informacja o liczbie wartości zerowych jest dostępna z wyprzedzeniem, , co powinno uprościć to zadanie.Jak usunąć wartości zerowe z tablicy równolegle

Ważne jest, aby numery pozostały uporządkowane jak w tablicy źródłowej, podczas kopiowania do wynikowej tablicy.


przykład:

Tablica której np zawierają następujące wartości: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] z dodatkowymi informacjami, że 5 wartości są zerami. Pożądanym wynikiem końcowym będzie kolejna tablica zawierająca: [19, 7, 3, 5, 1] ​​

+0

pewno chcesz usunąć zera ? jeśli usuniesz zero, otrzymasz tablicę jedynych zer ?! –

+0

poprawiłem to. Szukam skutecznego sposobu na usunięcie wartości zerowych z tablicy źródłowej. –

+0

Chciałbym zastąpić pętlę for przez wątki cuda, skutecznie równolegle do usuwania. –

Odpowiedz

7

Aby wyeliminować niektóre elementy z tablicy, można użyć Thrust Library's compaction operations. Biorąc pod uwagę orzeczenie is_not_zero, która zwraca false zerowej wartości i true dla innych, można napisać pracę jak ten

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero); 

tablica wyjściowy będzie zawierać tylko te wartości, które są niezerowe, ponieważ orzeczenie wskazuje więc .

Można również użyć funkcji „remove_if” Reverse orzecznika który powrotu true dla zer i false dla innych ..

thrust::remove_if(in_array, in_array + size, is_zero); 

Proponuję przyjrzeniu przykładów zagęszczania naporu bibliotece lub ogólnie koncepcja zagęszczania.

http://code.google.com/p/thrust/source/browse/examples/stream_compaction.cu

+0

Mogłem nie być w stanie użyć ciągu w tym projekcie, ale gdybym mógł, użyłbym twojej propozycji. Thx za pomoc. –

+2

Istnieją podobne biblioteki i tylko implementacje jądra do zagęszczania. Możesz nie potrzebować używać Thrust do tej funkcji, ale sugeruję, żebyś go używał. Spójrz tylko na przykłady SDK CUDA. – phoad

0

Co o odmianie dziwnie nawet połączyć porządek, albo w rzeczywistości żadnego algorytmu sortowania, gdzie kolejność jest określona przez a < b === (a != 0 && b == 0)?

+1

Jest to sortowanie jednobitowe, więc można zrobić o wiele lepiej niż sortowanie ogólne. –

+0

@JaredHoberock: Cóż, nie widziałem, aby zaproponować inne podejście do pracy, które działa o wiele lepiej. – wilx

+0

Innym problemem z podejściem do sortowania jest zniszczenie wejścia, które @ diver_182 chce zachować w tablicy wejściowej."remove_copy_if" będzie działało lepiej dla tego przypadku, jak powyższe uwagi @phoad. –