对于+,-,*,&,|,&&,||等运算,可以使用OpenMP提供的reduction方法,下面以求和+为例,说明其使用方法:
1 long NumAmounts = (long)1e6; 2 double ans = .0; 3 4 #pragma omp parallel for reduction (+:ans) 5 for (int i = 0; i < NumAmounts; ++i) 6 { 7 ans += sin((double)i); 8 } 9 fprintf(stdout, "Answer is: %16.8lf\n", ans);
这里reduction的意思是:CPU多线程执行for循环,每个线程保存ans的副本,循环结束后累加每个线程的ans并输出为ans。我的结果是ans=0.23288398,运行时间10ms.
之所以用reduction求和的原因是,避免race condition这个问题。race condition是多线程编程中比较头疼的问题,因为多个线程同时访问相同的共享内存会导致结果依赖于进程运行的精确时序。