OpenMP学习笔记

本文档详细介绍了OpenMP的学习笔记,包括多线程编程、同步、并行循环、数据环境和调度等内容。讲解了如何使用#pragma omp指令进行并行化,如parallel, critical, atomic, for, reduction等,并强调了消除循环依赖和正确处理数据共享的重要性。" 93318720,5652391,LinkedHashMap转换为自定义对象的解决办法,"['Java', '微服务', '数据转换', 'JSON', '对象映射']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译命令:gcc –O XXX.c -fopenmp

1.      Multi-thread Programming

1.      首先要import相应的API,因此必须在首行写上#include “omp.h”

2.      对于要并行执行的部分,用#pragma omp parallel{…} 标记并行块范围。

3.      在并行块里面,用int ID = omp_get_thread_num(); 来获取并行线程的ID。注意:Master thread的ID为0。

4.      设定并行线程的数目的方式有两种:1. 如果要设定并行线程的数目在并行块外,调用omp_set_num_threads(intnum)函数。2.也可以在声明并行块的时候同时声明设定并行线程的数目,即使用#pragma omp parallelnum_threads(int num){}代替#pragma omp parallel{ }。如果不设定并行线程的数目,则并行线程数目的缺省值为CUP的核数。

5.      在并行块内,一般会使用int nthrds = omp_get_num_threads()来获得并行线程的总数,这样方便在遍历的时候设立stride。

2.      Synchronization

2.1 critical

在并行块中的关键区域上锁,实行局部的串行操作。

#pragma omp critical{ …}

2.2 atomic

作用同critical,但是仅对某个内存区域的读写操作有效(e.g.如果要调用某个函数,可能就会失效),速度比critical更快。

#pragma omp atomic{ …}

3.      Parallel Loops

3.1自动并行执行for循环(循环子默认为private)

#pragma omp for{ …}

e.g.

#pragma omp parallel for

         for(i = 0; i<N;i++)

a[i] = a[i] + b[i];

等效于

#pragma omp parallel

{

         intid, i, Nthrds, istart, iend;

         id= omp_get_thread_num();

         Nthrds= omp_get_num_threads();

         istart= id * N / Nthrds;

         iend= (id + 1)* N / Nthrds;

for(i=istart;i<iend; i++){

         a[i] = a[i] + b[i];

}

}

本质上就是把循环子i的遍历空间进行划分,让每个线程包办一部分的iterationsiteration次数尽量做到平均。前提是不存在依赖!

:如果标记块中仅含有一个statement,则#pragma ompfor后的大括号可以去掉。如果整个并行块里面只有一个for循环,则可以将声明并行块的#pragma omp parallel{ …}与并行块里面的#pragma omp for{…}简写成#pragma omp parrellel for{ …}

此外,用并行for循环优化时,注意要去掉loop carried dependence,e.g.

int i, j, A[MAX];

j = 5;

for(i=0;i<MAX;i++){

  j +=2;

  A[j] = big(j);

}

改为

int i, j, A[MAX];

#pragma omp parallel for{

for(i=0;i<MAX;i++){

  int j = 5 + 2i;

  A[j] = big(j);

}

实质是将并行块外定义的用j递推公式表示的线程共享变量,替换为并行块内定义的用i通项公式表示的线程私有变量。

3.2自动并行执行reduction

reduction (op:list)

e.g.

double average = 5.0, A[MAX]; int i;

#pragma omp parallel for reduction(+: average)

for(i=0; i<MAX; i++){

    &

### WRF 数值模拟学习资源汇总 对于希望深入理解 Weather Research and Forecasting (WRF) 模型及其应用的研究人员来说,存在多种途径获取高质量的学习材料。这些资源不仅涵盖了理论基础,还包括实际操作指南。 #### 官方文档与教程 官方提供的文档是最权威的信息源之一。UCAR(University Corporation for Atmospheric Research)维护着详细的在线手册和教程,适合不同层次的使用者查阅[^2]。这类资料通常会随着版本更新而持续改进,确保用户能够获得最新的配置方法和技术细节说明。 #### 实战案例分析 通过具体的应用场景来掌握软件工具是非常有效的学习方式。例如,在研究台风菲特(Fitow)期间,有学者分享了完整的实验过程记录,包括但不限于数据准备、参数设定以及结果验证等多个环节的具体实现步骤。此类实战经验有助于加深对整个工作流的理解,并能帮助解决实践中遇到的实际问题。 #### 技术博客与社区讨论 互联网上有许多个人或团队撰写的关于WRF的技术文章,它们往往包含了作者独特的见解和个人积累的小技巧。特别是当涉及到特定环境下的部署或是优化性能等方面的话题时,来自一线开发者的建议尤为珍贵[^4]。此外,积极参与相关论坛交流也是快速提升技能的好办法;在这里可以找到志同道合的朋友共同探讨难题,互相启发思路。 #### 并行计算平台支持 鉴于气象预报任务常常涉及大规模的数据集处理及复杂物理过程仿真,因此熟悉高性能计算机(HPC)上的作业提交机制至关重要。针对这一点,某些机构提供了专门面向初学者编写的入门级指导材料,介绍了必要的Linux命令行操作知识以及MPI/OpenMP编程接口等内容[^3]。这使得即使是没有太多超级计算背景的人也能顺利开展基于集群系统的科研活动。 ```bash # 示例:登录远程服务器并执行简单命令 ssh username@remote_host cd /path/to/project_directory ls -l ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值