我運行下面的OpenMP代碼奇怪的漂浮行爲的OpenMP
#pragma omp parallel shared(S2,nthreads,chunk) private(a,b,tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("\nNumber of threads = %d\n", nthreads);
}
#pragma omp for schedule(dynamic,chunk) reduction(+:S2)
for(a=0;a<NREC;a++){
for(b=0;b<NLIG;b++){
S2=S2+cos(1+sin(atan(sin(sqrt(a*2+b*5)+cos(a)+sqrt(b)))));
}
} // end for a
} /* end of parallel section */
而對於NREC = NLIG = 1024點更高的價值,在8芯板,我起身到7加速。問題是,如果我比較變量S2的最終結果,它與序列版本中獲得的確切結果的差異在1%到5%之間。可能是什麼原因?我應該使用一些特定的編譯選項來避免這種奇怪的浮動行爲嗎?
是的。減數中的增加順序也會影響結果,特別是如果值之間的差異很大。 – Kos 2011-01-20 16:27:31