Ik ben bezig aan een algoritme dat ik op eight-core machines wil draaien om het allemaal wat sneller te laten gaan. Ik ben daarom mijn code aan het paralleliseren met OpenMP (ik gebruik GCC 4.2.2). Tot nu toe is m'n geparalleliseerde code echter eerder trager dan sneller. Een voorbeeld:
Als ik de #pragma's uitvink is de code ongeveer 20% sneller op een quad-core machine (i.p.v. langzamer) voor n=5000. Ik heb dynamic scheduling geprobeerd met verschillende chunk sizes, maar dat levert weinig op in dit geval. Treden er lock-ups op in het sommeren van val of het schrijven naar P of rowSums ofzo? Hoe kan ik daar iets aan doen?
De double-arrays P en data, en double sigma komen trouwens van buiten deze code; maar het idee is duidelijk denk ik...
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| int i, j, k; double val, totalSum, *rowSums; rowSums = (double*) calloc(n, sizeof(double)); #pragma omp barrier // Compute the Gaussian kernel and corresponding row sums #pragma omp parallel for schedule(static) private(j,k,val) reduction(+:totalSum) for(i = 0; i < n; i++) { for(j = i + 1; j < n; j++) { // Compute the value val = 0.0; for(k = 0; k < d; k++) { val += pow(*(data + i * d + k) - *(data + j * d + k), 2.0); } val = exp(-val / (2 * pow(sigma, 2.0))); // Store the value and update the row sums *(P + i * n + j) = val; *(P + j * n + i) = val; *(rowSums + i) += val; *(rowSums + j) += val; totalSum += val; } } #pragma omp barrier |
Als ik de #pragma's uitvink is de code ongeveer 20% sneller op een quad-core machine (i.p.v. langzamer) voor n=5000. Ik heb dynamic scheduling geprobeerd met verschillende chunk sizes, maar dat levert weinig op in dit geval. Treden er lock-ups op in het sommeren van val of het schrijven naar P of rowSums ofzo? Hoe kan ik daar iets aan doen?
De double-arrays P en data, en double sigma komen trouwens van buiten deze code; maar het idee is duidelijk denk ik...