openmp编译
⑴ 开始尝试在 Win7 下使用 OpenMP 编写 fortran 并行程序
备忘:
教程: Parallel Programming in Fortran 95 using OpenMP
使用 OpenMP 应该算是一种比较简单的并行方式,用
将需要并行的部分放进去就行了。
gfortran 编译的话使用 -fopenmp 选项即可
如果不是并行程序的话,仅仅会输出一次,但是这里输出了 4 次,因为有四个线程。而教程中也对这个做了解释:
Since the code enclosed between the two directives is executed by each thread, the message Hello appears in the screen as many times as threads are being used in the parallel region.
不知道那个控制台的图标为啥变成了四个红点,是不是点的个数表示线程数呢?
One of the aims of the OpenMP standard is to offer the possibility of using the same source code lines with an OpenMP-compliant compiler and with a normal compiler. This can only be achieved by hiding the OpenMP directives and commands in such a way, that a normal compiler is unable to see them. For that purpose the following two directive sentinels are introced: !$OMP & !$
需要注意的是 !$OMP 前面不能出现非空字符,否则将会被认为是普通的注释。OMP的这种方式可以很巧妙地使得程序能够在所有的编译器上运行,如果不支持OMP的话就当作普通的注释,如果支持那么这些就会起作用。另外 指令后面有一个空格,这个主要是为了 指令和后面的语句分隔开。这个空格是强制添加的,否则将作为普通注释来处理。
OMP 的指令行支持续行,和 fortran 没多大区别,只要记得每一行都有指令符号就行了。
暂时就学了这么点。。。
⑵ C++ openmp并行程序在多核linux上如何最大化使用cpu
openmp并行程序在多核linux上最大化使用cpu的方法如下:
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#include<time.h>
intmain()
{
longlongi;
longdoublesum=.0;
longdoublesec=.0;
//Multi-threadcomputestart
clock_tt1=clock();
#pragmaompparallelfor
for(i=0;i<1000000000;i++)
{
sum+=i/100;
}
clock_tt2=clock();
sec=(t2-t1);
//sec=(t2-t1);
printf("Programcosts%.2Lfclocktick. ",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 test.c
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp
Endys-MacBook-Pro:Desktop endy$ ./test
Program costs 50202611.00 clock tick.
2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test
Endys-MacBook-Pro:Desktop endy$ ./test
Program costs 4068178.00 clock tick.
3、代码里没有#pragma omp parallel for,编译参数有-fopenmp
Endys-MacBook-Pro:Desktop endy$ vi test.c
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp
Endys-MacBook-Pro:Desktop endy$ ./test
Program costs 4090744.00 clock tick.
4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp
Endys-MacBook-Pro:Desktop endy$ vi test.c
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test
Endys-MacBook-Pro:Desktop endy$ ./test
Program costs 4170093.00 clock tick.
可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。
值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。
⑶ 求《OPENMP编译原理及实现技术》全文免费下载百度网盘资源,谢谢~
《OPENMP编译原理及实现技术》网络网盘pdf最新全集下载:
链接:https://pan..com/s/122Xvd3cLwtzPFlh9XrJLUA
简介:OpenMP制导指令将C语言扩展为一个并行语言,但OpenMP本身不是一种独立的并行语言,而是为多处理器上编写并行程序而设计的、指导共享内存,OpenMP编程模型以线程为基础,通过编译制导指令来显示地指导并行化
⑷ MPI+Openmp的程序用什么命令来实现编译和运
在LINUX上要GCC 4.1并要安装MPI软件包,命令是:比如是CPI.c的原文件,那么如下:
编译:/usr/local/bin/mpicc -o CPI CPI.c -fopenmp
执行:/usr/local/bin/mpirun -np 4 CPI 8 //4表示4台机器,8表示线程
⑸ 正在学习在Code Blocks中使用OpenMP,但是编译时出现了ignoring #pragma omp parallel
这是因为gcc在链接的时候默认不链接openMP。
在编译命令中添加 -fopenmp 就可以解决了。
例扒裤此如使用gcc <春迅source-name> -o <output-name>纯枝 -fopenmp
⑹ CUDA与OPENMP连用时,怎么编译
但是在CUDA模板中没有开启openmp支持选项,之前参考了“在 -Xcomplier 后面增加了 "/openmp"选项。”无效果,我的实际语句为(去掉路径)nvcc.exe" -G -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --machine 32 -ccbin "D:\Program Files\Microsoft Visual Studio 9.0\VC\bin" -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /W3 /nologo /Od /Zi /MTd /openmp" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\\include" -maxrregcount=0 --compile -o "Debug/cudaOpenMP.cu.obj" cudaOpenMP.cu
⑺ 如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算
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<stdio.h>
int main(int argc, char* argv[]){
printf("Hello\n");
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 option tpp7 (Linux) or G7 (Windows) is valid.
About tpp:
http://www.ncsa.illinois.e/UserInfo/Resources/Software/Intel/Compilers/9.0/main_for/mergedProjects/copts_for/common_options/option_tpp567_g567.htm
https://wiki.ke.e/display/SCSC/Compilers+and+Libraries
Intel Fortran Compiler Options: http://geco.mines.e/guide/ifort.html
Intel(R) Fortran Compiler Options: http://www.rcac.pure.e/userinfo/resources/common/compile/compilers/intel/man/ifort.txt
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<stdio.h>
#include<mpi.h>
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 world\n", 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定义。
⑻ 运行openmp需要安装什么软件
不需要什么额外的软件!
现在最新版的C、C++、局笑Fortran编译器基本上都内置OpenMP支持。
比如gcc、g++、gfortran(GCC套件4.2版之后开始支持)
Intel C++ compiler、Intel Fortran compiler
Microsoft visual C++ (版本8.0或者叫2005之后开始支持)
由支持OpenMP的编译器编译出来的可执行文件可以独立运行,
不再需要额外的什么支持,它会根据源代码里面指定卖腊正的线程数生成相中悔应线程,
在SMP主机上分布在多个CPU或者多核心上执行,单CPU单核则分时多线程执行。
⑼ 一、简述openmp编译制导指令master,single,critical,atomic的功能
参考http://technet.microsoft.com/en-us//library/2kwb957d(v=vs.110).aspx
1.critical:每次允许一个线程执行
2.single:只由一个线程执行一次
3.automic:功能类似critical,不过所属指令为简单的表达式,这样减少开销
4.master:仅由主线程执行
5.omp_set_num_threads:设置线程数,用在程序中
6.omp_get_num_threads:获取线程总数
7.omp_get_thread_num:获取当前线程序号id
8.OMP_NUM_THREADS:环境变量级别的线程总数限定,优先级最低,omp_set_num_threads是程序级别的,优先级较高;子句num_threads(i)是block级别,优先级最高
最近也在学