Offload编译指的是在一个可运行的主机代码中加入编译指示或者某些新的关键字使代码段运行在基于英特尔集成众核架构(英特尔MIC架构)的协处理器上。其编程方式类似于使用OpenMP* 指示或英特尔 Cilk™ Plus关键字在串行代码中加入并行。
在编译代码时英特尔®编译器会同时为两种目标架构生成代码。该代码既可以在安装了协处理器的系统上运行,也可以在没有协处理器的系统上运行。这使得程序编写者无需担心目标系统是否具备运行协处理器代码的条件,从而简化了编程的复杂度。这种编译方式又被称作“Offload编译”或“异构编译”。
主机CPU和基于英特尔集成众核架构(英特尔MIC架构)的协处理器在硬件上不共享物理或虚拟内存,所以英特尔编译器在编译过程中会通过加入代码来完成自动主机和协处理器之间的传输数据(程序员无需编写额外代码)。目前,有两种可用的数据传输模型:
显式拷贝
程序员在offload pragma/directive中指定需要在主机和扩展卡之间拷贝的变量。
例如:
C/C++: #pragma offload target(mic) in(data:length(size))
Fortran: !dir$ offload target(mic) in(a1:length(size))
隐式拷贝
程序员标记出需要在主机和扩展卡之间共享的变量,这些变量在主机和协处理器代码中都可以使用。运行时系统会在offload语句的起始和终止处自动维护数据的一致性
例如: _Cilk_shared double foo; _Cilk_offload func(y);
这两种方式的比较如下表所示:
| 显式数据拷贝的Offload | 隐式数据拷贝的Offload |
允许offload的数据 | 标量,数组,可按位拷贝的数据结构 | 所有数据类型(基于指针的数据,结构,类,锁…) |
数据移动何时发生 | 在每一个offload指示的起始处用户拥有对数据传输的显式控制 | 在_Cilk_offload语句的起始和终止处同步所有_Cilk_shared数据 |
offload代码何时被拷贝到协处理器扩展卡 | 在第一个#pragma offload处 | 在程序启动时 |
用户可以根据自己的编程语言和数据结构选取合适的数据传输模型。更多关于如何使用英特尔编译器开发至强融核协处理器程序的信息请参见英特尔编译器用户参考手册的相关内容