Bonjour,

J'ai actuellement dans un programme une boucle qui prend pas mal de temps qui ressemble á :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
for(i = 1; i< 256; i++)
{
   data = M/i % 256;
   h = HammingWeight(data);
   sum1[i] += h;
   sum2[i] += h*h;
 
   for(k=0; k<1000; k++)
      sum3[i][k] += h* tab[k];
}
// M et tab sont définis avant la boucle.
J'aimerai accelerer ce code en le passant en parallele avec Parallel.For mais je n'arrive pas á m'en sortir a cause des sommes auxquelles on accede en meme temps.

Avec :

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
 
Parralel.For(1, 256, tst =>
{
   i = tst;
   data = M/i % 256;
   h = HammingWeight(data);
 
   lock(this)
   {
      sum1[i] += h;
      sum2[i] += h*h;
 
      for(k=0; k<1000; k++)
         sum3[i][k] += h* tab[k];
   }
});

Je ne gagne pas de temps car le lock l'empeche mais je ne comprend pas comment passer en 3 fonctions, comme je l'ai souvent vu sur le net.
Je voudrais faire qqch qui ressemble á :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
int sum = 0;
Parallel.For(0, 100, () => 0, (i,state)=>
{
    if (isPrime(i)) state.ThreadLocalState += i;
},
partialSum => Interlocked.Add(ref sum, partialSum));
Mais qui garde toutes mes sommes et mon tableau de sommes

Est-ce que l'un d'entre vous pourrait m'aider ?

Cordialement.


RQ : J'ai essayer avec un paralle.Invoke et des sommes locales mais je n'y arrive pas non plus.