2012-09-17 26 views
7

¿Cómo puedo eliminar de manera eficiente valores cero de una matriz en paralelo con CUDA? La información sobre el número de valores cero está disponible por adelantado, , lo que debería simplificar esta tarea.Cómo eliminar valores cero de una matriz en paralelo

Es importante que los números permanezcan ordenados como en la matriz fuente, cuando se copian a la matriz resultante.


Ejemplo:

la matriz sería por ejemplo contienen los siguientes valores: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] con la información adicional de que 5 valores son ceros. El resultado final deseado sería entonces otra matriz que contiene: [19, 7, 3, 5, 1] ​​

+0

seguro que desea eliminar ceros ? si eliminas los no ceros, obtendrías una matriz de solo ceros? –

+0

sí corrigió eso. Estoy buscando una manera eficiente de eliminar los valores cero de la matriz fuente. –

+0

Me gustaría reemplazar el bucle for a través de hilos cuda, paralelizando eficazmente la eliminación. –

Respuesta

7

para eliminar algunos elementos de una matriz puede usar Thrust Library's compaction operations. Dado un predicado is_not_zero, que devuelve false para los valores de cero y true por los demás, es posible escribir la operación como ésta

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

la matriz de salida incluirá únicamente los valores que no son cero, porque el predicado indica por lo .

También puede utilizar la función "remove_if" con un predicado inversa que volver true de ceros, y false por los demás ..

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

que sugieren que echar un vistazo a los ejemplos de compactación de la biblioteca de empuje, o general concepto de compactación.

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

+0

Es posible que no pueda usar el impulso en ese proyecto, pero si pudiera, usaría su propuesta. Gracias por tu ayuda –

+2

Existen bibliotecas similares y solo implementaciones de núcleo para la compactación. Puede que no necesites usar Thrust solo para esta función, pero te sugiero que la uses. Solo mira los ejemplos de CUDA SDK. – phoad

0

¿Qué pasa con una variación de par-impar ordenamiento por mezcla, o de hecho cualquier algoritmo de clasificación, donde el orden se define por a < b === (a != 0 && b == 0)?

+1

Este es un tipo de un bit, por lo que uno puede hacer mucho mejor que un tipo de combinación general. –

+0

@JaredHoberock: Bueno, no te he visto proponer un enfoque de trabajo diferente que funcione mucho mejor. – wilx

+0

Otro problema con un enfoque de clasificación es que destruiría la entrada, que @ diver_182 desea conservar en la matriz de entrada.'remove_copy_if' funcionará mejor para este caso como las notas de @phoad anteriores. –

Cuestiones relacionadas