type
status
date
slug
summary
tags
category
icon
password
- 比赛计算资源争抢
- profile、联网
- 抢节点
- 软硬件平台bench
- 理解局部代码逻辑——优化空间
- 代码热点
- 手动插入
- 每个主要for循环
- gprof、vtune、ncu工具,硬件开销
- 计算、带宽效率
- 计算密集、访存密集
- 是否逼近极限
- 增加代码局部性
- 循环融合
- 循环次序调整
- 算子融合
- 混合精度
- 访存密集:低精度存储,高精度运算
- 计算密集:高精度存储,低精度运算
- 迭代算法:先低后高
- 硬件特性
- 绑核,分配?numa?
- -O3过量展开
- 编译器
- 不同编译器对程序不同部分的影响,为什么
- 另一个编译器能否达到同样效果
- aocc/icc/icx/clang 一定比gcc好吗
- 新版本一定比旧版本好吗
- GPGPU-Sim
- icc17 对比 16 18 19差异很大,各部分不同
重大的策略
* gcc7.5.0
* 多版本 aocc/icc/icx/clang/gcc 编译测试
* 不同编译器在不同代码段的运行时间(比赛集群和调试集群)
《编译原理》
2 超算基本原理与方法论
3 现代处理器优化概论
LCTES
4 MPI
避免死锁
调整依赖关系
使用非阻塞接口
阻塞与非阻塞
计算与通信重叠的实现
系统缓冲
数据可能先传输到System buffer进行缓冲,会导致下述通信模式
缓冲适合于多小数据,不保证接收方是否开始接收,发送端拷贝到发送缓冲区从api返回
ready:避免额外缓冲区操作、建立连接等
集合通信
有规律而频繁的通信
常见的bug是在if内进行collective communication
栅栏同步
数据移动
allgather 所有进程都有完整的数据
alltoall 转置(常用于数据在不同进程间交换,比如现在的大规模通信)
规约
reduce
allreduce:都得到10(神经网络梯度规约)
辅助函数
mpi example
- 不可并行部分不变,加上开销
- error:数值精度问题?allreduce的顺序问题
5 OpenMP
共享内存并行,不需要显式的表达数据收发,只需要读取共享的内存
并行区构造
private进入后需要初始化,而first从主线程获取并初始化
reduction:离开并行区会执行operator操作
工作共享构造
schedule 调度控制
默认chunk任务粒度为1,但越细的力度有越大的调度开销,很多时候需要尝试调整,可使用guided自动调整,即越靠后任务粒度越小。
runtime 基于运行时确定
auto:摆烂
ordered 控制顺序执行
collapse 多重循环展开
nowait 离开并行区行为
不需要写到主线程
其他工作共享构造
同步构造
顺序执行代码段:critical
顺序执行语句:atomic(atomic往往开销更小一点)
猜测是硬件支持原因