Bonjour à tous,
Loin d'être expert en C# (junior en labo de recherche au japon), je conçoit et développe actuellement une application de reconnaissance de forme 3D (cylindres) à partir d'un nuage de points.
Comme vous vous doutez, la phase de calcul est lourde, et pour raccourcir le temps de traitement je me suis évidemment tourné vers le multithreading.
L'approche qui me semblait la plus efficace est : séparer la charge de travail en deux (ou plus suivant le nombre de cpu), et lancer un thread calcul lourd pour chaque "part de boulot".
Le thread 'maman'attends patiemment que les calculs soient terminés, collecte et synthétise les résultats.
Mon souci est le suivant : alors qu'en mono-thread, j'utilise sans défaillir 50% du CPU, avec deux threads, j'utilise seulement 70/85% du CPU... ce qui m'épate, vu qu'il a de quoi s'occuper.
Trace Windows 1 Thread (thread de calcul en rouge) :
http://img43.imageshack.us/img43/6336/trace1cpu.png
Trace Windows 2 Threads (threads de calcul en rouge et bleu) :
http://img41.imageshack.us/img41/5485/trace2cpu.png
Aucune synchro entre les deux threads, donc pas d'attente mutuelle "explicite". L'objet à traiter est crée dans le thread "maman", et donc partagé entre les deux threads, mais ils utilisent différentes zones de cet objet (imaginer une matrice, chaque thread traite 50% de la matrice).
De fait, je constate un ralentissement du temps de traitement moyen d'une "unité" de travail (chaque thread accomplissant 60 unités de travail) :
- 1 thread : 134ms par unité de travail, 15,2s pour le total
- 2 threads : 212ms par unité de travail, 13s pour le total
Je sollicite donc vos cerveaux expertspour me dire que faire pour augmenter les performances de mon application !
(Tout refaire en C++ n'est pas une option, j'ai choisi C# car j'ai des délais de développement serrés)
Partager