Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading gfortran openmp无线程_Multithreading_Fortran_Openmp - Fatal编程技术网

Multithreading gfortran openmp无线程

Multithreading gfortran openmp无线程,multithreading,fortran,openmp,Multithreading,Fortran,Openmp,我有一个简单的Fortran代码,尽管使用了omp\u set\u num\u threads()子例程,但我无法设置线程数,即输出显示我只使用了1个线程。我还尝试了导出OMP\u NUM\u THREADS=4——没有结果 我不知道出了什么问题,这是一段代码: program test use omp_lib implicit none integer :: i, tnr,t call omp_set_num_threads( 4 ) t = omp_get_n

我有一个简单的Fortran代码,尽管使用了
omp\u set\u num\u threads()
子例程,但我无法设置线程数,即输出显示我只使用了1个线程。我还尝试了
导出OMP\u NUM\u THREADS=4
——没有结果

我不知道出了什么问题,这是一段代码:

  program test

  use omp_lib
  implicit none

  integer :: i, tnr,t 

  call omp_set_num_threads( 4 )
  t = omp_get_num_threads()

  write(*,*)'t:',t

  !$omp parallel
  !$omp do
  do i = 1, 20
     tnr = omp_get_thread_num()
     write( *, * ) 'Thread', tnr, ':',  i
  end do
  !$omp end do
  !$omp end parallel

  end program test
该代码的输出为:

 t:           1
 Thread           0 :           1
 Thread           0 :           2
 Thread           0 :           3
 Thread           0 :           4
 Thread           0 :           5
 Thread           0 :           6
 Thread           0 :           7
 Thread           0 :           8
 Thread           0 :           9
 Thread           0 :          10
 Thread           0 :          11
 Thread           0 :          12
 Thread           0 :          13
 Thread           0 :          14
 Thread           0 :          15
 Thread           0 :          16
 Thread           0 :          17
 Thread           0 :          18
 Thread           0 :          19
 Thread           0 :          20
谢谢你的任何提示

我使用GentooLinux,gcc-4.5.4编译器激活了
openmp
标志。cpu是第二代移动核心i7

ldd测试:

    linux-vdso.so.1 (0x00007fff85fce000)
    libgfortran.so.3 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/libgfortran.so.3      (0x00007fe310460000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fe310169000)
    libgomp.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/libgomp.so.1 (0x00007fe30ff5b000)
    libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/libgcc_s.so.1 (0x00007fe30fd45000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe30fb28000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe30f77d000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fe30f574000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe310749000)
gfortran-v

 Using built-in specs.
 COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/4.5.4/gfortran
 COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.4/lto-wrapper
 Target: x86_64-pc-linux-gnu
 Configured with: /var/tmp/portage/sys-devel/gcc-4.5.4/work/gcc-4.5.4/configure   --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.5.4 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.5.4 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.5.4/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.5.4/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/include/g++-v4 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --disable-fixed-point --without-ppl --without-cloog --disable-lto --enable-nls --without-included-gettext --with-system-zlib --enable-obsolete --disable-werror --enable-secureplt --enable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.5.4/python --enable-checking=release --disable-libgcj --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-targets=all --with-  bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.5.4 p1.0, pie-0.4.7'
 Thread model: posix
 gcc version 4.5.4 (Gentoo 4.5.4 p1.0, pie-0.4.7) 
testmp.f140t.optimized的输出(在*.statistics之前的输出):

;;功能测试(主)
测试()
{
结构参数dt参数1;
逻辑(种类=4)D.1545;
结构参数dt parm.0;
整数(种类=4)tnr;
整数(种类=4)t;
整数(种类=4)i;
整数(种类=4)i.8;
整数(种类=4)i.7;
整数(种类=4)i.6;
整数(种类=4)tnr.5;
整数(种类=4)i.4;
整数(种类=4)t.3;
:
omp_集合_num_线程(&C.1537);
t、 3_1=omp_get_max_threads();
t=t.3_1;
dt_parm.0.common.filename=&“testmp.f”[1]{lb:1 sz:1};
dt_parm.0.common.line=11;
dt_parm.0.common.flags=128;
dt_parm.0.common.unit=6;
_gfortran_st_write(&dt_parm.0);
_gfortran_transfer_字符(&dt_parm.0,&t:[1]{lb:1 sz:1},2);
_gfortran_transfer_integer(&dt_parm.0,&t,4);
_gfortran_st_write_done(&dt_parm.0);
i=1;
i、 4_2=i;

如果(i.4_2开始时,您必须使用

gfortran -fopenmp FILE

第二件事是,
omp\u get\u num\u threads()
显示您所在位置的线程数。当您在串行区域中调用此函数时,答案总是
1

设置
omp\u num\u threads
或调用
omp\u set\u num\u threads()
设置第n个变量ICV(内部控制变量)。要检索其值,应调用
omp\u get\u max\u threads()
,而不是
omp\u get\u num\u threads()

其次,代码中存在数据竞争。默认情况下,OpenMP将同时处理
tnr
t
共享变量。在这种情况下,
write
语句显示的
tnr
值将是执行赋值的最后一个线程中获得的值(注意,当涉及到共享变量时,GCC会抑制寄存器优化)

正确的代码如下所示:

program test

use omp_lib
implicit none

integer :: i, tnr,t 

call omp_set_num_threads( 4 )
t = omp_get_max_threads()

write(*,*)'t:',t

!$omp parallel do private(tnr)
do i = 1, 20
   tnr = omp_get_thread_num()
   write( *, * ) 'Thread', tnr, ':',  i
end do
!$omp end parallel do

end program test
请注意,当一个
do
构造立即被嵌套在
parallel
区域内时,可以使用组合的
parallel do
构造并保存两行代码


您已将Fortran 90代码存储在
.f
文件中,因此该文件被识别为固定源格式。在这种情况下,OpenMP指令必须遵守以下规则:

在固定格式的源文件中可以识别以下哨兵:

!$omp
|
c$omp
|
*$omp

Sentinel必须从第1列开始,并作为一个单词显示,没有中间字符。Fortran固定格式的行长、空格、延续和列规则适用于指令行。初始指令行在第6列中必须有空格或零,延续指令行必须有除空格以外的字符第6列中的空格或零。(强调)


我猜您的指令与程序代码的其余部分在同一列中开始,因此被简单地视为注释,而不是OpenMP指令,从
testmp.f.140t.optimized
文件的内容就可以看出。

您是否使用
gfortran-fopenmp…
?在gfortran-4.8上对我有效,但我移动了d
t=omp\u get\u num\u threads()
并行
区域。这段代码在Ubuntu 12.04和gfortran 4.6.3上运行,没有任何更改。我通过
gfortran-fopenmp-o“test\u omp”“test\u omp.f90”
@keyle-so“tnr”编译它也显示值0、1、2和3?使用gfortran 4.2.3、4.3.4、4.4.3、4.8.1和4.8.2进行了尝试。我无法复制您的发现。我使用“-fopenmp”编译代码。循环中有第二个函数“omp_get_thread_num()”,它应该显示实际使用的线程数,因此这个数应该从0…3(4个线程)更改,但正如您在输出中看到的,线程编号始终为“0”。如果没有指定
-fopenmp
,程序将无法链接。@Hristo这是什么意思?我如何指定-fopenmp?@nykon:您可以指定
-fopenmp
,正如Stefan在这个答案中以及我在对上述问题的评论中所写的那样。Hristo的意思是,如果编译器命令中没有
-fopenmp
,那么应该根本不编译。是的,这是正确的。如果我没有-fopenmp,那么代码就根本不编译。建议使用“omp_get_max_threads()”。但是“tnr”仍然为每个“I”显示“0”.现在我在kubuntu机器上尝试了这段代码,结果仍然是一样的:/假设您的可执行文件名为
test
。确实是
libgomp。所以
显示了
ldd test
的输出中的某个地方?看看我用一些额外的信息更新了它的帖子。@nykon,您是否有环境变量called
OMP\u THREAD\u LIMIT
设置为1?如何检查?在shell中键入“export”我得到了一个变量列表,但我没有看到变量OMP\u THREAD\u LIMIT。
program test

use omp_lib
implicit none

integer :: i, tnr,t 

call omp_set_num_threads( 4 )
t = omp_get_max_threads()

write(*,*)'t:',t

!$omp parallel do private(tnr)
do i = 1, 20
   tnr = omp_get_thread_num()
   write( *, * ) 'Thread', tnr, ':',  i
end do
!$omp end parallel do

end program test