在offload编译模式下Intel编译器的offload运行时系统提供了两种机制让主机CPU程序对协处理器上的执行环境进行控制:
- 在主机系统上设置环境变量,然后将这些环境变量传递到协处理器上
- 在主机程序中调用相应的运行环境控制函数
环境变量:
缺省情况下,当offload发生时运行时系统会把主机程序执行环境中的所有环境变量全部复制到协处理器的执行环境中。用户可以通过定义环境变量“MIC_ENV_PREFIX”的值来改变这一默认行为。当该环境变量被赋予某个特定值之后,offload运行时系统将不再复制全部主机环境变量,而改为只复制那些以“MIC_ENV_PREFIX”的值加上下划线为前缀的那些环境变量;而且,在协处理器执行环境中对应的环境变量将不会保留这些前缀。通过这种方式,用户就可以在主机系统和协处理器上对同一名字的环境变量使用不同的值。例如在主机系统中已如下方式设置环境变量:
MIC_ENV_PREFIX=ABC
OMP_NUM_THREADS=8
ABC_OMP_NUM_THREADS=124
那么主机上的OMP_NUM_THREADS被设置成8,而对协处理器上执行的offload代码而言其执行环境中的OMP_NUM_THREADS将被设置为124.
Offload运行时系统还支持对特定的设备指定不同的环境变量值,其指定方式为在“MIC_ENV_PREFIX”前缀和环境变量名中加上协处理器号。例如,对于上面的例子如果设置OMP_NUM_THREADS的方式改为:
MIC_ENV_PREFIX=ABC
OMP_NUM_THREADS=8
ABC_4_OMP_NUM_THREADS=124
那么主机上的MP_NUM_THREADS被设置成8,第5个协处理器上的OMP_NUM_THREADS值被设置成124,而其他协处理器上的OMP_NUM_THREAD将不被设置。
如果需要一次对协处理器指定多个环境变量,还可以采用下面的简化模式:
mic_prefix_VAR=variable1=value1|variable2=value2|variable3=value3|...
或
mic_prefix_card_number_VAR=variable1=value1|variable2=value2|variable3=value3|...
其中的card_number为协处理器号。
运行环境控制函数:
某些CPU运行环境控制API函数具有对等的offload控制版本,区别在于增加了两个额外的参数:
target_type: 设备类型。目前推荐使用预定义的值“DEFAULT_TARGET_TYPE”
target_number: 设备编号。
使用这些API函数之前要包含相应的头文件”offload.h”。例如用于设置OpenMP线程数目的API,两种形式分别为:
CPU API:void omp_set_num_threads (int num_threads);
Offload API: void omp_set_num_threads_target (TARGET_TYPE target_type, int target_number, int num_threads);
更多关于如何使用英特尔编译器开发至强融核协处理器程序的信息请参见英特尔编译器用户参考手册的相关内容。