Disculpe la vaga pregunta por tema, pero estoy trabajando en algunas rutinas académicas de procesamiento de video. Los algoritmos están escritos en MATLAB, y aunque está bien para fines de desarrollo, procesó un video a aproximadamente 60spf, o alrededor de .0166 fps. Huelga decir que esto no será suficiente para demostraciones y cosas así, así que mi trabajo de verano es convertir la rutina en algo que funcionará drásticamente más rápido.¿Cuál es la mejor solución para un problema embarazosamente paralelo?
He reescrito la parte más lenta del código para CUDA, la solución GPGPU de nvidia. Sin embargo, también hay una gran porción del código que parece estar mejor hecho en la CPU, ya que es relativamente serial. El problema es que la máquina que me dieron tiene 2 procesadores Xeon, con 8 núcleos lógicos en total, y parece una pena estrangular el código de la GPU al codificar solo para un solo núcleo. El proceso de conversión de video es funcional porque cada cuadro no depende de otros marcos, así que pensé que algún tipo de cola/flujo asíncrono sería lo mejor.
Aquí está mi pregunta: ¿cuál sería la mejor manera de lograr este tipo de paralelismo con la mejor relación de esfuerzo para acelerar el rendimiento?
Algunas de las soluciones que he analizado son OpenMP, .net TPL y simplemente pthreads simples.
Solo tengo una exposición básica a la programación asíncrona, así que prefiero usar una biblioteca o algo así en lugar de perder el tiempo con mutexes y barreras y dispararme en el pie varias veces. No me importa aprender, porque ese es uno de mis objetivos para este verano, pero al mismo tiempo, el paralelismo es difícil. Sin embargo, si la diferencia de velocidad es realmente notable, estoy dispuesto a sacarme el pelo por un par de semanas. : P
Gracias de antemano.
Si puede descomponer el problema en varias partes en las que se puede trabajar sin interferencias (con puntos de sincronización bien definidos), entonces la "biblioteca" utilizada debe ser simplemente azúcar ... una forma simple es simplemente usar un grupo de subprocesos, colas concurrentes (una para entrada, una para salida), y solo acceso a objetos/datos que ese subproceso "posee" (esto se puede ampliar a estructuras externas inmutables). –