No sé por qué siempre que abro hilo en este foro es para poner dudas rarísimas xD
No sé si conocéis "Evolution of Mona Lisa" (original C#, online). Utiliza un algoritmo genético para generar una imagen a partir de polígonos sobrepuestos que van mutando, intentando parecerse a una imagen rasterizada de entrada.
Se me ha ocurrido hacer exactamente lo mismo utilizando GPGPU para aumentar la velocidad. El problema es que nunca he tocado GPU para programar fuera de gráficos y tengo algunas dudas que a lo mejor si alguien ha toqueteado me podría resolver.
La historia es que a priori se me ocurren dos formas de hacerlo. La primera sería usar la pipeline de la tarjeta gráfica para renderizar los polígonos (usando la CPU para generar y mandar los polígonos) y luego, mediante un shader y multitexturas, "exploitar" la GPU para que realice los cáculos de la función de fitness (anglicismos everywhere), efectivamente agilizando el proceso.
La segunda opción sería utilizar algún tipo de programación basada en GPGPU (OpenCL, CUDA) para que sea la propia GPU la que haga las mutaciones, por lo que podría haber un montón de núcleos en la GPU trabajando en paralelo tanto en la mutacion como en la función de fitness. Mi GPU tiene 336 cores, así que es posible que esta opción sea la correcta para agilizar de verdad.
Del primer enfoque me gusta que se utilice la CPU también porque efectivamente los cálculos son menos costosos en CPU y además mientras puede trabajar la GPU en los cálculos costosos (el cálculo de la función de fitness.) El problema de este enfoque es que obviamente pierdo la opción de usar los 336 núcleos de la GPU para las mutaciones y por tanto me limito a una mutación por frame GPU.
Del segundo enfoque es obvio que me gusta la paralelización, pero se me presenta un problema: no creo que desde OpenCL (¿quizá desde CUDA sí? no creo) permita usar la pipeline de la gráfica para renderizar los polígonos, por lo que me quedo sin poder utilizar efectivamente los cores en paralelo y vuelvo al caso 1. Podría utilizar OpenCL para las mutaciones, pero estoy obligado a hacer la función de fitness usando el método de los shaders (al fin y al cabo estoy gastando 1 frame por pelotas al renderizar con la GPU), además que probablemente obtenga más rendimiento usando la CPU en paralelo con la GPU (es decir, usando el método 1 sin GPGPU.) No sólo eso: ni siquiera sé si puedo usar CUDA y renderizar a la vez sin usar carísimas llamadas a cargas y descargas de shaders en cada frame.
Si alguien ha trabajado con esto alguna vez, ¿hay alguna forma de usar una solución mixta que se me escapa? ¿Me jodo y pruebo ambas a ver cuál da más rendimiento? A mí me da la impresión de que el segundo método agilizaría igualmente.