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 :

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 */;
       }
}
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
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();
    }
En le lançant avec time j'ai ces résultats :

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 !