openmp+fortran程序,双重do循环外面都加并行,结果好像并行了,但是threadid都是0,请问到底并行没有?

作者&投稿:成王侮 (若有异议请与网页底部的电邮联系)
openmp并行计算,同一个程序有时候结果不一样是为什么?~

你的#pragma omp parallel
{
#pragma omp for
for(int j=0;j<100;j++)
{
sum1++;
}
}
应该改成
#pragma omp parallel for reduction(+:sum1)
for(int j=0;j<100;j++)
{
sum1++;
}

我给过一个详细完整的例子说明“归约(reduction)”的用法,
参见:http://zhidao.baidu.com/question/146454227

OpenMP像这种单层循环的就直接写就行了。
!$OMP DO do i = 1, 1000 ... enddo!$OMP END DO

  • OpenMP的嵌套并行在默认情况下为false。

假如有第一层(外层)、第二层(内层)两层并行,默认情况下,第一层并行制导语句会创建线程组,将外层循环实现线程并行化,但第二层制导语句不会创建多个线程,而是将其所包含的代码会在外层线程组中的每一个线程里串行执行。


如外层的0号线程执行到内层并行制导语句处,在0号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即0号线程内的主线程,其线程号也为0;

同理,如外层的1号线程执行到内层并行制导语句处,在1号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即1号线程内的主线程,其线程号也为0;


你把获取线程号的库函数OMP_GET_THREAD_NUM()放在内层循环,这样默认情况下其获得的线程号永远都是0。


  • 实现并行嵌套的方法

若要并行区域A内可以再嵌套并行区域B,需要在并行区域A外面激活并行嵌套,如下:

OMP_set_nested(1)

!$OMP PARALLEL DO
     DO I=1,10
!$OMP PARALLEL DO
        DO J=1,10
     WRITE(*,10)I,J,OMP_GET_THREAD_NUM()
10    FORMAT(1X,'I=',I2,'J=',I2,'ID=',I3)
        ENDDO
!$OMP END PARALLEL DO
     ENDDO
!$OMP END PARALLEL DO



你没有设置线程数?


竹溪县17341964172: 如何利用OpenMP对Fortran95程序并行计算,非常感谢! -
赤肿欧耐: 不知道你用的是哪个版本的编译器,不同的编译器设置的方法不同,以vs2008为例 中文 工程属性-〉C++-〉语言-〉OpenMP支持-〉ON 英文:Property-〉C++-〉Language-〉SupportOpenMP-〉ON 之后代码中加入 include 'omp_lib.h' 然后在do循环之前加入!$OMP PARALLEL DO 就可以了,可以通过查看cpu的利用率来看看有没有成功,如果双核的能够达到50%以上说明并行成功.

竹溪县17341964172: 请看看则个fortran结合openmp并行程序,为什么老出错? -
赤肿欧耐: 才发现你这源程序混合了C、F77、F95三种语法…… 而且没有恰当使用private保护变量或者reduction.正确的写法(F95+OpenMP):program sct use omp_lib implicit none integer k,dct dct=0 !$OMP parallel do reduction(+:dct) do k=1,1000 dct=dct+1 enddo !$OMP end parallel do write(*,*)"dct=", dct pause end program sct

竹溪县17341964172: openmp+fortran,为什么串行和并行结果不同,怎么修改?其中c1是已经存在的矩阵,c2初始化为0 -
赤肿欧耐: 没看懂你要实现什么功能?只是想把c1加到c2上的话,去掉reduction,私有化j就行,如下:!$omp parallel do private(j) do i=1,5 do j=1,6 c2(i,j)=c2(i,j)+c1(i,j) enddo enddo!$omp end parallel do

竹溪县17341964172: 用fortran语言进行高斯消去法的openmp的并行编写,但是结果却不正确,求解 -
赤肿欧耐: 并行程序段中,要求前后左右计算没有关联.比如你要对屏幕上的任何一个点与字符A做异或运算,这些点的运算之间是没有关联的,这时你可以安排进行并行计算.

竹溪县17341964172: fortran如何实现并行计算 -
赤肿欧耐: 实现并行的方式有很多种 从硬件上分为 CPU 并行和GPU 并行 CPU 并行目前主要有: 1. 进程级适用于分布内存的MPI 并行(参考书 百度 都志辉) 2. 线程级别的openmp (参考书:百度 fortran openmp) 需要注意的是 MPI 相对底层一点,...

竹溪县17341964172: 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表示线程

竹溪县17341964172: 运行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单核则分时多线程执行.

竹溪县17341964172: 并行计算mpich支持多核心计算机吗? -
赤肿欧耐: MPI是Message Passing Interface的简称,它是一种并行计算的标准接口,而不是库或者程序语言.目前广泛使用的MPI实现包括MPICH,OpenMPI,MVAPICH,IntelMPI等.这些MPI接口实现都支持多核计算机,推荐使用Linux操作系统上运行和使用,效率更高.

竹溪县17341964172: 用fortran实现以下功能 -
赤肿欧耐: program main !solve a problem !输入某班30个同学的fortran成绩后:1、将所有人的成绩输出.(动态数组输入输出)2、求出该班平均成绩.(外部函数) !3、输出班内成绩及格和不及格的人数. implicit none integer i,sum,c,d,num...

竹溪县17341964172: 大家好,由于一些原因,本人需要接触Fortran,有如下疑问. -
赤肿欧耐: 2)Fortran77、6个空格的是fixed格式,不是Free格式.强烈推荐你使用fortran90 free格式,并行效率更高.fortran77 fixed格式已是old-fashion.你可以在这方面做些功课.每行限度为72列,一般都不够用的,不过在编译时加上,-extend-source...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网