我嘗試使用openmp並發現奇怪的結果。使用openmp啓用slow serial「for」
並行「for」按照預期運行openmp。但是,當openmp禁用時(不帶/ openmp選項vs 2013),序列「for」運行得更快。
測試代碼
const int n = 5000;
const int m = 2000000;
vector <double> a(n, 0);
double start = omp_get_wtime();
#pragma omp parallel for shared(a)
for (int i = 0; i < n; i++)
{
double StartVal = i;
for (int j = 0; j < m; ++j)
{
a[i] = (StartVal + log(exp(exp((double)i))));
}
}
cout << "omp Time: " << (omp_get_wtime() - start) << endl;
start = omp_get_wtime();
for (int i = 0; i < n; i++)
{
double StartVal = i;
for (int j = 0; j < m; ++j)
{
a[i] = (StartVal + log(exp(exp((double)i))));
}
}
cout << "serial Time: " << (omp_get_wtime() - start) << endl;
無/ OpenMP的選項
0
omp Time: 6.4389
serial Time: 6.37592
輸出,帶/ OpenMP的選項
0
1
2
3
omp Time: 1.84636
serial Time: 16.353
輸出是否正確的結果?或者我做錯了什麼?
啓用OpenMP可能會抑制某些類型的編譯器優化。你是使用Release還是使用Debug代碼運行?內部循環是多餘的,在釋放模式下不應該將其變爲二進制。 – 2014-09-10 12:14:45
輸出爲發佈模式 – user1312837 2014-09-11 10:19:18