OpenMP核心技术指南学习笔记

OpenMP核心技术指南学习笔记:

*.设置并行线程数
omp_set_num_threads(num);

*.获取线程数量
int omp_get_num_threads();

*.获取线程ID
int omp_get_thread_num();

*.omp墙钟计时器
double omp_get_wtime();







SPMD设计模式:单程序多数据设计模式
1)启动两个或多个执行相同代码的线程;
2)每个线程确定其ID和线程组中的线程数;
3)根据ID和线程组中的线程数和线程之间的分配工作;
举例:此处使用二维矩阵的sum,是为了消除伪共享中的高速缓存行在核心之间来回移动产生的开销;
如果是一维矩阵sum的话,效率降低一半。

#include <iostream>
#include <thread>
#include <omp.h>

#define NTHREADS 4
#define CBLK 8

using namespace std;
static long  num_steps=100000000;

void main()
{
    int i, j, actual_nthreads;
    double stime, runtime;
    double sum[NTHREADS][CBLK] = {0};
    double step = 1.0 / num_steps;
    omp_set_num_threads(NTHREADS);
    stime = omp_get_wtime();
    //周期分布划分
#pragma omp parallel
    {
        int i;
        int id = omp_get_thread_num();            //线程ID
        int numthreads = omp_get_num_threads();   //线程总数
        double x;
        if (id == 0)
        {
            actual_nthreads = numthreads;
        }
        for (i = id; i<num_steps; i+=numthreads)
        {
            x = (i + 0.5) * step;
            sum[id][0] += 4.0 / (1.0 + x * x);
        }
    }
      //块状分解划分
//#pragma omp parallel
//    {
//        int i;
//        int id = omp_get_thread_num();
//        int numthreads = omp_get_num_threads();
//        double x;
//        actual_nthreads = numthreads;
//        int ista = id * num_steps / NTHREADS;
//        int iend = (id + 1) * num_steps / NTHREADS;
//        for ( i = ista; i < iend; i++)
//        {
//            x = (i + 0.5) * step;
//            sum[id] += 4.0 / (1.0 + x * x);
//        }
//    }

    double pi = 0.0;
    for (int i = 0; i < actual_nthreads; i++)
    {
        pi += sum[i][0];
    }
    pi *= step;
    runtime = omp_get_wtime() - stime;
    cout << "pi=" << pi << endl;
    cout << "cost time:" << runtime<<endl;
    system("pause");
}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值