Paralelización de la creación de archivos PNG con C ++, libpng y OpenMP

Actualmente estoy intentando implementar un codificador PNG en C ++ basado en libpng que usa OpenMP para acelerar el proceso de compresión. La herramienta ya puede generar archivos PNG a partir de varios formatos de imagen. Subí el código fuente completo a pastebin.com para que pueda ver lo que he hecho hasta ahora:http://pastebin.com/8wiFzcgV

¡Hasta ahora tan bueno! Ahora, mi problema es encontrar una forma de paralelizar la generación de los fragmentos IDAT que contienen los datos de imagen comprimidos. Generalmente, la función libpng png_write_row se llama en un bucle for con un puntero a la estructura que contiene toda la información sobre el archivo PNG y un puntero de fila con los datos de píxeles de una fila de una sola imagen.

(Línea 114-117 en el archivo Pastebin)

//Loop through image
for (i = 0, rp = info_ptr->row_pointers; i < png_ptr->height; i++, rp++) {
    png_write_row(png_ptr, *rp);
}

Libpng luego comprime una fila tras otra y llena un búfer interno con los datos comprimidos. Tan pronto como el búfer está lleno, los datos comprimidos se vacían en un fragmento IDAT al archivo de imagen.

Mi enfoque fue dividir la imagen en varias partes y dejar que un hilo comprima la fila 1 a 10 y el otro 11 a 20 y así sucesivamente. Pero como libpng está usando un búfer interno, no es tan fácil como pensé primero :) De alguna manera tengo que hacer que libpng escriba los datos comprimidos en un búfer separado para cada hilo. Luego, necesito una forma de concatenar los buffers en el orden correcto para poder escribirlos todos juntos en el archivo de imagen de salida.

Entonces, ¿alguien tiene una idea de cómo puedo hacer esto con OpenMP y algunos ajustes a libpng? ¡Muchas gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta