++ 多核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,一经查实,立即删除!

相关文章

诺禾致源css客户端,诺禾,诺禾致源:CSS 基础教学

伦多星报 2020-07-06 17:14:58Applying CSS and JavaScript to HTML当今您将使用的几乎所有网站都将使用CSS使它们看起来很酷&#xff0c;并使用JavaScript来支持交互式功能&#xff0c;例如视频播放器&#xff0c;地图&#xff0c;游戏等. 这些最常分别使用元素和元素应用于网…

python 文档操作_Python 文件操作

一. Python 读写 创建文件Python中对文件,文件夹(文件操作函数)的操作需要涉及到OS 模块和 shutil 模块 .一) . OS模块 的基本操作方法功能os.getcwd()得到当前工作目录,及当前Python脚本工作的目录路径os.listdir()返回指定目录下的所有文件和目录名:os.remoce()函数用来删除一…

vc读取北通手柄按键_《噬血代码》手柄怎么操作 北通手柄按键功能详解

噬血代码手柄怎么操作&#xff1f;应该很多朋友都还不是很清楚吧&#xff0c;所以呢小编今天给大家带来的就是噬血代码北通手柄按键功能详解&#xff0c;需要的朋友不妨进来看看。北通手柄按键功能详解游戏介绍本作是由《噬神者》的开发团队带来的完全新作&#xff0c;是迷宫探…

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

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

python自动寻路模板_Python实现的简单模板引擎功能示例

本文实例讲述了Python实现的简单模板引擎功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;#coding:utf- 8__author__"sdm"__author_emailsdmzhu3gmail.com__date__ "$2009-8-25 21:04:13$" pytpl 类似 php的模板类 import sysimport StringIOi…

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

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

jq ajax提交评论,织梦评论怎么改成自己的jq ajax评论

如何把织梦评论框改成自己的1、首先我们先获取织梦评论吧&#xff01;这个比较简单&#xff0c;打开/plus/feedback_ajax.php文件&#xff0c;我们找到这第36行左右代码&#xff0c;看下面/*----------------------获得指定页的评论内容function getlist(){ }-----------------…

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

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

python通过内置函数测试对象类型_Python的内置函数

函数名功能描述示例abs()返回数字的绝对值abs(-45)divmod()把除数和余数运算结合起来&#xff0c;返回一个包含商和余数的元组divmod(7,2) 返回&#xff1a;(3,1)raw_input()获取控制台输入&#xff0c;将所有输入看作字符串&#xff0c;返回字符串类型araw_input("input&…

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

原标题&#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…

服务器能像客户端发信息吗,服务器怎么向客户端发信息吗

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情Linux云服…

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;为当前北京时间。该时间字段是在往数据…

python接口自动化关联参数_python接口自动化7-参数关联

前言我们用自动化发帖之后&#xff0c;要想接着对这篇帖子操作&#xff0c;那就需要用参数关联了&#xff0c;发帖之后会有一个帖子的id&#xff0c;获取到这个id&#xff0c;继续操作传这个帖子id就可以了(博客园的登录机制已经变了&#xff0c;不能用账号和密码登录了&#x…

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;孩子们…