Ⅰ 編寫C#程序有必要使用OPENMP嗎
「OpenMP是由OpenMP Architecture Review Board牽頭提出的,並已被廣泛接受的,用於共享內存並行系統的多線程程序設計的一套指導性注釋(Compiler Directive)。OpenMP支持的編程語言包括c語言、C++和Fortran;而支持OpenMP的編譯器包括Sun Compiler,GNU Compiler和Intel Compiler等。」 所以說C#你不需要用這個,因為它不支持C#
Ⅱ c語言 openmp 程序編譯不了 求大牛解答
我去=。=你大學的?
Ⅲ 求C語言程序:Openmp並行、求一維數組最大值與相應位置
#include<omp.h>
structMyData
{
unsignedintvalue;
unsignedintindex;
};
staticstructMyDataTest(unsignedint*p,unsignedintlength)
{
#pragmaompparallelfor
unsignedinti=0,res=0,j=0;
boolflag=false;
structMyDatad={0};
for(i=0;i<length-1;i++)
{
flag=false;
if(p[i]<p[i+1])
{
res=p[i+1];
flag=true;
}
if(flag)
{
j=i+1;
}
}
d.value=res;
d.index=j;
returnd;
}
Ⅳ 請問C語言或者c++如何將for循環改為並行執行
這個貌似不行,for循環都是一次循環執行結束,然後判定條件,再決定是否進入下次循環的。
Ⅳ 哪位大神能給我說說openmp本人大一,剛學c語言,我們班主任讓我們做這個,給教程了,但是完全看
現在是大一的話就是上學期,就用OPENMP,不理解
基本使用編輯
要在Visual C++2005 中使用OpenMP其實不難,只要將 Project 的Properties中C/C++里Language的OpenMP Support開啟(參數為 /openmp),就可以讓VC++2005 在編譯時支持OpenMP 的語法了;而在編寫使用OpenMP 的程序時,則需要先include OpenMP的頭文件:omp.h。
而要將 for 循環並行化處理,該怎麼做呢?非常簡單,只要在前面加上一行
#pragma omp parallel for
就夠了!
也可以實際用一段簡單的程序,來弄清楚它的運作方式。
#include <STDIO.H>
#include <STDLIB.H>
void Test(int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
for(int i = 0; i < 10; ++i)
Test(i);
system("pause");
}
上面的程序,在 main() 是一個很簡單的迴圈,跑十次,每次都會調用Test()這個函數,並把是迴圈的執行次數(i)傳進Test() 並列印出來。想當然,它的結果會是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 裡面的迴圈平行化處理呢?只需要修改成下面的樣子:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void Test (int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
#pragma omp parallel for
for(int i = 0; i < 10; ++i)
Test( i );
system("pause");
}
夠簡單吧?重頭到尾,只加了兩行!而執行後,可以發現結果也變了!
0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
可以從結果很明顯的發現,他沒有照著0到9的順序跑了!而上面的順序怎麼來的?其實很簡單,OpenMP只是把迴圈 0 - 9 共十個步驟,拆成 0 - 4, 5 - 9 兩部份,丟給不同的執行緒去跑,所以數字才會出現這樣交錯性的輸出~
而要怎麼確定真的有跑多執行緒呢?如果本來有多處理器、多核心處理器或有 Hyper Thread 的話,一個單執行緒程序,最多隻會把一顆核心的使用量吃完;像比如說在 Pentium 4 HT 上跑,單一執行緒的程序,在工作管理員中看到的 CPU使用率最多就是 50%。而利用 OpenMP 把迴圈進行平行化處理後,就可以在執行迴圈時,把兩顆核心的 CPU 都榨光了!也就是CPU使用率是100%。
Ⅵ 在Linux進行C語言編程的時候,程序里使用了mpi或者openmp或者都使用了該怎麼進行編譯執行謝謝
mpi是一個並行計算的東西,使用的是mpicc,mpic++來進行編譯,例如
$ mpicc hello.c -o hello
$ ./hello
Ⅶ 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的c library gcc可以直接編譯嗎
openmp的c library gcc可以直接編譯
mpi或者openmp
這個,你指的是庫?
如果是的話,編譯時,加上鏈接庫的編譯選項就可以。
比如 gcc -hello.c -o hello -lm -lxml -L/usr/local/lib -lts
-lm 鏈接了math庫
-lxml鏈接了xml庫
-L/usr/local/lib -lts 鏈接了ts庫,ts庫存在目錄/usr/local/lib中
以下以共享庫為例: 1) 直接鏈接 gcc xxx.c ./libmylib.so 2) 配置環境變數 LIBRARY_PATH,把庫所在的路徑配置進去 gcc xxx.c -lmyku 3) 雙l配置 gcc xxx.c -lmyku -L./ 靜態庫的鏈接方法和共享庫一致
Ⅸ 如何在命令行中使用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定義。
Ⅹ 並行共軛梯度演算法實現C語言代碼---共享式(openMP)、GPU
你好,很高興為你解答。
參考如下:http://www.cnki.com.cn/Article/CJFD1998-NJHK805.007.htm
答題不易,相互理解,相互幫助
如有其他問題,可以繼續追問哦