++ 多核cpu 并行_一文读懂什么是多核并行计算(三)

6f1e66e2e1b52c55285422839ab8bd36.gif

导读:面向应用工程师的商业软件咨询、自研软件定制开发服务的仿真公众号,点击关注进入菜单,查看更多精彩内容。

(三)如何实现多核并行计算呢?

了解了多核、多Machine、多Rack后,我可以看一下软件(程序)是如何对这些资源进行调度使用的呢?

1、先看看CAE软件的设置

CAE软件现在基本上都都号称是支持多核并行计算的,可以通过界面、求解命令等设置使用的核数,这样我们拿ansys看一下。

49e88565b8b3e54aa01e07b3650f9550.png

在Ansys中进行并行计算或多核计算设置,可在Ansys的Product Launcher启动界面的High Performance Computing Setup页面中进行设置。

在此高级设置页面中可以设置并行计算多台多核,也可以设置单台多核设置,单台多核可以理解为单CPU多个内核。对于核数设置很多软件都有个限制,不过据说有些国产CAE软件是不限制核数的,如果有兴趣购买国产CAE软件的可以联系本公众号。言归正传咱们看看程序怎么实现的。

2、并行计算简介

并行平台的通信模型: 共享数据(POSIX、windows线程、OpenMP)、消息交换(MPI、PVM)。

并行算法模型: 数据并行模型、任务依赖图模型、工作池模型、管理者-工作者模型、消费者模型对于并行计算一个任务可能涉及到的问题:任务分解、任务依赖关系、任务粒度分配、并发度、任务交互并行算法性能的常见度量值:并行开销、加速比、效率(加速比/CPU数)、成本(并行运行时间*CPU数)

上面的描述可能不是特别好理解,我们下面通过实例来说明下。

演示中主要完成的工作在Sum0函数(工作本身没有什么意义,主要是消耗一些时间来代表需要做的工作:),然后分别用OpenMP工具(vc和icc编译器支持)和一个自己手工写的线程工具来并行化该函数,来看看多核优化后的效果;我测试用的编译器是vc2005;CPU是双核的AMD64x2 4200+(2.37G);内存2G双通道DDR2 677MHz;(分为三类:纯代码执行、OpenMP并行计算、自己手写多线程)

3、不用并行的纯代码

#include #include #include #include //一个简单的耗时任务double Sum0(double* data,long data_count);int main(){long data_count=200000;double* data=new double[data_count];long i;//初始化测试数据for (i=0;idata[i]=(double)(rand()*(1.0/RAND_MAX));const long test_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次double sumresult=0;double runtime=(double)clock();for( i=0; i{sumresult+=Sum0(data,data_count);}runtime=((double)clock()-runtime)/CLOCKS_PER_SEC;printf ("< Sum0 > ");printf (" 最后结果 = %10.4f ",sumresult);printf (" 执行时间(秒) = %f ",runtime);delete [] data;return 0;}double Sum0(double* data,long data_count){double result=0;for (long i=0;i{data[i]=(double)sin(cos(data[i]));result+=data[i];}return result;}

看一下输出结果

< Sum0 >最后结果 = 55590743.4039执行时间(秒) = 6.156000

4、使用OpenMP并行计算

OpenMP是基于编译器命令的并行编程标准,使用的共享数据模型,现在可以用在C/C++、Fortan中;OpenMP命令提供了对并发、同步、数据读写的支持;(需要在项目属性中打开多线程和OpenMP支持,并要在多核CPU上执行才可以看到多CPU并行的优势)

OpenMP的实现如下:

#include #include #include #include //需要在项目属性中打开多线程和OpenMP支持#include //用OpenMP实现double Sum_OpenMP(double* data,long data_count);int main(){long data_count=200000;double* data=new double[data_count];long i;//初始化测试数据for (i=0;idata[i]=(double)(rand()*(1.0/RAND_MAX));const long test_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次double sumresult=0;double runtime=(double)clock();for( i=0; i{sumresult+=Sum_OpenMP(data,data_count);}runtime=((double)clock()-runtime)/CLOCKS_PER_SEC;printf ("< Sum_OpenMP > ");printf (" 最后结果 = %10.4f ",sumresult);printf (" 执行时间(秒) = %f ",runtime);delete [] data;return 0;}double Sum_OpenMP(double* data,long data_count){double result=0;#pragma omp parallel for schedule(static) reduction(+: result)for (long i=0;i{data[i]=(double)sin(cos(data[i]));result+=data[i];}return result;}

Sum_OpenMP函数相对于Sum0函数只是增加了一句"#pragma omp parallel for schedule(static) reduction(+: result)" ; 它告诉编译器并行化下面的for循环,并将多个result变量值用+合并;(更多的OpenMP语法请参阅相关资料);

程序运行输出如下:

< Sum_OpenMP >最后结果 = 55590743.4039执行时间(秒) = 3.078000

5、利用多线程来并行化

使用了自定义的CWorkThreadPool多线程工具,此处不贴这部分代码了。需要在项目属性中打开多线程支持;多线程并行实现如下:

#include #include #include #include #include #include "WorkThreadPool.h" //使用CWorkThreadPool类double Sum_WorkThreadPool(double* data,long data_count);int main(){long data_count=200000;double* data=new double[data_count];long i;//初始化测试数据for (i=0;idata[i]=(double)(rand()*(1.0/RAND_MAX));const long test_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次double sumresult=0;double runtime=(double)clock();for( i=0; i{sumresult+=Sum_WorkThreadPool(data,data_count);}runtime=((double)clock()-runtime)/CLOCKS_PER_SEC;printf ("< Sum_WorkThreadPool > ");printf (" 最后结果 = %10.4f ",sumresult);printf (" 执行时间(秒) = %f ",runtime);delete [] data;return 0;}double Sum0(double* data,long data_count){double result=0;for (long i=0;i{data[i]=(double)sin(cos(data[i]));result+=data[i];}return result;}struct TWorkData{double* part_data;long part_data_count;double result;};void sum_callback(TWorkData* wd){wd->result=Sum0(wd->part_data,wd->part_data_count);}double Sum_WorkThreadPool(double* data,long data_count){long work_count=CWorkThreadPool::best_work_count();std::vector work_list(work_count);std::vector pwork_list(work_count);long i;//给线程分配任务long part_data_count=data_count/work_count;for (i=0;i{work_list[i].part_data=&data[part_data_count*i];work_list[i].part_data_count=part_data_count;}work_list[work_count-1].part_data_count=data_count-part_data_count*(work_count-1);for (i=0;ipwork_list[i]=&work_list[i];//利用多个线程执行任务 阻塞方式的调用CWorkThreadPool::work_execute((TThreadCallBack)sum_callback,(void**)&pwork_list[0],pwork_list.size());double result=0;for (i=0;iresult+=work_list[i].result;return result;}

用多线程来把代码并行化从而利用多个CPU核的计算能力,这种方式具有比OpenMP更好的灵活性;但容易看出这种方式没有OpenMP的实现简便;Sum_WorkThreadPool函数更多的代码在处理将计算任务分解成多个独立任务,然后将这些任务交给CWorkThreadPool执行;程序执行输出如下:

< Sum_WorkThreadPool >最后结果 = 55590743.4039执行时间(秒) = 3.063000

总结:通过三天对于多核并行的讲解,相信大家一定有了深刻的认识,希望能够帮助大家更好的理解CAE软件并行计算原理,更希望大家能够分享、转发、再看等方式传递我们的信息给更多的朋友,谢谢。


欢迎大家转发,并点击下面的“在看”按钮,邀请更多的朋友一块讨论仿真技术,谢谢!

7590282321d6c72b4d9feec7acaf1f10.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器放行6in4协议,最简单的接入IPv6网络的方法 – 6in4隧道

很多大学的校园网启用了IPv6&#xff0c;并且建设了很多IPv6专享的资源。毕业离校&#xff0c;由于现在的网络运营商绝大部分尚未支持IPv6&#xff0c;所以那些资源也就离我们远去了。机缘巧合之下&#xff0c;我知道了&#xff0c;原来我们可以这样接入IPv6网络。目前接入IPv6…

梦幻群侠传5帮派修炼_梦幻西游:2020年十大更新回顾 法连不秒空和连续战斗修复...

今年梦幻西游有过很多重大的维护更新&#xff0c;其中不少更新都对玩家产生中重大的影响&#xff0c;比如说法术连击第二下不会秒空气&#xff0c;以及副本的迭代等等&#xff0c;今天就来盘点下2020年梦幻西游的十大更新!一、各类副本优化迭代今年优化了多个副本&#xff0c;如…

前端图片上坐标连线_前端图形学(十三)——弹跳运动的深入之傲娇的小球

欢迎来到【畅哥聊技术】前端图形学相关技术文章&#xff0c;更多精彩内容持续更新中,敬请关注。前面我们说到了小球的弹跳运动&#xff0c;通过一个方向的加速度和摩擦力去影响小球的动画&#xff0c;其目标点也是一个固定不变的&#xff0c;似乎有些单调。那么我们今天继续小球…

服务器微信了早上好,微信早晨好问候语句动态图片 早上好发给朋友的微信早安问候语简短...

原标题&#xff1a;微信早晨好问候语句动态图片 早上好发给朋友的微信早安问候语简短嘀嘀嘀嘀&#xff0c;我的短信到啦。用关心方式&#xff0c;要你多注意休息&#xff1b;用体贴方式&#xff0c;要你轻松而快乐&#xff1b;用祝福方式&#xff0c;要你一切都过的好&#xff…

c语言调用createthread线程的头文件_易语言API多线程总汇

【thread】 即&#xff0c;线程&#xff0c;是进程中某一顺序的控制流&#xff0c;在单个程序中同时运行多个线程完成不同工作&#xff0c;称为多线程。易语言多线程理解&#xff1a;进程是一个可执行程序&#xff0c;由私有虚拟地址空间、代码、数据和其它操作系统资源组成&am…

oracle varchar默认长度_面试官:如何精确计算mysql数据库索引长度?

概述我们知道MySQL Innodb 对于索引长度的限制为 767 字节&#xff0c;并且UTF8mb4字符集是4字节字符集&#xff0c;则 767字节 / 4字节每字符 191字符(默认索引最大长度)&#xff0c;所以在varchar(255)或char(255) 类型字段上创建索引会失败&#xff0c;提示最大索引长度为7…

android things 系统镜像文件_开始菜单搬家!Win 10X 系统 UI 全部重做,明年初就能用上...

不知道老伙计们还记不记得&#xff0c;小淙曾经报道过三次&#xff0c;关于微软新系统 Windows 10X 的消息。当时很多老伙计感觉太遥远&#xff0c;或者觉得它难以激起波澜。但现在看来微软布局已久&#xff0c;是铁了心要搞新系统了。因为 Windows 10X 系统已经准备好交付&…

通达信公式大全_通达信MACD金叉的选股公式大全

公式来源于网络&#xff0c;我只是用其中一个&#xff0c;一起复制来了&#xff0c;有需要的自取吧。1、0轴上方第一次金叉选股公式&#xff1a;DIFF:EMA(CLOSE,12) - EMA(CLOSE,26);DEA : EMA(DIFF,9);MACD : 2*(DIFF-DEA);xg:cross(diff,dea) and dea>-1.0 and dea<0.5…

mysql 时间差_后端从mysql取值返回0时区时间数据的问题

近日搞一个B/S项目&#xff0c;前端页面时间字段总是显示格林威冶时间&#xff0c;也就是0时区的时间&#xff0c;比北京时间差了8个小时。打开后台的数据库&#xff0c;在workbench中查询&#xff0c;结果显示的时间格式正常&#xff0c;为当前北京时间。该时间字段是在往数据…

abap视图字段限制_【第八章】视图

上一级目录&#xff1a;Mosh_完全掌握SQL课程_学习笔记 其它相关&#xff1a;数据概要【第八章】视图Views (时长18分钟)1. 创建视图Creating Views (5:36)小结就是创建虚拟表&#xff0c;自动化一些重复性的查询模块&#xff0c;简化各种复杂操作&#xff08;包括复杂的子查询…

生活质量衡量系统_数据质量与数据质量八个维度指标

数据质量与数据质量八个维度指标数据的质量直接影响着数据的价值&#xff0c;并且直接影响着数据分析的结果以及我们以此做出的决策的质量。质量不高的数据不仅仅是数据本身的问题&#xff0c;还会影响着企业经营管理决策&#xff1b;错误的数据还不如没有数据&#xff0c;因为…

linux的内置的账户_6 款面向 Linux 用户的开源绘图应用程序

既然你是一名 Linux 用户&#xff0c;为什么不关注一下开源绘图应用程序呢&#xff1f;-- Ankush Das(作者)小时候&#xff0c;当我开始使用计算机(在 Windows XP 中)时&#xff0c;我最喜欢的应用程序是微软的“画图”。我能在它上面涂鸦数个小时。出乎意料&#xff0c;孩子们…

ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS

前言现在接到小程序需要改版的需求&#xff0c;由于使用Ionic的经验&#xff0c;希望以后能够统一开发语言降低开发成本&#xff0c;所以想使用TypeScript进行开发。开发前准备工作先是看官网&#xff0c;在微信小程序的官方开发文档中找到TypeScript相关的支持介绍。微信官网描…

cad统计多条线段总长度插件_超级实用CAD技巧应用汇总!技巧大全、插件合集、快捷键合集等...

超级实用CAD技巧应用汇总&#xff01;技巧大全、插件合集、快捷键合集等各位朋友&#xff0c;CAD福利来啦&#xff01;超级实用CAD技巧应用汇总&#xff0c;千万不能错过&#xff01;有技巧大全、插件合集、快捷键合集、字体大全、常用图库大全、常见问题及解决办法、版本转换&…

局部放大_Origin教程|巧用ZOOM功能做数据对比和快速绘制局部放大图

微信公众号&#xff1a;有宝物的柜子编辑&#xff1a;落水无波2020-06-28 原创有时候在分析一些数据时&#xff0c;既需要观察整体又需要局部观测&#xff0c;那么怎么才能做到同时查看呢&#xff0c;就类似上面这样。这样就很容易的去发现有没有峰位偏移&#xff0c;同时查看与…

操作多台_一支热电偶能否连接多台显示仪表

一支热电偶能否连接多台显示仪表&#xff0c;这个问题常有人提出&#xff0c;因为随着DCS系统的应用及对管理工作的要求&#xff0c;需要对一个信号在多处显示也是常有的事。一支热电偶能否连接多台显示仪表或DCS系统板卡&#xff0c;连接后能否保证测量精度&#xff0c;这是人…

个性签名设计软件_佩服!我用Python设计了一个签名软件

临近年末&#xff0c;大家都忙着签发礼品&#xff0c;写的一手好的签名&#xff0c;会让大家更有成就感&#xff0c;今天&#xff0c;小安就带领大家来设计一个基于tkinter爬虫的签名设计软件&#xff0c;方便大家设计签名。要设计这款软件&#xff0c;就需要了解tkinter与爬虫…

华为硬件工程师社招机考题库_中级会计机考你了解吗?机考操作常见八大问题速看...

中级会计考试采用无纸化机考的形式&#xff0c;考生们在备考时要多熟悉机考操作&#xff0c;为了帮助考生提前了解无纸化机考&#xff0c;东奥小编整理了一些机考的常见问题&#xff0c;希望能够帮助到大家&#xff01;一、参加无纸化考试的考生允许带计算器入场吗&#xff1f;…

网站攻击软件_佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机

佳能遭严重勒索软件攻击&#xff0c;10TB的数据被窃取&#xff0c;大量服务宕机Garmin 遭勒索攻击的风波未平&#xff0c;近日&#xff0c;佳能又遭受了勒索软件攻击&#xff0c;攻击除了让佳能的一些网站宕机外&#xff0c;据说还导致佳能服务器中高达 10TB 的数据被盗。 影响…

js datagrid新增一行_Django接口新增页面编写_2(十五)

做一个好看的页面真的是一件困难的事情&#xff0c;所以还是遵循复制后修改的原则&#xff0c;首先是借鉴httpbin页面的方式进行块状展开。块状从模版中找到类似的html代码&#xff1a;块状我们可以看到一下它的动态效果&#xff0c;可以自主的展开和合拢。蛮符合我们的要求的动…