Désolé pour la question de sujet vague, mais je travaille sur des routines de traitement vidéo académique. Les algorithmes sont écrits dans MATLAB, et bien que ce soit bien pour le développement, il a traité une vidéo à environ 60spf, soit environ .0166fps. Inutile de dire que ce ne sera pas suffisant pour les démos et autres, alors mon travail d'été est de convertir la routine en quelque chose qui va courir considérablement plus vite.Quelle est la meilleure solution pour un problème parallèle embarrassant?
J'ai réécrit la partie la plus lente du code pour CUDA, la solution GPGPU de nvidia. Cependant, il y a aussi une grande partie du code qui semble être mieux fait sur le CPU, car il est relativement en série. Le problème est, la machine qui m'a été donnée a 2 processeurs Xeon, avec 8 cœurs logiques au total, et il semble dommage de goulot d'étranglement le code GPU en codant uniquement pour un seul core. Le processus de conversion vidéo est fonctionnel dans la mesure où chaque image ne dépend pas d'autres images, donc je pensais qu'une sorte de file d'attente/flux asynchrone serait la meilleure.
Voici ma question: quelle serait la meilleure façon de réaliser ce type de parallélisme avec le meilleur ratio d'effort pour accélérer le rendement?
Certaines des solutions que j'ai examinées sont OpenMP, .net TPL, et seulement pthreads simples. Je n'ai qu'une exposition de base à la programmation asynchrone, donc je préfère utiliser une bibliothèque ou quelque chose plutôt que de jouer avec des mutex et des barrières et me tirer plusieurs fois dans le pied. Cela ne me dérange pas d'apprendre, parce que c'est l'un de mes objectifs pour cet été, mais en même temps, le parallélisme est dur. Cependant, si la différence de vitesse est en fait très perceptible, je suis prêt à retirer mes cheveux pour quelques semaines. : P
Merci d'avance.
Si vous pouvez décomposer le problème en plusieurs parties pouvant être traitées sans interférence (avec des points de synchronisation bien définis), alors la "bibliothèque" utilisée devrait être simplement du sucre ... un moyen simple est d'utiliser un pool de threads, files d'attente simultanées (une pour l'entrée, une pour la sortie), et seulement accéder aux objets/données que ce thread "possède" (ceci peut être agrandi à des structures externes immuables). –