如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算

如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算,第1张

1、icc

Intel C/C++编译器接受遵守ANSI C/C++ , ISO C/C++ standards,GNU inline ASM for IA-32 architecture标准的输入。与linux下常用的gcc兼容并支持更大的C语言扩展,包括源文件、命令行参数、目标文件。不支持gcc的inline方式的汇编。例,fc

#include<stdioh>

int main(int argc, char argv[]){

printf("Hello\n");

return 0;

}

编译:icc -c fcpp -o fo

链接:icc fo -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)兼容。例,ff90

program f

print , "Hello"

stop

end

编译:ifort -c ff90 -o fo

链接:ifort fo -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 option tpp7 (Linux) or G7 (Windows) is valid

About tpp:

>

openmp并行程序在多核linux上最大化使用cpu的方法如下:

#include <stdioh>

#include <stdlibh>

#include <omph>

#include <timeh>

int main()

{

    long long i;

    long double sum = 0;

    long double sec = 0;

    // Multi-thread compute start

    clock_t t1 = clock();

    #pragma omp parallel for

    for (i = 0; i < 1000000000; i++)

    {

        sum += i/100;

    }

    clock_t t2 = clock();

    sec = (t2 - t1);

    //sec = (t2 - t1);

    printf("Program costs %2Lf clock tick\n", sec);

    exit(EXIT_SUCCESS);

}

以上代码中,#pragma omp parallel for

这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i < 1000000000; i++)这个循环执行过程平均分配给每一个CPU核心。

去掉#pragma omp parallel for这行,则和普通的串行代码效果一致。

注意,要使用openmp功能,在编译的时候需要加上-fopenmp编译参数。

以下是两种编译搭配两种代码出现的4种结果,可以很直观地看到效果:

1、代码里含有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi testc

Endys-MacBook-Pro:Desktop endy$ gcc-6 testc -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ /test

Program costs 5020261100 clock tick

2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ gcc-6 testc -o test

Endys-MacBook-Pro:Desktop endy$ /test

Program costs 406817800 clock tick

3、代码里没有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi testc

Endys-MacBook-Pro:Desktop endy$ gcc-6 testc -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ /test

Program costs 409074400 clock tick

4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi testc

Endys-MacBook-Pro:Desktop endy$ gcc-6 testc -o test

Endys-MacBook-Pro:Desktop endy$ /test

Program costs 417009300 clock tick

可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。

值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。

在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?

OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:

1 if子句的结果

2 num_threads的设置

3 omp_set_num_threads()库函数的设置

4 OMP_NUM_THREADS环境变量的设置

5 编译器默认实现(一般而言,默认实现的是总线程数等于处理器的核心数)

(查看更多信息)

2、3、4优先级依次降低的,也就是前面的设置可以覆盖后面的设置,当然也是相对而言,num_threads子句只会影响当前的并行区域,而omp_set_num_threads对OMP_NUM_THREADS环境变量的覆盖是在整个程序运行期间全局的。

(2)几个容易混淆的OpenMP函数

1 omp_get_thread_num

获取线程的num,即ID。这里的ID是OpenMP的team内的ID,在OpenMP中,一个team内的线程的ID是俺顺序排列的,0、1、2

说明:此函数在并行区域外或者并行区域内都可以调用。在并行区域外,获取的是master线程的ID,即为0。在并行区域内,每次执行到此函数,获取的是当前执行线程的ID。

不知道你用的是哪个版本的编译器,不同的编译器设置的方法不同,以vs2008为例

中文

工程属性-〉C++-〉语言-〉OpenMP支持-〉ON

英文:

Property-〉C++-〉Language-〉SupportOpenMP-〉ON

之后代码中加入

include 'omp_libh'

然后在do循环之前加入

!$OMP PARALLEL DO

就可以了,可以通过查看cpu的利用率来看看有没有成功,如果双核的能够达到50%以上说明并行成功。

以上就是关于如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算全部的内容,包括:如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算、OpenMP程序在Linux与Windows下的加速性能差异很大,这是为什么、C++ openmp并行程序在多核linux上如何最大化使用cpu等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9528287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存