Computación paralela: ¿Cuáles son los buenos enfoques y fuentes para programar CUDA en Machine Learning con datos a gran escala?

Si se trata de datos a gran escala, la GPU individual no es suficiente, porque cada vez que necesita copiar datos de la RAM de la CPU a la RAM de la GPU y después de hacer el cálculo, debe guardar el resultado intermedio, por lo tanto, debe volver a copiar los datos nuevamente en CPU RAM de GPU RAM. Es un proceso que consume poco tiempo.
Resolví este problema construyendo un clúster GPU y escribí mi programa Cuda dentro del marco openMPI, he implementado la simulación de la cadena de Markov en este clúster (fue un proyecto POC).
Hice este clúster con cinco máquinas con una tarjeta GTX 690 de 4 GB, y en cada máquina puse los mismos datos, pero especifiqué en mi programa MPI qué porción de datos usa cada máquina y con este enfoque he disminuido los datos 5 veces por máquina, puede disminuir el promedio todo el tiempo del proceso, pero también aumenta la complejidad del programa, ya que necesita escribir una lógica para combinar el resultado intermedio de cada máquina.

Hubo dos cursos en línea sobre programación CUDA C, uno sobre curso y otro sobre udacity (bajo el nombre de “programación paralela heterogénea”)