▶ 并行计算八字原则:负载均衡,通信极小

▶ 并行计算基本形式:主从并行、流水线并行、工作池并行、功能分解、区域分解、递归分治

▶ MPI 主要理念:进程 (process);无共享存储;显式消息传递;松散同步 / 完全异步;SPMD 方式编程

▶ MPI 的主要实现版本

● MPICH,Argonne 国家实验室与 Mississippi 州立大学开发,是最早、最流行的实现

● MVAPICH,Ohio 州立大学开发,基于 MPICH,强调对各类硬件和网络的个性化支持。

● OpenMPI,Stuttgart 大学开发,多个 MPI 开源实现的合并版。

● Intel MPI,Cray MPI,HP-MPI,MS-MPI,……商业版本

▶ ABI 兼容(application binary interface):由 MPICH 发起,保证各个MPI 实现在底层数据类型上的兼容性

▶ 阻塞(blocking)与非阻塞(non-blocking)通信(其他见 MPI 部分,这里仅为补充)

● MPI_ISend() 与 MPI_IRecv(),非阻塞通信未结束,不要修改 buf 中的发送数据或使用 buf 中的接收数据

 int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)

● 取消非阻塞通信,需要传入信号标记

 int MPI_Cancel(MPI_Request *request)

● 检测非阻塞通信是否已经结束,返回 flag==0 表示结束(即时返回)

 int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)

● 等待非阻塞通信结束(通信结束后返回)

 int MPI_Wait(MPI_Request *request, MPI_Status *status)

● 检测 / 等待多个非阻塞通信

 int MPI_Testall(int count, MPI_Request requests[], int *flag, MPI_Status statuses[])
int MPI_Waitall(int count, MPI_Request requests[], MPI_Status statuses[])

● 检测/等待任一个非阻塞通信

 int MPI_Testany(int count, MPI_Request requests[], int *index, int *flag, MPI_Status *status)
int MPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status *status)

● 检测/等待任一些非阻塞通信

 int MPI_Testsome(int incount, MPI_Request array_of_requests[], int *outcount, int array_of_indices[], MPI_Status array_of_statuses[]);
int MPI_Waitsome(int incount, MPI_Request array_of_requests[], int *outcount, int array_of_indices[], MPI_Status array_of_statuses[]);

● mpicc 的参数

 -o      # 指定输出文件名,默认为 a.out
-g # 调试选项,产生调试信息
-L # 指定链接库路径
-l # 指定链接库的简称,如数学库 -lm
-I # 指定头文件路径
-D # 相当于 C 语言里面的宏定义
-Wall # 打开警告选项
-std # 指定 C 标准,如 -std=c99 使用 c99 标准

▶ 线程与进程的关系:线程可以被看作是进程的一部分,一个进程可以开启多个线程;线程继承了进程的资源 (比如指令、内存等);线程相互独立的并发 (concurrent) 执行;对于单处理器核,多线程可以通过多任务 (multi-tasking) 亦称为时间切片 (time-slicing) 的方式由处理器轮流分时执行,此时也称为软件线程 (software threads)。

▶ OpenMP 要素和作用

● 运行时库(run-time library)主要包括头文件 (omp.h)、库函数的调用和链接。

■ 用途:

  Setting and querying the number of threads;

  Querying thread ID, ancestor’s ID, and thread team size;

  Setting and querying the dynamic threads feature;

  Querying if in a parallel region, and at what level;

  Setting and querying nested parallelism;

  Setting, initializing and terminating locks and nested locks;

  Querying wall clock time and resolution

● 环境变量(environment variable)预定义变量,运行时控制程序的行为。

■ 用途:

  Setting the number of threads;

  Specifying how loop interations are divided;

  Binding threads to processors;

  Enabling/disabling/setting nested parallelism;

  Enabling/disabling dynamic threads;

  Setting thread stack size and wait policy

● 编译制导语句(compiler directive)特殊格式的注释来实现功能,否则忽略。

■ 用途:

  Spawning a parallel region;

  Dividing blocks of code among threads;

  Distributing loop iterations between threads;

  Serializing sections of code;

  Synchronization of work among threads

▶ if 从句:表达式为真则按照并行方式执行并行区,否则主线程串行执行并行区

▶按照优先级从低到高,并行区中的线程数按照下面的顺序确定:

● if 从句

● num_threads 从句设定

● omp_set_num_threads 库函数设定

● OMP_NUM_THREADS 环境变量设定

● 系统默认(一般是可用的处理器核数)

▶ 考虑程序可以并行的条件。任给两个程序 P1,P2,及各自输入和输出 I(P1),I(P2),O(P1),O(P2),有 Bernstein 条件:

▶ 串行一致性(sequential consistency)调整并行程序的语句顺序,使得输入不变时输出也不变,则称这种调整满足串行一致性

▶ 基本依赖定理(Fundamental Theorem of Dependence)当且仅当程序中所有不可消除的数据依赖都得以满足的条件下,并行程序的执行满足串行一致性(一个需要排除的特例:规约)

● 三种基本数据依赖关系

  ■ 流依赖 (flow dependence):RAW = Read After Write,唯一一种不可消除的依赖

  ■ 反依赖 (anti-dependence): WAR = Write After Read

  ■ 输出依赖 (output dependence): WAW = Write After Write

● 消除数据依赖:变量消去、变量私有化、变量替换、循环倾斜(loop skewing,调整每个循环内的操作,可能会有部分操作移到循环头部或尾部以外)

▶ section 导语:对并行区内非循环任务多线程并行执行,每个程序段被执行一次,无法提前得知线程分配到的任务

 #pragma omp sections [clause1 clause2 ...]
{
#pragma omp section
code1();
#pragma omp section
code2();
...
}

▶ single 从句:对并行区内任务单线程执行,无法提前得知执行的线程,其他线程等待该线程执行完毕后进行同步,一般用于处理非线程安全(thread safe)的任务,如 I/O、共享变量赋值等

 {
#pragma omp single [clause]
code();
}

▶ nowait 从句:去掉工作共享构造末尾的隐式栅栏同步,可以用于 for、sections、single

▶ order 从句:串行执行 for 循环

▶ 从句支持

▶ 同步构造

● barrier 构造:栅栏同步

● single 构造:单线程执行,有同步

● master 构造:主线程执行,无同步

● critical 构造:依次执行,程序片段

● atomic 构造:依次执行,单一指令

▶ 松弛一致性 (relaxed consistency)

● OpenMP 的共享变量在本地缓存中的修改并不随时更新到内存,flush 从句用于手动更新当前线程本地缓存中的数据。

● OpenMP 的一些同步操作隐含包含了 flush,如并行区 / critical 区入出口(注意工作共享构造的入口不隐含 flush),显式 / 隐式的 barrier 操作等

● flush 一般置于共享变量的写操作后或读操作前

● 合理的算法设计一般不需要显式 flush

▶ 程序的遗孤 (orphaning)(?)

● 遗孤:“工作共享” 和 “同步” 可以放在并行区静态范围外;如果在动态范围之内,则等同于非遗孤情况;否则,制导语句不起作用

● sections 构造不支持遗孤

▶ OpenMP 工作共享构造的缺陷

● 任务必须可数(for 循环或者 section 区块),链表、递归等无法支持

分布式计算课程补充笔记 part 2的更多相关文章

  1. 分布式计算课程补充笔记 part 4

    ▶ 并行通讯方式: map 映射 全局一到一 全局单元素计算操作 transpose 转置 一到一 单元素位移 gather 收集 多到一 元素搬运不计算 scatter 分散 一到多 元素搬运不计算 ...

  2. 分布式计算课程补充笔记 part 1

    ▶ 高性能计算机发展历程 真空管电子计算机,向量机(Vector Machine),并行向量处理机(Parallel Vector Processors,PVP),分布式并行机(Parallel Pr ...

  3. 分布式计算课程补充笔记 part 3

    ▶ OpenMP 的任务并行 (task parallelism):显式定义一系列可执行的任务及其相互依赖关系,通过任务调度的方式多线程动态执行,支持任务的延迟执行 (deferred executi ...

  4. 分布式计算课程补充笔记 part 1.5

    ▶ 编写 SLURM 脚本 #!/bin/bash #SBATCH -J name # 任务名 #SBATCH -p gpu # 分区名,可为 cpu 或 gpu #SBATCH -N # 节点数 # ...

  5. (转载)林轩田机器学习基石课程学习笔记1 — The Learning Problem

    (转载)林轩田机器学习基石课程学习笔记1 - The Learning Problem When Can Machine Learn? Why Can Machine Learn? How Can M ...

  6. 03、同事分享课程的笔记 —《Android应用低功耗设计》

    这是安卓组的同事一个月前分享的一节课程,听课时写了一下笔记,之前是写在本子上的,感觉内容挺不错 的,就保存在博客了吧,方便回看. 他曾经在就职于英特尔公司,是与芯片设计相关的,这课程标题虽然是与安卓相 ...

  7. Coursera台大机器学习基础课程学习笔记1 -- 机器学习定义及PLA算法

    最近在跟台大的这个课程,觉得不错,想把学习笔记发出来跟大家分享下,有错误希望大家指正. 一机器学习是什么? 感觉和 Tom M. Mitchell的定义几乎一致, A computer program ...

  8. 分布式计算框架学习笔记--hadoop工作原理

    (hadoop安装方法:http://blog.csdn.net/wangjia55/article/details/53160679这里不再累述) hadoop是针对大数据设计的一个计算架构.如果你 ...

  9. [基础]斯坦福cs231n课程视频笔记(三) 训练神经网络

    目录 training Neural Network Activation function sigmoid ReLU Preprocessing Batch Normalization 权重初始化 ...

随机推荐

  1. 一款非常不错的重写listctrl类-CListCtrlEx

    原文在:https://www.codeproject.com/Articles/28063/An-Extended-MFC-CListCtrl-to-edit-individual-cells li ...

  2. day 11 函数参数

    形参与实参 形参:就是形式参数,在函数定义时,写在括号里面指定的参数就是形式参数 实参:在调用函数时传入的参数就是实参 在调用函数时就会自动的把形参与实参绑定起来,然后调用结束之后,解除绑定关系 位置 ...

  3. django 问题总结

    1.更新了pip之后还提示更新 // 卸载 pip uninstall pip // 重新安装 easy_install pip pip -V 2.时间比当前时间少8小时问题 // 设置setting ...

  4. logback-spring.xml 博客分享

    https://juejin.im/post/5b51f85c5188251af91a7525

  5. linux do{} while(0)

    do{}while(0) 在linux中,经常会看到do{}while(0)这样的语句,许多人开始都会疑惑,认为do{}while(0)毫无意义,因为它只会执行一次,加不加do{}while(0)效果 ...

  6. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  7. docker下运行labview2010

    前言 本人笔记本用kali,因课程需要,要在Linux下运行Labview,找到了2010的iso,但只支持rehat系列的发行版,用rpm转化deb的方案不可行,尝试了在virtualbox下运行w ...

  8. Spring 自动装配及其注解

    一.属性自动装配 首先,准备三个类,分别是User,Cat,Dog.其中User属性拥有Cat和Dog对象. package com.hdu.autowire; public class User { ...

  9. python:文件的逐行操作

    逐行遍历文件: 方法一:一次读入,分行处理: readlines() 缺点:一次读入所有信息,对于大文件来说会消耗很多计算机内存 fname = input('请输入要打开的文件名称:') fo = ...

  10. fixed 相对于父容器定位

    当一个元素设置为 fixed 或 absolute,不设置 top, left 则会在原位置,而脱离文档流,别的元素可以存在于它之后. 而当使用 fixed 后还想相对于父容器进行定位,或者说在当前位 ...