天天看點

linux ifort編譯指令,[轉載][Linux] icc與ifort編譯器

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位作為操作字長。