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級別,優先順序最高
最近也在學