标签: gfortran

在6核Intel Xeon中关闭超线程

我们得到了一个12核的MacPro来进行蒙特卡罗计算.它的Intel Xeon处理器启用了超线程(HT),因此实际上应该有24个进程并行运行以充分利用它们.但是,我们的计算效率比12x100%高出24x50%更高效,因此我们尝试Processor在系统首选项中通过窗格关闭超线程以获得更高的性能.人们也可以关闭HT

hwprefs -v cpu_ht=false
Run Code Online (Sandbox Code Playgroud)

然后我们进行了一些测试,这是我们得到的:

  1. 12个并行任务同时运行w /或没有HT让我们失望.
  2. 如果HT关闭,24个并行任务松散20%(不是我们想象的-50%)
  3. 当HT打开时,从24个任务切换到12个任务会使效率降低20%(同样令人惊讶)
  4. 当HT关闭时,从24切换到12不会改变任何东西.

似乎超线程只是降低了我们计算的性能,并且没有办法避免它.我们用于计算的程序是用Fortran编写的,并使用gfortran.有没有办法让这个硬件更高效?


更新:我们的蒙特卡罗计算(MCC)通常是分步进行的,以避免数据丢失和由于其他原因(并不总是可以避免这些步骤).在我们的例子中,每一步都包含许多具有可变持续时间的模拟.由于每个步骤在多个并行任务之间分割,因此它们也具有可变持续时间.基本上,所有更快的任务都必须等到最慢完成.这一事实迫使我们采取更大的步骤,由于平均而导致时间偏差减少,因此处理器不会浪费时间等待.这是我们拥有12*2.66 GHz而不是24*1.33 GHz的动机.如果可以关闭HT,那么通过从24个任务w/HT切换到12个没有HT的任务,我们可以获得大约+ 10%的性能.但是,测试表明我们松了20%.

对于测试,我使用了相当大的步骤,但通常步骤较短,因此效率变得更高.

还有一个原因 - 我们的一些计算需要3-5 GB的内存,因此您可能会看到我们有12个快速任务的经济性.我们正在努力实现共享内存,但它将成为一个冗长的术语项目.因此,我们需要了解如何尽可能快地制作现有的硬件/软件.

macos fortran intel gfortran hyperthreading

6
推荐指数
1
解决办法
6307
查看次数

如何让gfortran做INTEGER - LOGICAL转换

根据这个,gfortran可以进行整数逻辑转换,但是我收到了这个错误:

                  if (.not.bDropped.and.(zz_unif01() .lt. (1 - (Test_Dru
                           1
Error: Operand of .not. operator at (1) is INTEGER(4)
Run Code Online (Sandbox Code Playgroud)

我知道这将是更好的代码从改变.not.bDropped(bDropped.eq.0),但因为它生成的代码不会是简单的.

我试过各种各样的-std=xxx旗帜,但没有区别.

gfortran

6
推荐指数
1
解决办法
1287
查看次数

在Fortran中将逻辑类型转换为double

我正在寻找一种将逻辑类型变量转换为真实类型的防弹方式,这种方式可以在ifort和gfortran中使用.以下适用于ifort,但不适用于gfortran:

logical :: a
real :: b
a = .true.
b = dble(a)
Run Code Online (Sandbox Code Playgroud)

gfortran中抛出的错误是

b = dble(a)
         1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type
Run Code Online (Sandbox Code Playgroud)

显然,.true.应映射到1.d0和.false.到0.d0.这样做的最佳方法是什么?

fortran gfortran intel-fortran

6
推荐指数
2
解决办法
5004
查看次数

如何编译具有接口,模块和子例程的多文件夹Fortran Project

我是Fortran的新手.我正在研究一个研究项目,我正在使用一个开源项目,该项目有多个文件分布在多个文件夹中.我发现每个程序的依赖性,但无法弄清楚如何编译它们.

我的源代码分布在三个文件夹中.a)模块b)接口c)子程序

我想在子程序文件夹中运行一个名为'Main.f90'的程序,该程序依赖于来自模块和接口文件夹的源代码.

我正在使用eclipse进行文件夹结构和makefile进行编译.

对此有任何帮助表示赞赏.

更新: 我按照@MBR和@Stefan发布的答案,由于某种原因VPATH无法在源代码中找到程序,所以我明确地给了我的Makefile中的源文件夹路径.下面是我的make文件脚本.

    .PHONY: Mopac_exe clean

    # Change this line if you are using a different Fortran compiler
    FORTRAN_COMPILER = gfortran
    SRC = src

    #make main program 
    Mopac_exe: subroutines mopac.o
        $(FORTRAN_COMPILER) mopac.o *.o -O2 -g  -o bin/Mopac_exe  -I Modules/

    #compile all the subroutines
    subroutines: interfaces
        $(FORTRAN_COMPILER) -c $(SRC)/subroutines/*.F90 -J Modules/Subroutines/ -I Modules/

    #compiles all the interfaces
    interfaces: modules
        $(FORTRAN_COMPILER) -c $(SRC)/interfaces/*.f90 -J Modules/


     # build all the modules and generate .mod file in Modules …
Run Code Online (Sandbox Code Playgroud)

fortran module gfortran subroutine multifile

6
推荐指数
1
解决办法
3859
查看次数

强制CMake使用静态库

[无耻地从CMake帮助列表中交叉发布]

我正试图尽可能静态地创建二进制文件.我得到的fortran代码有X11和quadmath作为依赖项,我遇到了很多问题(可能每个问题都应该是一个不同的问题?):

  • 我的变量目前是

    set(CMAKE_LIBRARY_PATH /usr/X11/lib /usr/X11/include/X11 ${CMAKE_LIBRARY_PATH})
    find_package(X11 REQUIRED)
    find_library(X11 NAMES X11.a PATHS /usr/X11/include/X11/ /usr/X11/lib)
    find_library(X11_Xaw_LIB NAMES Xaw Xaw /usr/X11/include/X11/ /usr/X11/lib ${X11_LIB_SEARCH_PATH})
    find_library(Xaw Xaw7 PATHS ${X11_LIB_SEARCH_PATH})
    
    set(CMAKE_LIBRARY_PATH /usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/gcc/x86_64-linux-gnu/4.7/x32 /usr/lib/gcc/x86_64-linux-gnu/4.7/32 ${CMAKE_LIBRARY_PATH})
    
    find_library(quadmath NAMES quadmath.a)
    
    set(BUILD_SHARED_LIBS ON)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
    set(LINK_SEARCH_START_STATIC TRUE)
    set(LINK_SEARCH_END_STATIC TRUE)
    
    set(SHARED_LIBS OFF)
    set(STATIC_LIBS ON)
    
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
    
    Run Code Online (Sandbox Code Playgroud)

使用这些,CMake尝试静态地构建每个程序(如预期的那样) - 然而,它失败了因为我没有Xaw.a- 我无法确定这是否真的应该存在.我已经安装了libxaw7-dev我期望修复它的最新版本.一种选择是自己编译X11库,但我真的不想这样做......

  • 如果我只set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")注释掉,那么CMake会编译所有内容,但是每个程序都使用共享库,即使我.afind_library()调用中指定了X11库的位置.我期待CMake在可能的地方使用.a文件然后只使用共享库 - 有没有办法强制这种行为?

  • 有没有人知道这里描述的错误修复:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = …

gcc cmake static-libraries gfortran static-linking

6
推荐指数
1
解决办法
4852
查看次数

如何在Fortran中的字符变量中编写换行符?

我想在我的字符缓冲区变量中存储换行符buff.到目前为止我的代码是这样的:

       program TYPE_CHECK

c newline storage in buffer 
       character(100), dimension(10)  :: buff
       integer, dimension(10) :: x
       integer :: i

       do i=1,10
       x(i) = i
       enddo

       do j=1,10
       write(buff(j), 1) x(j), x(j)
 1     format(' This is line ', I3, /,
      *       ' This is newline ', I3)
       enddo

       do j=1,10
       write(*, "(A100)") buff(j)
       enddo

       end program TYPE_CHECK
Run Code Online (Sandbox Code Playgroud)

这会出现以下错误:

At line 13 of file myfoo6.F
Fortran runtime error: End of file
Run Code Online (Sandbox Code Playgroud)

fortran runtime-error gfortran

6
推荐指数
1
解决办法
8436
查看次数

MinGW/gcc:应用程序无法正常启动(0xc000007b)

我一直在使用MinGW和GNU Fortran编译器,以便在Windows上编译Fortran程序,这一直是一种成功的方法.但是,我在过去4天内收到以下错误:
The application was unable to start correctly (0xc000007b). Click OK to close the application.

该错误仅在运行我自己编写的应用程序时发生,并且我使用MinGW/gfortran组合编译.使用Visual Studio和iFort进行编译时,运行应用程序没有问题.这个错误似乎是追溯性的:很久以前使用gfortran编译并且运行完美的应用程序直到现在也会中断,即使我没有重新编译它们.这让我觉得它是一个动态库问题.在线搜索表明它可能是64位dll和32位应用程序之间的兼容性问题

我正在使用Windows 7.在开始解决问题之前我记得做的最新事情之一是尝试更新MinGW; 我使用了mingw-get update和mingw-get upgrade命令行.

在网上浏览后,我尝试了以下修复:
- 重新安装了Visual C++运行时环境
- 重新安装了.NET框架
- 下载并替换了一堆.dll,如mscvr100.dll,mscvr100d.dll等...
- 卸载并重新安装重新安装MinGW以确保我有最新的gcc版本
- 在一个简单的应用程序上运行Dependency Walker("Hello World!"类型程序)

Dependency Walker告诉我无法找到多个.dll(完整列表:API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL,API-MS-WIN-CORE-WINRT-ERROR-L1-1 -0.DLL,API-MS-WIN-CORE-WINRT-L1-1-0.DLL,API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL,API-MS-WIN-CORE -WINRT-STRING-L1-1-0.DLL,API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL,DCOMP.DLL,GPSVC.DLL,IESHIMS.DLL).
它还以红色突出显示了libquadmath-0.dll(libgfortran-3.dll似乎依赖于它).实际上,似乎libquadmath-0.dll是一个32位程序中间的64位DLL.当用Dependency Walker打开.dll时,我可以看到这个库中的所有模块都是x86,除了库本身是x64(DW的CPU列).我不确定这是如何可行的/如何解决它.该库位于Python/Anaconda文件夹中(几周前我安装了Python和Anaconda,当时没有出现问题).

如果有人知道如何在不重新安装Windows的情况下让环境再次运行,我将非常感激!谢谢!!

windows dll mingw gfortran windows-runtime

6
推荐指数
1
解决办法
5469
查看次数

GNU Fortran - 控制符号案例

有没有办法控制GNU Fortran 4.8发出的符号?

较旧的版本(例如3.4)分别使用了源和大写的情况-fcase-lower,-fcase-preserve并且-fcase-upper强制小写,但这些似乎已被丢弃.是否有一些新的控制方式?

编辑

我正在尝试将一个大型的,混合的C/Fortran代码库从英特尔编译器移植到GNU编译器.

我知道我们可以BIND(C, name='...')用来给出一个特定于案例的符号名称.但是,这还有其他影响.考虑这个C函数:

void print(char *str, size_t len) {
    for(int ii = 0; ii < len; ii++) {
        putchar(str[ii]);
    }
    putchar('\n');
}
Run Code Online (Sandbox Code Playgroud)

我们可以从这样的Fortran程序中调用它:

program test
    implicit none
    interface
        subroutine printstr(str)
            character :: str(*)
        end subroutine
    end interface

    call printstr("Hello, world.");
end
Run Code Online (Sandbox Code Playgroud)

如果C函数名称不是全部小写(PrintStr比如说),那么我们可能会尝试修复Fortran程序,如下所示:

program test
    implicit none
    interface
        subroutine printstr(str) bind(C, name='PrintStr')
            use iso_c_binding
            character :: str(*)
        end subroutine
    end interface

    call printstr("Hello, world.");
end
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为 …

fortran gfortran

6
推荐指数
2
解决办法
873
查看次数

纯函数指针

为了遍历Fortran中的链表,我使用指向当前元素的指针,该元素移动到循环内的下一个元素.尝试pure在对所述链表执行操作的函数内应用此操作会导致错误.

例:

module list
  implicit none

  ! Node
  type n_list
    integer               :: val
    type(n_list),pointer  :: next => NULL()
  end type

  ! Linked list
  type t_list
    type(n_list),pointer  :: head
  end type

contains

  pure function in_list( list, val ) result(res)
    implicit none
    class(t_list),intent(in)  :: list
    integer,intent(in)        :: val
    logical                   :: res
    type(n_list),pointer      :: cur

    res = .true.
    ! Traverse the list
    cur => list%head
    do while ( associated(cur) )
      if ( cur%val == val ) return 
      cur => cur%next
    enddo …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran intel-fortran

6
推荐指数
3
解决办法
532
查看次数

Fortran 2003-2008中是否有替代GETCWD()的方法

GNU Fortran编译器的GNU扩展提供了GETCWD()很好的子例程,获取当前工作目录.然而,我的代码必须是移植到ifortnagfor编译器,以及和我使用F2003功能.

那么,GETCWD()F2003及更高版本有替代品吗?

我在这里有标准,但它相当大,我现在已经经历了一段时间,并没有找到任何有用的东西......

fortran gfortran fortran2003 fortran2008

6
推荐指数
2
解决办法
1146
查看次数