Estoy considerando transferir un gran fragmento de procesamiento a la GPU usando un sombreador GLSL. Uno de los problemas inmediatos que tropecé es que en uno de los pasos, el algoritmo necesita mantener una lista de elementos, ordenarlos y tomar los pocos más grandes (cuyo número depende de los datos). En la CPU esto simplemente se hace usando un vector STL y qsort() pero en GLSL no tengo tales facilidades. ¿Hay alguna manera de lidiar con esta deficiencia?Clasificación rápida en GLSL?
Respuesta
Divulgación: Realmente no sé GLSL - He estado haciendo programación GPGPU con AMD Stream SDK, que tiene un lenguaje de programación diferente.
partir de comentar sobre la respuesta de Bjorn, tengo entendido que son no interesado en utilizar la GPU para ordenar una enorme base de datos - como la creación de una guía telefónica inversa o lo que sea, pero en su lugar, usted tiene un pequeño conjunto de datos y cada fragmento tiene su propio conjunto de datos para ordenar. ¿Más como tratar de hacer un filtrado medio de píxeles?
sólo puedo decir en general:
Para los pequeños conjuntos de datos, el algoritmo de ordenación realmente no importa. Mientras las personas han dedicado su carrera a preocuparse por cuál es el mejor algoritmo de ordenamiento para bases de datos muy grandes, para N pequeña no importa si usa Clasificación rápida, Clasificación de pila, Clasificación de columna, Clasificación de burbuja, Clasificación de burbuja optimizada, Clasificación de burbuja no optimizada, etc. Al menos no importa mucho en una CPU.
Las GPU son dispositivos SIMD, por lo que les gusta que cada kernel ejecute las mismas operaciones en el paso de bloqueo. Los cálculos son baratos, pero las ramas son costosas y las sucursales dependientes de los datos, donde cada núcleo se ramifica de una manera diferente, es muy, muy, muy costoso.
Así que si cada núcleo tiene su propio pequeño conjunto de datos para ordenar, y el número de datos a ordenar depende de los datos y podría ser un número diferente para cada núcleo, probablemente sea mejor elegir un tamaño máximo (si can), rellenando las matrices con Infinity o algún número grande, y haciendo que cada kernel realice exactamente el mismo género, que sería una clasificación de burbuja sin sucursales no optimizada, algo como esto:
Pseudocódigo (ya que no sé GLSL) , una especie de 9 puntos
#define TwoSort(a,b) { tmp = min (a, b); b = a + b - tmp; a = tmp; }
for (size_t n = 8; n ; --n) {
for (size_t i = 0; i < n; ++i) {
TwoSort (A[i], A[i+1]);
}
}
Muy agradable. Esto es exactamente lo que estaba buscando. ¿Tiene alguna referencia sobre las desventajas de las ramas dependientes de datos? – shoosh
No tengo ninguna referencia en la parte superior de mi cabeza. Por cierto, otra razón para que la oferta rápida no funcione en las GPU es que no son compatibles con la recursión. –
La recursividad es solo otro ciclo. Por lo tanto, casi todos los casos de recursión se pueden volver a escribir como ciclos While/For. –
¿Has visto este artículo? https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter46.html
No estaba seguro de que estuviera buscando un algoritmo Quicksort o un algoritmo de ordenación rápido. El algoritmo en el artículo usa tipo de fusión ...
Sí, creo que tiene mucho más sentido ejecutar MergeSort en una plataforma SIMD (debido a la localización de memoria) que QuickSort. –
Estaba buscando un tipo completo dentro de una sola pasada porque la clasificación es solo un paso en mi algoritmo que debe ejecutarse para cada fragmento. – shoosh
Muy buena respuesta. Los algoritmos en el artículo son buenos. Clasificador Bitonic FTW :-) – ypnos
no tengo ningún conocimiento acerca de la programación de la GPU.
Utilizaría heapsort en lugar de quicksort, porque dijiste que solo necesitas mirar los primeros valores. El montón se puede construir en el tiempo O(n)
, pero obteniendo el valor superior es log(n)
. Por lo tanto, si la cantidad de valores que necesita es significativamente menor que la cantidad total de elementos, podría obtener algún rendimiento.
- 1. Una clasificación rápida genérica en Scala
- 2. Manera rápida de seleccionar la cara cubmap en GLSL
- 3. Java: Arrays.sort clasificación rápida y mergesort
- 4. GLSL GLSL y ES 2
- 5. Clasificación rápida donde el orden rara vez cambia
- 6. Algoritmos de clasificación rápida para matrices con elementos mayormente duplicados?
- 7. printf en GLSL?
- 8. KD-Árbol en GLSL
- 9. cilindro impostor en GLSL
- 10. Cómo calcular gl_FragCoord en glsl
- 11. texture vs texture2D en GLSL
- 12. GLSL 4.1 con gl_ModelViewProjectionMatrix
- 13. OpenGL GLSL SSAO Implementación
- 14. Comando GLSL break
- 15. GLSL: problemas de gl_FragCoord
- 16. glsl fragmentshader render objectID
- 17. Programa editor GLSL
- 18. GLSL comportamiento de bifurcación
- 19. GLSL operador aritmético
- 20. Generic GLSL Lighting Shader
- 21. ¿Tutorial actualizado de GLSL?
- 22. hacia atrás glsl compatibilidad
- 23. Algunas preguntas de clasificación
- 24. GLSL pow function?
- 25. Índices compuestos en Mongo y clasificación
- 26. Organizar sombreadores GLSL en el motor OpenGL
- 27. Vertex asignación de atributos shader en GLSL
- 28. Configuración de la versión GLSL en Mac
- 29. ¿Textura y color juntos en GLSL?
- 30. Cómo actualizar una variable uniforme en GLSL
Me pregunto si GPU es bueno en quicksorting ... –