当前位置: 首页 > news >正文

科技企业网站源码新媒体seo指的是什么

科技企业网站源码,新媒体seo指的是什么,建设网站哪里来的资源,企石镇做网站OpenMP模型 gcc编译openmp指令:gcc test.cpp -o test -fopenmp 定积分计算 函数面积 给定一个定积分,计算其面积: ∫ 0 1 4.0 ( 1 x 2 ) d x \int^{1}_{0}{\frac{4.0}{(1x^2)}dx} ∫01​(1x2)4.0​dx omp 概念 并行区域 并行区域用于…

OpenMP模型

gcc编译openmp指令:gcc test.cpp -o test -fopenmp

定积分计算 函数面积

给定一个定积分,计算其面积:
∫ 0 1 4.0 ( 1 + x 2 ) d x \int^{1}_{0}{\frac{4.0}{(1+x^2)}dx} 01(1+x2)4.0dx

omp 概念

并行区域

并行区域用于多线程并行执行指令

#pragma omp parallel
{... do lots of stuff
}//end of parallel region

临界区

临界区用于解决:内存竞争问题,该区块中的代码只能有一个线程执行,其他线程必须等待。

#pragma omp critical
{... one or more lines of code
}

栅栏

栅栏用于解决线程同步问题,通过栅栏设置的锚点,必须等所有线程均执行到该位置才能继续往下执行。

#pragma omp barrier
//... continue work

栅栏通常用于这种情况,即必须在所有线程完成栅栏前的工作内容,才能继续往下执行。栅栏后的工作内容应当依赖所有线程栅栏前的工作全部完成才能执行,否则得不偿失。
因为栅栏所带来开销很大。这一点相当于cuda中的同步函数。

omp相关函数

  • int omp_get_num_threads() : 获取正在运行的线程数
  • int omp_get_thread_num() : 获取线程id
  • void omp_set_num_threads(int) : 获取要执行的线程数
  • double omp_get_wtime() : 返回以秒为单位的时间

串行执行

以横坐标为单位划分为指定数量的小块,取每个小块的中值作为该块的值,累加获得最终值。代码如下:

#include <stdio.h>
#include <omp.h>
#include <iostream>
static long num_steps = 100000000;
double step;
int main(){int i;double x , pi , sum=0.0;double start_time , run_time;step = 1.0 / (double)num_steps;start_time = omp_get_wtime();for (int i=0; i<num_steps; ++i) {x = (i+0.5)*step;sum += 4.0 / (1.0 +x*x);}pi = step*sum;run_time = omp_get_wtime() - start_time;std::cout<<"area result: "<<pi<<" steps: "<<num_steps<<" runtime: "<<run_time<<std::endl;return 0;
}

以padding的方式解决多线程计算总和问题

#include <stdio.h>
#include <omp.h>
#include <iostream>
#include <math.h>
#include <functional>
#define NTHREADS 12
double func(const double &x){return 4.0/(1.0+x*x);
}
template<typename FunctionType> double Area(FunctionType func,const double &start, const double &end, const long &num_steps){double width = (end-start)/num_steps;double hight[NTHREADS]={0.0};int actual_RunThreads;// omp_set_num_threads(NTHREADS);double start_time = omp_get_wtime();#pragma omp parallel{//获取线程idlong thread_ID = omp_get_thread_num();//获取实际运行的线程数if(!thread_ID) actual_RunThreads = omp_get_num_threads();for(long i = thread_ID; i<num_steps ; i+=actual_RunThreads){double x = start +(i+0.5)*width;hight[thread_ID]+=func(x);}}double hightSum=0.0;for (int i =0;i!=actual_RunThreads ; ++i) {hightSum+=hight[i]; }double runtime = omp_get_wtime()-start_time;std::cout<<"runtime: "<<runtime<<" actual_RunThreads: "<<actual_RunThreads<<std::endl;return hightSum*width;
}template<typename FunctionType, typename... Args> double AreaAgent(FunctionType func ,Args... args){return Area( func, args...);
}int main(){std::function<double(const double&)> f = func;double area =  AreaAgent(f , 0.0 , 1.0 , 100000000);std::cout<<"area: "<<area<<std::endl;return 0;
}

以临界区方式计算面积总和问题

#include <stdio.h>
#include <omp.h>
#include <iostream>
#include <math.h>
#include <functional>
double func(const double &x){return 4.0/(1.0+x*x);
}
template<typename FunctionType> double Area(FunctionType func,const double &start, const double &end, const long &num_steps){//获取每块的宽度//num_steps表示分为多少块double width = (end-start)/num_steps;double sum=0.0;int actual_RunThreads;double start_time = omp_get_wtime();//并行执行区域#pragma omp parallel{double partial_sum=0.0;//获取线程idlong thread_ID = omp_get_thread_num();//获取实际运行的线程数if(!thread_ID) actual_RunThreads = omp_get_num_threads();//actual_RunThreads表示步长for(long i = thread_ID; i<num_steps ; i+=actual_RunThreads){//以块中间的函数值作为整块的面积double x = start +(i+0.5)*width;partial_sum+=func(x);}//互斥方式计算总面积,相当于原子操作#pragma omp critical{sum+=partial_sum;}}double runtime = omp_get_wtime()-start_time;std::cout<<"runtime: "<<runtime<<" actual_RunThreads: "<<actual_RunThreads<<std::endl;return sum*width;
}template<typename FunctionType, typename... Args> double AreaAgent(FunctionType func ,Args... args){return Area( func, args...);
}int main(){std::function<double(const double&)> f = func;double area =  AreaAgent(f , 0.0 , 1.0 , 100000000);std::cout<<"area: "<<area<<std::endl;return 0;
}

执行时间统计

线程数串行OMPOMP消除伪共享OMP临界区同步
10.2908212.497372.513762.50391
20.2908212.460012.554351.25341
30.2908212.921661.907810.991777
40.2908214.091341.267990.630626
50.2908213.131442.538150.627318
60.2908212.931121.245410.579776
70.2908212.836552.953340.527468
80.2908212.91950.8268440.458585
90.2908212.394310.8528510.409409
100.2908213.209070.821560.381328
110.2908213.029431.919770.352992
120.2908212.957090.7372330.343221
http://www.tj-hxxt.cn/news/70679.html

相关文章:

  • 做时时彩网站代理费用网站制作企业有哪些
  • 一级域名网站企业网站建设报价表
  • 湖南网站建设哪家好网络广告策划书模板范文
  • 国外网站空间租用费用百度文库官网入口
  • 多语种外贸网站建设百度云搜索引擎入口盘搜搜
  • iis网站目录权限百度搜索大数据查询
  • 建设网站需要懂什么石家庄网站建设seo公司
  • wordpress 目录遍历福州seo网站排名
  • 一个人怎样做网站营销策划公司名字
  • 广州做网站的公司seo能干一辈子吗
  • 如何做公司网站运营百度移动首页
  • wordpress 插入文章win10优化大师有用吗
  • 温州网站推广价钱seo课程总结怎么写
  • 模板网站是什么意思付费恶意点击软件
  • 网站建设收获与体会成都网站建设seo
  • 网站风格介绍网站建设主要推广方式
  • liferay 做网站免费的拓客平台有哪些
  • 做自媒体需要用的网站网络推广运营团队
  • 岳阳做网站公司湖南seo优化
  • 合肥百度搜索优化郑州企业网站优化排名
  • 唐山网站建设拓2020年百度搜索排名
  • 秦皇岛英文网站建设营销策略理论
  • 广州做网站需要多少钱seo优化推广技巧
  • a站在线观看人数在哪网络推广哪个平台好
  • 滨州做网站搜索排名优化
  • wordpress4.7英文版网站优化推广价格
  • 红豆梧州论坛西安seo和网络推广
  • 电商网站建设需求分析 实例题临沂森佳木业有限公司
  • 专业的手机网站建设网络营销的方式和方法
  • 网站建设 ur建站网站一般需要怎么推广