Programmation parallele - sommes
Bonjour,
J'ai actuellement dans un programme une boucle qui prend pas mal de temps qui ressemble á :
Code:
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:
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:
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.