1.主机端需要Xeon CPU;
2.主机端的操作系统建议使用RedHad Enterprise Linux 64-bit 6.2;
设备端是一个定制的嵌入式Linux,称作uOS,可以通过SSH进行访问。
3.需要利用MIC和OpenMP进行并行化编程处理,主要是找到需要并行的代码段并添加MIC相关的预编译指示行( 指导编译器对混合代码进行编译,如何传递数据,代码在主机CPU还是在设备上运行)。
4.在主机端和协处理器端运行的原始代码是一样的,没有2套代码,只不过编译器会编译2套代码,一套供协处理器运行,一套供主机运行。
5.可以使用c/c++或Fortran语言编写代码,使用专用的编译器icc进行编译。
6.其开发、调试工具Intel Composer XE 2013是需要购买的,windows版本1199美金,Linux版本1449美金。
7.OpenMP是用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive),其支持的编程语言包括C语言、C++ 和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
8.#pragma omp parallel for后面的reduction子句主要用来对一个或多个参数条目指定一个操作符,每个线程将创建参数条目的一个私有拷贝,在区域的结束处,将用私有拷贝的值通过指定的运行符运算,原始的参数条目被运算结果的值更新。
int i, sum = 100;
#pragma omp parallel for reduction(+: sum)
for ( i = 0; i < 1000; i++ )
{
sum += i;
}
9.MIC卡一般都有50个以上的物理核,同时每一个核上可以开启4个物理线程。
最佳线程数一般是每个物理核启动3个或4个线程。当然多些也是可以的,但如果太少反而加速效果不佳。
10.如果想在cpu与与MIC卡或MIC卡之间传输数据,可以采用SCIF接口,该接口是一种简单高效的对称传输接口,提供了一种机制可以让数据从协处理器通过PCI-E总线与CPU传输数据。其编程类同于网络socket编程,有scif_open(),scif_bind(),scif_listen(),scif_connect(),scif_accept(),scif_close()等API。
11.要在Microsoft Visual Studio 2012中使用OpenMP,只要在工程上右击鼠标,在弹出菜单中选择“属性”,在项目属性窗口中依次选择“C/C++”、“语言”、“OpenMP 支持”,选择“是 (/openmp)”(参数为/openmp),就可以让Microsoft Visual Studio 2012在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。
例子程序:
#include
#include
#define LEN 5000
int main(int argc,char *argv[])
{
int i;
float x=2;
float *arr=(float *)malloc(LEN*sizeof(float));
//用预编译指令告诉编译器下面这段代码在协处理器上运行
#pragma offload target(mic) out(arr:length(LEN))
//用预编译指令告诉编译器下面这段代码并行处理
#pragma omp parallel for
for(i=0; i
{
arr[i] = i*3.0f/x;
}
return 0;
}
看了上面的这些知识点,也就可以大概知道是否可以采用这种技术将代码移植到Intel Xeon Phi中运行了。熟悉Linux编程吗?有这些硬件吗?具备学习MIC编程的能力吗?能使用VTune分析出程序中耗时最多的函数吗?如何优化?这需要一个系统的判断、处理过程。