MIC编程
(基础部分,可参考上一篇《MIC简介》)
几个问题:
1.什么是MIC?
协处理器、加速卡
2.什么是MIC编程?
让程序运行在MIC卡上
3.如何发挥MIC卡的优势?
并行(在众多核心上)
4.如何并行?
应用并行库:OpenMP、MPI、pThread、TBB……
MIC应用模式
MIC卡可以看作协处理器,也可以看作独立的节点
MIC有5中应用模式:
CPU原生模式
CPU为主MIC为辅模式(最常用)
CPU与MIC对等模式
MIC为主CPU为辅模式
MIC原生模式(native模式)
微异构:CPU上的某些指令放在MIC上还是有些问题的。
native模式:
什么是native模式?
仅在MIC卡上本地运行的模式
如何使用native模式?
原始CPU程序,编译时增加“-mmic”选项
不能含SSE、AVX等向量化指令代码
native模式有什么好处?
简单,无传输
native模式有哪些局限?
卡上空间有限,单核计算能力有限(应该还不如CPU)
native模式适合哪种应用场景?
简单测试、高并发的小规模程序
native模式使用方式
CPU单节点程序test_native.c
icc test_native.c -o ta.out
编译选项增加-mmic
icc test_native.c -o ta.out -mmic
方法一:
scp将可执行程序传到卡上
scp ta.out mic0: ~/
登录到卡上执行程序
ssh mic0
./ta.out
远程执行
ssh -x mic0 /root/ta.out
方法二:
无需将可执行程序传到卡上
/opt/intel/mic/bin/micnativeloadex
对等模式(必须是CPU的MPI程序)
什么是对等模式?
通过网络在CPU和MIC端协同计算的模式
如何使用对等模式?
原始CPU程序,编译两个版本,其一增加”-mmic”
不能含有SSE、AVX等向量化指令代码
对等模式有哪些局限?
通信开销大
对等模式适合哪种应用场景?
高并发的MPI程序,内部使用多线程并行
对等模式使用方法
CPU、MPI程序
编译两份代码,使用mpiicc
mpiicc test_mpi.c -o tm.out
mpiicc test_mpi.c -o tm.out_mic -mmic
scp将mic端可执行程序传到卡上
scp tm.out_mic mic0: ~/
mic运行库
设置环境变量export I_MPI_MIC=enable
运行程序
mpirun -host(主机IP) host -n 1 ./tm.out : -host mic0 -n 1
offload模式
什么是offload模式?
MIC作为协处理器,负责部分运算的模式
如何使用offload模式?
修改代码,编写引语,类似于OpenMP
offload模式有什么好处?
灵活、效率高
offload模式有哪些局限?
通信开销,需要修改代码
offload模式适合哪种应用场景?
适合高并行加速的应用
offload基础概念--主机和设备
Host-Device的定义
Host端:CPU主机端
运行串行部分
负责控制等
Device端:MIC设备端
作为CPU(host)的协处理器
有独立的存储设备(device memory)
同时启动大量线程进行并行计算
CPU/MIC异构协同计算模型
Fork-join模型(一般利用此模型,计算密集型)
CPU“offload (卸载)”MIC函数
MIC函数内部进行并行计算
CPU获取MIC计算后的结果(比如说规约后的)
Offload模式运行流程
程序启动,在CPU端运行主函数------程序运行到offload语句,得知接下来的代码段要在MIC端运行------驱动程序检测MIC卡是否存在,如果存在则调用MIC版本代码,否则调用CPU版本代码------(以下假设MIC卡存在)如果本次是第一次运行MIC程序,则驱动程序启动/唤醒MIC卡------MIC版本代码加载到MIC卡上------MIC端内存开辟空间,驱动程序将从数据从CPU端内存中复制到MIC端内存中------CPU端程序暂停:MIC端程序开始运行(CPU此时停下来等着)------MIC端程序段运行完成后,将数据从MIC端内存复制到CPU端内存------MIC卡回复低功耗状态,CPU端程序恢复运行------程序结束