Bonjour à tous,
J'ai multithreadé un code, et j'ai des résultats horribles, je ne suis pas expert mais je suspecte les threads qui se vident le cache entre eux. Voici l'algo :
Et j'appelle les threads de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 for (int y=y_begin; y<y_end; ++y) { for (unsigned short x=0; x<w; x++) { int i=(h-y-1)*w+x; // Traitements (peuvent être plus ou moins long data[i] = data[i] + /* code */; } }
En le lançant avec time j'ai ces résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 std::vector<Vector> data; data.resize(w*h); // Taille par exemple w = 256, h = 196 int yb = 0; int ye = 0; std::vector<std::thread> threads(thread-1); for(int i=0; i < thread-1; ++i) { ye += h/thread; threads[i] = std::thread(ThreadFunction(), std::ref(data), yb, ye); yb = ye; } ThreadFunction()(data, yb, h); for(size_t i=0; i < threads.size(); ++i) { threads[i].join(); }
real 0m10.309s
user 0m13.633s
sys 0m21.829s
(coupé avant la fin)
Alors que en single thread j'ai quasi 0 en sys. Je suppose que c'est à cause de nombreux changements de contexte ?
Et finalement pour donner un ordre de grandeur, sur mon processeur 4 coeurs, je met 20 secondes avec un thread et 3 minutes avec 4…
Quelles sont les causes possibles ?
Merci d'avance !
Partager