我正在使用gcc的openmp實現嘗試並行化一個程序。基本上這個任務是添加omp編譯指示來獲得加速的程序,找到amicable numbers。gcc openmp線程重用
給出了原始的串行程序(下面顯示的除了在最後添加了註釋的3行)。我們必須首先將外部循環,然後是內部循環。外部循環很容易,對於給定數量的處理器,我接近理想的加速比。對於內部循環,我得到比原始串行程序更糟糕的性能。基本上我試圖做的是減少總和變量。
看看CPU的使用情況,我只使用〜每核30%。什麼可能導致這個?程序每次碰到omp parallel for子句時是否不斷創建新線程?在減少障礙方面是否有更多的開銷?或者它可能是內存訪問問題(例如緩存顛簸)?從我讀的大多數openmp線程的實現中獲得重用加班(例如合併),所以我不太確定第一個問題是什麼問題。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <omp.h>
#define numThread 2
int main(int argc, char* argv[]) {
int ser[29], end, i, j, a, limit, als;
als = atoi(argv[1]);
limit = atoi(argv[2]);
for (i = 2; i < limit; i++) {
ser[0] = i;
for (a = 1; a <= als; a++) {
ser[a] = 1;
int prev = ser[a-1];
if ((prev > i) || (a == 1)) {
end = sqrt(prev);
int sum = 0;//added this
#pragma omp parallel for reduction(+:sum) num_threads(numThread)//added this
for (j = 2; j <= end; j++) {
if (prev % j == 0) {
sum += j;
sum += prev/j;
}
}
ser[a] = sum + 1;//added this
}
}
if (ser[als] == i) {
printf("%d", i);
for (j = 1; j < als; j++) {
printf(", %d", ser[j]);
}
printf("\n");
}
}
}
這是C++。?! – jjj 2012-01-31 08:30:25
@jjj對我來說看起來像C。你爲什麼認爲它是C++? – sehe 2012-01-31 08:31:35
您是否在編譯命令中添加了-fopenmp? – batbaatar 2012-01-31 08:33:00