1、icc
Intel C/C++編譯器接受遵守ANSI C/C++ , ISO C/C++
standards,GNU inline ASM for IA-32
architecture标準的輸入。與linux下常用的gcc相容并支援更大的C語言擴充,包括源檔案、指令行參數、目标檔案。不支援gcc的inline方式的彙編。例,f.c
#include
int main(int argc, char*
argv[]){
printf("Hellon");
return 0;
}
編譯:icc -c f.cpp -o
f.o
連結:icc f.o -o
f
運作:./f
注意,編譯與連結都由icc來完成,icc常用指令行參數:
-o 輸出檔案命名
-I include路徑
-L lib路徑
-l 包含的lib名
-c 僅生成目标檔案(*.o),不連結
-On n=0,1,2,3
編譯器優化選項,n=0關閉編譯器優化,n=3使用最激進的優化
-c99[-]
打開/關閉 c99規範的支援
詳細的請參照icc的manpage.
2、ifort
Intel Fortran編譯器支援F77/90/95标準并與CFV(Compaq Visual Fortran)相容。例,f.f90
program f
print *, "Hello"
stop
end
編譯:ifort
-c f.f90 -o f.o
連結:ifort f.o -o
f
運作:./f
編譯與連接配接同樣由ifort來完成,ifort常用指令行參數:
-o 輸出檔案命名
-I include路徑
-L lib路徑
-l 包含的lib名
-c 僅生成目标檔案(*.o),不連結
-On n=0,1,2,3
編譯器優化選項,n=0關閉編譯器優化,n=3使用最激進的優化
-std90 使用F90标準編譯
-std95 使用F 95标準編譯
-f77rtl 編譯使用F77運作方式的代碼(用于解決特殊問題)
These options optimize application performance for a particular
Intel® processor or family of processors. The compiler generates
code that takes advantage of features of the specified
processor.
Option
Description
tpp5 or G5
Optimizes for Intel® Pentium® and Pentium® with MMX™ technology
processors.
tpp6 or G6
Optimizes for Intel® Pentium® Pro, Pentium® II and Pentium® III
processors.
tpp7 or G7
Optimizes for Intel® Pentium® 4, Intel® Xeon™, Intel® Pentium® M
processors, and Intel® Pentium® 4 processors with Streaming SIMD
Extensions 3 (SSE3) instruction support.
On Intel® EM64T systems, only optiontpp7(Linux)
orG7(Windows)
is valid.
About tpp:
ifort編譯器提供了非常多的優化參數
$ ifort --help | more檢視就可以
也可以定位到某個參數
$ifort --help | grep -5 '-mkl'
-5表示顯示查找到的行及下面5行的内容。
3、Intel MKL數學庫針對Intel系列處理器進行了專門的優化,主要包含的庫有:
基本線形代數運算(BLAS)
向量與向量、向量與矩陣、矩陣與矩陣的運算
稀疏線形代數運算
快速傅立葉變換(單精度/雙精度)
LAPACK(求解線形方程組、最小方差、特征值、Sylvester方程等)
向量數學庫(VML)
向量統計學庫(VSL)
進階離散傅立葉變換
編譯:
icc multi.c -I/opt/intel/mkl/include
–L/intel/mkl/lib –lmpi_ipf –o multi
4、MPI程式編譯
消息傳遞接口(MPI)并行程式設計模型程式的編譯指令。例,f.c
include
#include
main(argc,argv)
int argc;
char *argv[];
{
char name[BUFSIZ];
int length;
MPI_Init(&argc,&argv);
MPI_Get_processor_name(name,
&length);
printf("%s: hello worldn", name);
MPI_Finalize();
}
編譯與連接配接均使用mpicc,參數與mpicc中定義的編譯器相同,這裡與icc相同。
mpicc –c hello.c –o
hello.o
mpicc hello.o –o
hello
運作使用mpirun 指令,将運作需要的節點定義在檔案中并在-machinfile中制定。
檔案: nodelist
node1
node1
node2
node3
運作:
$mpirun –machefile nodelist –np 4
./hello
node1: hello world
node1: hello
world
node2: hello
world
node3: hello
world
5、32位向64位的移植
32位程式到64位移植中應注意的常見問題:
資料截斷:
由于long類型變量的運算(指派、比較、移位等)産生。long定義在x86上為32bits,而在ia64上為64bits.容易在與int型變量運算時出現異常。
處理方法:盡量避免不同類型變量間的運算,避免将長度較長的變量指派到較短的變量中,統一變量長度可以解決這個問題。簡單的對于32位轉移到64位可以将所有long定義轉換為int定義。
指針存儲:
在x86平台下,習慣使用int來存儲指針,并将指針直接參與到int型的運算中,而64位平台下指針大小為64bits,無法存儲到int中。對指針的運算也可能會因為資料長度的不一緻導緻異常。
處理方法:修改用于存儲傳遞指針的變量為intptr_t 類型定義,以保證平台相容性
不規範的結構:
未命名或為指定數量的成員可能會出現異常
處理方法:命名未命名的成員,聲明類型符号,将long型定義轉為int型。
代碼中的直接數
直接使用16進制數字進行指派時(一般會隐含假設該變量為32位變量的前提)
可能出現異常。使用數字定義資料大小,進行移位運算時會出現異常。
處理方法:檢查代碼中的直接數字是否有表示32位有關的各種形式,如4,32,0x7fffffff等,替換為宏定義。
編寫代碼時注意可移植化:
在32位與64位下使用同樣的頭檔案
使用嚴禁的格式定義,如:用off_t定義偏移量,用fpos_t定義檔案位置, intptr_t定義指針
使用中定義的整數類型,不使用int,long,long
long的傳統定義方式。使用帶有整形标示符參數的printf函數,不使用%d,%ld的格式化方式。
使用固定寬度或宏定義的整數類型,數字,掩碼
對整形變量作邊界檢查。
32位與64位程序共享記憶體操作時,使用64位作為操作字長。