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

合肥专业网站制作安徽合肥建设网

合肥专业网站制作,安徽合肥建设网,上海中风险地区什么时候能解除,wordpress自动增加阅读数代码本文主要介绍OpenMP并行编程技术#xff0c;编程模型、指令和函数的介绍、以及OpenMP实战的几个例子。希望给OpenMP并行编程者提供指导。 #x1f3ac;个人简介#xff1a;一个全栈工程师的升级之路#xff01; #x1f4cb;个人专栏#xff1a;高性能#xff08;HPC编程模型、指令和函数的介绍、以及OpenMP实战的几个例子。希望给OpenMP并行编程者提供指导。 个人简介一个全栈工程师的升级之路 个人专栏高性能HPC开发基础教程 CSDN主页 发狂的小花 人生秘诀学习的本质就是极致重复! 目录 一、OpenMP 简介 二、OpenMP 编程模型 1. 指令与库函数 1.1 OpenMP指令格式 1.1.1 并行区域Parallel Region 1.1.2 并行构造Parallel Construct 1.1.3 任务Task 1.1.4 同步Synchronize 1.2 OpenMP常用的指令和函数 1.3 OpenMP常用库函数 2. 并行执行 3. 线程管理 4. 同步与通信 5. 调度策略 三、OpenMP编程实战 1 Linux下编译选项 2 C语言 OpenMP 并行化程序示例包含 3 C OpenMP并行编程示例包含宏定义#ifdef _OPENMP 4 OpenMP 多线程性能对比 一、OpenMP 简介 OpenMP 是一个为共享内存并行计算设计的编程接口广泛应用于 Fortran、C 和 C 语言。它提供了一套编译器指令和库函数使得开发者能够轻松地编写并行程序。OpenMP 的“fork/join”模型是其中最核心的并行执行模式其中最初只有一个主线程在运行。当遇到需要并行计算的部分时主线程会派生出其他线程来执行并行任务。当并行代码执行完毕派生的线程会退出或挂起控制权回到主线程。类似与多线程技术。 二、OpenMP 编程模型 1. 指令与库函数 OpenMP 的基本语法是通过预处理指令 #pragma omp 来实现的。例如#pragma omp parallel for 用于并行化 for 循环。此外OpenMP 还提供了一系列的库函数用于线程的创建、同步等操作。这些库函数和指令使得开发者能够更灵活地控制并行程序的执行。 1.1 OpenMP指令格式 1.1.1 并行区域Parallel Region 用于指定一个代码块该代码块将在多个线程上并行执行。 #pragma omp parallel {// 并行执行的代码块 }1.1.2 并行构造Parallel Construct 用于创建一个新线程并执行指定的代码块 #pragma omp parallel sections {#pragma omp section{// 线程1执行的代码块}#pragma omp section{// 线程2执行的代码块} }1.1.3 任务Task 用于创建一个新任务并在当前线程上执行指定的代码块。 #pragma omp task firstprivate(a, b) shared(c) {// 任务执行的代码块使用变量a和b以及共享变量c }1.1.4 同步Synchronize 用于等待所有线程完成指定的任务。 #pragma omp for schedule(static, chunk_size) reduction(:sum) for (int i 0; i n; i) {// 循环体使用变量i和sum }1.2 OpenMP常用的指令和函数 parallel用于指定一个代码段该代码段将在多个线程上并行执行。 for用于for循环之前将循环分配到多个线程中并行执行必须保证每次循环之间无相关性。 parallel forparallel 和 for语句的结合也是用在一个for循环之前表示for循环的代码将被多个线程并行执行。 sections用在可能会被并行执行的代码段之前。 parallel sectionsparallel和sections两个语句的结合。 critical用在一段代码临界区之前。 single用在一段只被单个线程执行的代码段之前表示后面的代码段将被单线程执行。 flush用来保证线程的内存临时视图和实际内存保持一致即各个线程看到的共享变量是一致的。 barrier用于并行区内代码的线程同步所有线程执行到barrier时要停止直到所有线程都执行到barrier时才继续往下执行。 atomic用于指定一块内存区域被制动更新。 master用于指定一段代码块由主线程执行。 ordered用于指定并行区域的循环按顺序执行。 threadprivate用于指定一个变量是线程私有的。 copyprivate配合single指令将指定线程的专有变量广播到并行域内其他线程的同名变量中 copyin n用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化 default用来指定并行域内的变量的使用方式缺省是shared。 1.3 OpenMP常用库函数 OpenMP库函数是一组用于并行计算的函数它们可以帮助程序员在C、C和Fortran等编程语言中实现多线程编程。以下是一些常用的OpenMP库函数 omp_get_num_threads()返回正在执行的线程数。omp_get_max_threads()返回支持的最大线程数。omp_get_thread_num()返回当前线程的编号。omp_get_num_procs()返回正在执行的程序的处理器数。omp_set_num_threads()设置并行区域中的线程数。omp_get_nested()测试当前块是否嵌套在其他并行区域内。omp_set_nested()设置当前块允许嵌套在其他并行区域内。omp_get_schedule()获取指定并行区域的调度策略。omp_set_schedule()设置指定并行区域的调度策略。omp_get_chunk_size()获取指定并行区域的块大小。omp_set_chunk_size()设置指定并行区域的块大小。omp_barrier()在所有线程都到达该点时阻塞所有线程。omp_critical()创建一个临界区确保同一时间只有一个线程可以执行该段代码。omp_atomic()对一个变量进行原子操作确保多个线程对该变量的操作是有序的。omp_flush()将缓冲区中的数据立即写入共享内存或设备。omp_lock_t用于同步的锁类型。omp_init_lock()初始化锁对象。omp_destroy_lock()销毁锁对象。omp_set_lock()对锁对象加锁。omp_unset_lock()对锁对象解锁。 2. 并行执行 OpenMP 提供了多种并行执行的方法如 parallel for、parallel sections 等。这些方法使得开发者能够将代码块分配给多个线程执行从而实现更高效的计算。通过合理地划分代码块和选择合适的并行执行方法开发者可以显著提高程序的性能。 3. 线程管理 OpenMP 提供了一些指令和函数如 num_threads、thread_bind 等用于设置和控制并行区域中的线程数量和绑定策略。这些功能使得开发者能够更好地控制并行程序的执行流程确保程序的正确性和稳定性。 4. 同步与通信 为了确保并行执行的正确性OpenMP 提供了一些同步机制如 barrier、critical、atomic 等。这些机制确保了线程之间的正确协作和数据一致性。此外还提供了一些数据传输函数如 reduction用于实现线程之间的数据共享和计算结果的汇总。这些同步和通信机制是并行程序中必不可少的部分它们确保了程序的正确性和可靠性。 5. 调度策略 OpenMP 支持多种调度策略如静态调度、动态调度和运行时调度。这些调度策略允许开发者根据需要选择合适的调度策略来优化程序的性能。通过合理地选择调度策略开发者可以更好地平衡线程的负载和利用系统资源从而提高程序的执行效率。 三、OpenMP编程实战 1 Linux下编译选项 Linux下GCC编译器仅仅编译选项增加-fopenmp即可完成对OpenMP的支持。 2 C语言 OpenMP 并行化程序示例包含omp.h #include omp.h#include stdio.hint main() {#pragma omp parallel forfor (int i 0; i 10; i) {printf(Thread %d: %d\n, omp_get_thread_num(), i);}return 0;} 这个程序使用了 #pragma omp parallel for 指令将 for 循环进行并行化。在循环体内部使用 omp_get_thread_num() 函数获取当前线程的编号并打印出来。这个示例展示了 OpenMP 的基本用法和并行化效果通过简单的修改和调整你可以将其应用于更复杂的并行计算任务。 运行结果 由于使用的电脑是八核的因此最多有八个线程由上述的线程编号可以看出。 如果将上述的循环代码变成8个如下 #include omp.h#include stdio.hint main() {#pragma omp parallel forfor (int i 0; i 8; i) {printf(Thread %d: %d\n, omp_get_thread_num(), i);}return 0;} 运行结果 运行结果是八个线程线程编号和循环编号相同。 3 C OpenMP并行编程示例包含宏定义#ifdef _OPENMP #include iostream #include omp.h int main() {#ifdef _OPENMP // 如果定义了这个宏std::cout Hello, OpenMP! std::endl;#pragma omp parallel forfor (int i 0;i 8;i){printf(thread ID is %d i %d\n,omp_get_thread_num(),i);}#elsestd::cout OpenMP is not enabled. std::endl;#endifreturn 0; } 运行结果 C OpenMP并行编程例子。-fopenmp编译选项开启后_OPENMP宏被打开。 4 OpenMP 多线程性能对比 #include stdlib.h #include stdio.h #include omp.hvoid test() {for (int i 0; i 80000; i){//执行代码} }int main(int argc, char **argv){#ifdef _OPENMPprintf(OpenMP is Enable!\n);#elseprintf(OpenMP is Disable!\n);#endiffloat startTime omp_get_wtime();//指定2个Thread #pragma omp parallel for num_threads(2)for (int i 0; i 80000; i){test();}float endTime omp_get_wtime();printf(2 个Thread,latency: %f\n, endTime - startTime);startTime endTime;//指定4个Thread #pragma omp parallel for num_threads(4)for (int i 0; i 80000; i){test();}endTime omp_get_wtime();printf(4 个Thread,latency: %f\n, endTime - startTime);startTime endTime;//指定8个Thread #pragma omp parallel for num_threads(8)for (int i 0; i 80000; i){test();}endTime omp_get_wtime();printf(8 个Thread,latency: %f\n, endTime - startTime);startTime endTime;//指定12个Thread#pragma omp parallel for num_threads(10)for (int i 0; i 80000; i){test();}endTime omp_get_wtime();printf(10 个Thread,latency: %f\n, endTime - startTime);startTime endTime;//不使用OpenMPfor (int i 0; i 80000; i){test();}endTime omp_get_wtime();printf(不使用OpenMP Mutil Thread,latency: %f\n, endTime - startTime);startTime endTime;return 0; } 运行结果 分析结果可知随着线程数量的增加运行的时间减少由于使用的电脑是八核的因此并行只能同时有八个线程使用十个线程的运行效率不增反减。 我的分享也就到此结束啦 如果我的分享也能对你有帮助那就太好了 若有不足还请大家多多指正我们一起学习交流 未来的富豪们点赞→收藏⭐→关注如果能评论下就太惊喜了 感谢大家的观看和支持最后☺祝愿大家每天有钱赚 下一节将继续开展OpenMP编程更加详细的实战。
http://www.eeditor.cn/news/123389/

相关文章:

  • 求个网站你懂我意思是用群晖nas做网站
  • 做网站时无法上传图片凡科网站免费版
  • 庆安建设局网站广州网站建设出名 乐云践新
  • 一个产品有两个品牌怎么做网站WordPress QQ 微
  • 网站建设工作人员有哪些职责专业企业建站系统
  • 美食网站怎样做锅包肉南宁公司建站模板
  • 南京移动网站建设报价建筑模板的规格
  • 创新的网站建设排行榜黄埔建网站公司
  • 阳网站建设营子区住房和城乡建设局网站
  • 网站建设实训报告wordpress出境游
  • 一个网站占空间有多少g北京注册工作室代理公司
  • 如何把学校网站建设好安卓版下载
  • 网站建设用的是什么软件商丘网站建设哪家好
  • 视频网站的链接怎么做的凡科是大厂吗
  • 知名高校网站建设网站建设开公司现在好做吗
  • 网上花店 网站源代码做网站的大公司
  • 浏览有关小城镇建设的网站 记录云南网站建设定做
  • 黑五手表网站互联网营销培训班
  • 找企业名录的网站凡科注册的网站怎么被百度收录
  • 网站上加一个浮动小框怎么做写作网站名字
  • ios7 风格 网站大连市建设工程招标信息网
  • 咸阳网站开发公司地址汽车网站建设模板
  • 佛山市网站建设分站企业北京企业建站模板
  • 站长统计app软件下载官网做网站的接口是意思
  • 做h5哪些网站好 知乎卫浴网站模板
  • 乐清建设公司网站网站推广优化外包公司
  • wap电影网站建设天河建设网站专家
  • 做网站花都区手机app下载软件安装
  • 网站个性化制作网站建设选哪家公司好
  • 网站集约化建设国内网络营销公司排名