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

● 变量的数据域:并行区共享变量 → task 区也为共享;并行区私有变量 → task 区为 firstprivate;task 区其他变量 → 默认私有

● 范例代码

 #include <stdio.h>
#include <omp.h>
#include <time.h> int fib(int n)
{
int x, y;
if (n < )
return n;
#pragma omp task shared(x) // 创建关于 x 的 task
x = fib(n - );
#pragma omp task shared(y) // 创建关于 y 的 task
y = fib(n - );
#pragma omp taskwait // 等待两个 task 完成才嫩开始接下来的计算
return x + y;
} int main()
{
int res, n = ;
clock_t tick = clock();
#pragma omp parallel // task 要在并行区内调用
{
#pragma omp single // 根任务只调用 1 次
res = fib(n);
}
printf("Fib[%d] == %d, time = %f ms\n", n, res, float(clock() - tick)/);
getchar();
return ;
}

▶ 动态线程:系统动态选择并行区的线程数 (默认关闭)

● 用库函数打开 / 关闭动态线程,flag == 0 按优先级决定线程数,flag != 0 系统动态调节线程数

void omp_set_dynamic(int flag)

● 用环境变量打开 / 关闭动态线程

export OMP_DYNAMIC = true

● 检查动态线程是否打开

int omp_get_dynamic (void)

▶ 嵌套并行:并行区之内开启并行区 (默认开启)

● 用库函数打开 / 关闭嵌套并行

void omp_set_nested(int flag)

● 用环境变量打开 / 关闭嵌套并行

export OMP_NESTED = true
export OMP_NUM_THREADS = n1, n2, n3 # 每层嵌套的线程数

● 检查嵌套并行是否打开

int omp_get_nested (void)

▶ 动态线程和嵌套并行的范例代码

 #include <stdio.h>
#include <omp.h>
#include <time.h> int main()
{
omp_set_dynamic(); // 关闭动态线程
#pragma omp parallel num_threads(2)
{
#pragma omp single // 一个线程来执行,返回 2
printf("Outer: num_thds=%d\n\n", omp_get_num_threads()); omp_set_nested(); // 开启嵌套并行
#pragma omp parallel num_threads(3) // 内嵌一个 3 线程的并行块
{
#pragma omp single
printf("Inner: num_thds=%d\n", omp_get_num_threads()); // 返回 3
}
#pragma omp barrier omp_set_nested(); // 关闭嵌套并行
#pragma omp parallel num_threads(3) // 内嵌一个 3 线程的并行块
{
#pragma omp single
printf("Inner: num_thds=%d\n", omp_get_num_threads()); // 返回 1
}
#pragma omp barrier
} getchar();
return ;
}

▶ 线程私有型全局变量:将全局变量置为线程私有(对线程而言是全局变量),必须置于全局变量的声明列表之后

#pragma omp threadprivate (list)

● 范例代码

 #include <stdio.h>
#include <omp.h> int a, b, i, tid;
float x; #pragma omp threadprivate(a, x) int main(int argc, char *argv[])
{
omp_set_dynamic();
omp_set_num_threads(); printf("1st Parallel Region:\n");
#pragma omp parallel private(b, tid)
{
tid = omp_get_thread_num();
a = tid;
b = tid;
x = float(tid);
printf("Thread %d: a, b, x= %d, %d, %f\n", tid, a, b, x);
} printf("\n2nd Parallel Region:\n");
#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
printf("Thread %d: a, b, x= %d, %d, %f\n", tid, a, b, x);
} getchar();
return ;
}

● 输出结果,b 没有私有化,保持了第一并行区的结果

1st Parallel Region :
Thread : a, b, x = , , 0.000000
Thread : a, b, x = , , 1.000000
Thread : a, b, x = , , 3.000000
Thread : a, b, x = , , 2.000000 2nd Parallel Region :
Thread : a, b, x = , , 0.000000
Thread : a, b, x = , , 2.000000
Thread : a, b, x = , , 3.000000
Thread : a, b, x = , , 1.000000

▶ OpenMP 堆栈:除了主线程,每个线程的私有变量存储空间受线程堆栈大小控制,超出堆栈大小程序的行为不可控

● OpenMP 堆栈大小依赖实现:icc 默认 4 MB;gcc / gfortran 默认 2 MB;

● 可以通过环境变量修改默认堆栈大小:

export OMP_STACKSIZE=32M
export OMP_STACKSIZE=8192K

▶ 线程亲和性(affinity)和线程绑定(binding):线程亲和性决定 NUMA 架构的系统上线程在物理计算核心的映射策略;线程绑定显式确定线程与物理计算核心的对应关系,以提升性能

● OpenMP 3.1 开始提供线程绑定支持,OpenMP 4.5 开始较好支持,工具:numactl(参考http://www.glennklockwood.com/hpc-howtos/process-affinity.html)

export OMP_PROC_BIND=TRUE

● icc 可设置线程亲和性(参考https://software.intel.com/en-us/node/522691)

export KMP_AFFINITY = [<modifier>,...] <type> [,<permute>] [,<offset>]

▶ PETSc (Portable Extensible Toolkit for Sciencific Computation)讲座相关

● Advanced Sciencific Computing:

  ■ 应用上(Large and Complex)

  ■ 算法上(fully or semi implicit, multileve, nested, hierarchical, computer architure aware)

  ■ 并行化(Libraries, extensible solvers, composable)

● 部分幻灯片

● 终端中的代码

cd petsc-3.10./
module add mpich
module add petsc
cd src/vec/vec/examples/tutorials/
ls -al
make ex2
srun -c mpiexec -n ./ ex2 # 指定 核心

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

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

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

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

    ▶ 并行计算八字原则:负载均衡,通信极小 ▶ 并行计算基本形式:主从并行.流水线并行.工作池并行.功能分解.区域分解.递归分治 ▶ MPI 主要理念:进程 (process):无共享存储:显式消息传递 ...

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

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

  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. python与sqlserver接口包pymssql

    包下载地址(对应着自己的电脑和Python的版本下载即可,我电脑是win32,Python是3.6的) https://pypi.python.org/pypi/pymssql/ 下载后我放到了d盘中 ...

  2. Msfvenom学习总结

    1.    –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...

  3. restful规范整理

    restful的十条规范 restful一共有十条规范,但其并不是规定.可以不去遵守,是一种软件风格 1.API与客户端交互,通常使用https协议 2.域名:https://api.baidu.co ...

  4. find语法

    语法 find path -option [ -print ] [ -exec -ok command ] {} \; 参数说明 : find 根据下列规则判断 path 和 expression,在 ...

  5. 2456 Aggressive cows

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23866   Accepted: 11141 ...

  6. Kafka 术语

    什么是Kafka? Apache Kafka是一个分布式流媒体平台,允许你发布和订阅记录流,允许你以容错方式存储记录流,允许你处理数据流.或是说Kafka是一个分布式.支持分区.多副本的,基于zook ...

  7. 测试那些事儿—SQL Server服务器角色和数据库用户角色

    登录名:登录服务器的用户账号: 服务器角色:登录名对该服务器具有的权限,角色分多种的,一个角色可以有多个登录名,如操作系统的系统用户可以有多个. SQL服务器角色  sysadmin         ...

  8. Keepalived+LVS实现高可用负载均衡双主模式

    LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...

  9. jmeter 关联

    (1)正则表达式提取器 注:正则表达式部分配置说明 案例: 动态值:name=userSession value=119828.306682868zVzDzzipfcfDzQicpAVVVf> ...

  10. Postgresql导出数据报版本不对

    zabbix使用得数据库是Postgresql,最近zabbix4.0版本出来了,准备把zabbix升级,得先把数据库备份,但是一直报错,如下:     查找服务器上是否有10的版本,也一直没找到   ...