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位作为操作字长。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值