linuxifort编译命令,[转载][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常⽤命令⾏参数:gnu编译器
-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 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)
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位作为操作字长。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论