Bonjour,
J'ai actuellement dans un programme une boucle qui prend pas mal de temps qui ressemble á :
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.
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.
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 á :
Mais qui garde toutes mes sommes et mon tableau de sommes
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));
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.
Partager