• Visual Studio 2015 OpenMP: (2) reduction


    对于+,-,*,&,|,&&,||等运算,可以使用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
    ", ans);

    这里reduction的意思是:CPU多线程执行for循环,每个线程保存ans的副本,循环结束后累加每个线程的ans并输出为ans。我的结果是ans=0.23288398,运行时间10ms.

    之所以用reduction求和的原因是,避免race condition这个问题。race condition是多线程编程中比较头疼的问题,因为多个线程同时访问相同的共享内存会导致结果依赖于进程运行的精确时序。

  • 相关阅读:
    2017年第八届蓝桥杯C/C++ C组国赛 —— 第一题:哥德巴赫分解
    Tree Walk Aizu
    Tree Walk Aizu
    Binary Trees Aizu
    有效的括号
    划分整数
    最大子矩阵和
    最大子段和
    最长上升子序列
    合唱队形
  • 原文地址:https://www.cnblogs.com/make217/p/5306238.html
Copyright © 2020-2023  润新知