标签: fortran

Fortran固有的时序例程,哪个更好?cpu_time或system_clock

在为FORTRAN程序计时时,我通常只使用该命令call cpu_time(t).
然后我偶然发现call system_clock([count,count_rate,count_max])它似乎在做同样的事情.但是,在一个更难的庄园.我对这些的了解来自:旧的英特尔文档.
我无法在英特尔的主页上找到它.请参阅下面的标记.

  1. 哪个更准确,还是相似?
  2. 其中一个是否计算缓存未命中(或其他类型)而另一个没有,或者执行其中任何一个?
  3. 或者唯一的区别是我的标记下面标记的东西?

这些是我的问题,下面我提供了一些代码供您查看一些时间和用法.他们向我展示了它们在输出方面非常相似,因此在实现方面似乎相似.
我应该注意,我可能会一直坚持cpu_time,而且我并不需要更精确的时间.

在下面的代码中,我试图比较它们.(我也尝试了更精细的东西,但为了保持简洁而不会供应)所以基本上我的结果是:

  • cpu_time
    1. 更容易使用,您不需要初始化调用
    2. 差异的直接时间
    3. 也应该是编译器特定的,但是没有办法看到精度.(标准是毫秒)
    4. 是线程时间的总和.不推荐用于并行运行.
  • system_clock
    1. 需要预先初始化.
    2. 后进程,以分界的形式.(小事,但仍有区别)
    3. 是编译器特定的.在我的电脑上发现以下内容:
      • 由于INTEGER精度,英特尔12.0.4的计数率为10000 .
      • gcc-4.4.5使用1000,不知道这是如何区分的
    4. 容易遇到包装,即如果c1 > c2,由于count_max
    5. 是时间从一个标准时间.因此,这将产生一个线程的实际时间而不是总和.

码:

PROGRAM timer
  IMPLICIT NONE
  REAL :: t1,t2,rate 
  INTEGER :: c1,c2,cr,cm,i,j,n,s
  INTEGER , PARAMETER :: x=20000,y=15000,runs=1000
  REAL :: array(x,y),a_diff,diff

  ! First initialize the system_clock
  CALL system_clock(count_rate=cr)
  CALL system_clock(count_max=cm)
  rate = REAL(cr)
  WRITE(*,*) "system_clock rate ",rate …
Run Code Online (Sandbox Code Playgroud)

fortran timer

26
推荐指数
2
解决办法
3万
查看次数

如何在Sublime Text 2中为Fortran 90获得正确的文本颜色突出显示?

在sublime论坛上有几个链接,关于如何让Sublime Text 2与Fortran 90一起工作http://www.sublimetext.com/forum/viewtopic.php?f=4&t=770,但他们没有似乎很适合作为评论标识符"!" 没有得到很好的待遇.

我使用原始建议的Punchcard.tmLanguage文件快速组装了一个解决方案,并修改了字典中的第一个块来处理"!" 作为评论(可在此处获得:https://gist.github.com/4209445).

Sublime Text 2是一个出色的文本编辑器,它支持Fortran可能对理论物理和金融领域的许多人有所帮助.如果有人知道更好的解决方案,请告诉我.

谢谢!

fortran fortran90 sublimetext2

26
推荐指数
2
解决办法
2万
查看次数

替换极其缓慢的pow()函数

我们有一个CFD求解器,在运行模拟时,发现它在某些机器上运行速度非常慢,而在其他机器上却运行得非常慢.使用英特尔VTune,发现以下行是问题(在Fortran中):

RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))
Run Code Online (Sandbox Code Playgroud)

使用VTune进行钻取,问题可以追溯到call pow装配线,当跟踪堆栈时,它显示它正在使用__slowpow().经过一番搜索,这个页面出现了抱怨同样的事情.

在具有libc版本2.12的机器上,模拟花了18秒.在libc版本为2.14的机器上,模拟耗时0秒.

基于上述页面的信息,当基数pow()接近1.0 时出现问题.所以我们做了另一个简单的测试,我们在之前用任意数字缩放基数pow(),然后除以在pow()调用之后提升到指数的数字.使用libc 2.12时,运行时间从18秒减少到0秒.

但是,将这些全部放在我们所做的代码上是不切实际的a**b.如何更换pow()libc中的函数?例如,我希望call powFortran编译器生成的装配线调用pow()我们编写的自定义函数来执行缩放,调用libc pow()然后除以缩放.如何创建一个对编译器透明的中间层?

编辑

为了澄清,我们正在寻找类似(伪代码)的东西:

double pow(a,b) {
   a *= 5.0
   tmp = pow_from_libc(a,b)
   return tmp/pow_from_libc(5.0, b)
}
Run Code Online (Sandbox Code Playgroud)

是否可以加载powlibc并在我们的自定义函数中重命名以避免命名冲突?如果customPow.o文件可以pow从libc 重命名,如果其他东西仍然需要libc会发生什么?这会导致libc powcustomPow.opowlibc 之间的命名冲突吗?

c fortran libc pow

24
推荐指数
2
解决办法
4192
查看次数

OpenMP可以用于GPU吗?

我一直在网上搜索,但我仍然对此话题感到困惑.谁能更清楚地解释这个?我来自航空航天工程背景(不是计算机科学专业),所以当我在网上阅读有关OpenMP/CUDA等的内容时.和多线程我真的不太了解所说的很多内容.

我目前正在尝试并行化用FORTRAN编写的内部CFD软件.这些是我的疑惑:

  1. OpenMP使用来自CPU的多个线程共享工作负载.它可以用来让GPU也能完成一些工作吗?

  2. 我读过OpenACC.它是否类似于OpenMP(易于使用)?

我也读过有关CUDA和内核的内容,但我对并行编程没有太多经验,而且我对内核的内容并不了解.

  1. 对于FORTRAN,是否有一种简单易用的方式与GPU共享我的工作负载(如果OpenMP不这样做而OpenACC不可移植)?

你能给我一个"傻瓜"类型的答案吗?

multithreading fortran gpu openmp openacc

24
推荐指数
3
解决办法
1万
查看次数

函数在Fortran中返回数组

我的理解是你可以从Fortran中的函数返回一个数组,但由于某种原因,我的代码只返回我要求它返回的数组中的第一个值.这是功能:

function polynomialMult(npts,x,y)
    integer npts
    double precision x(npts), results(npts + 1), y(npts,npts)

    polynomialMult =  x(1:npts) + 1

end function
Run Code Online (Sandbox Code Playgroud)

这就是我所说的

 C(1:numPoints) = polynomialMult(numPoints,x,f)

print *, C(1:numPoints)`
Run Code Online (Sandbox Code Playgroud)

现在它没有做任何有用的事情,因为我在编写逻辑之前试图理解语法.我看到了一些关于为函数指定类型的东西,但是当我写的时候

integer function polynomialMult(npts,x,y)
Run Code Online (Sandbox Code Playgroud)

或者无论我得到编译错误.

arrays fortran function fortran90

22
推荐指数
1
解决办法
4万
查看次数

错误:标签(1)中语句中的非数字字符

这是我在ubuntu 14.04上编译的程序

f95 First.f -o First
Run Code Online (Sandbox Code Playgroud)

而且程序是

!My first program
program first
print *,'This is my first program'
end program first
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Error:Non-numeric character at statement label at (1)
First.f:2.1:

program first
Run Code Online (Sandbox Code Playgroud)

你如何解决这个错误?

fortran

22
推荐指数
1
解决办法
1万
查看次数

假设大小数组:冒号与星号 - DIMENSION(:) arr与arr(*)

这两种声明假定大小数组的方法之间有什么区别吗?

例如

real, dimension(:) :: arr
Run Code Online (Sandbox Code Playgroud)

real               :: arr(*)
Run Code Online (Sandbox Code Playgroud)

arrays fortran fortran90

21
推荐指数
2
解决办法
1万
查看次数

将libc回溯转换为源行号

我有一个MPI应用程序,它结合了C和Fortran源.偶尔它会因为与内存相关的bug而崩溃,但是我无法找到这个bug(它是在别人的代码中的某个地方,目前我还不是很熟悉).我还没有能够用gdb捕获它,但有时会输出glibc backtrace,如下所示.

该错误可能接近"(main_main_ + 0x3bca)[0x804d5ce]",(但有内存错误,我知道情况可能并非如此).我的问题是,有没有人知道如何将+ 0x3bca或0x804d5ce转换为代码的特定行?

关于追踪错误的任何其他建议也将受到赞赏.我非常熟悉gdb的基础知识.

*** glibc detected *** /home/.../src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42]
/lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525]
/home/.../src/finite_element(main_main_+0x3bca)[0x804d5ce]
/home/.../src/finite_element[0x804e195]
/home/.../src/finite_element(main+0x34)[0x804e1e8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3]
/home/davepc/finite-element/src/finite_element[0x8049971]
======= Memory map: ========
08048000-08056000 r-xp 00000000 08:05 1346306    /home/.../src/finite_element
08056000-08057000 r--p 0000d000 08:05 1346306    /home/.../src/finite_element
08057000-08058000 rw-p 0000e000 08:05 1346306    /home/.../src/finite_element
09d1b000-09d8f000 rw-p 00000000 00:00 0          [heap]
b2999000-b699b000 rw-s 00000000 08:03 15855      /tmp/openmpi-sessions-_0/37612/1/shared_mem_pool.babel
b699b000-b6b1d000 rw-p 00000000 00:00 0 
b6b31000-b6b3d000 r-xp 00000000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3d000-b6b3e000 r--p 0000b000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3e000-b6b3f000 rw-p …
Run Code Online (Sandbox Code Playgroud)

c debugging fortran gdb mpi

20
推荐指数
1
解决办法
6630
查看次数

有没有一种标准方法可以检查Fortran 90/95中的Infinite和NaN?

我一直试图找到一种符合标准的方法来检查Fortran 90/95中的无限和NaN值,但事实证明它比我想象的要难.

  • 我尝试使用IEEE 754中描述的二进制表示手动创建Inf和NaN变量,但我没有发现这样的功能.
  • 我知道内在的ieee_arithmeticFortran中2003年与模块ieee_is_nan()ieee_is_finite()内部函数.然而,所有编译器都不支持它(特别是版本4.9的gfortran).

在像一开始定义无限大和NaN pinf = 1. / 0,并nan = 0. / 0似乎hackish的我,恕我直言,可以提出一些建筑问题-例如,如果某些编译器检查这在编译的时候人们就必须提供一个特殊的标志.

有没有办法在标准的Fortran 90/95中实现?

function isinf(x)
! Returns .true. if x is infinity, .false. otherwise
...
end function isinf
Run Code Online (Sandbox Code Playgroud)

isnan()

fortran fortran95

20
推荐指数
1
解决办法
3万
查看次数

Numpy设置错误:额外的正式参数

我有一些我想在Python文件中使用的Fortran文件.我使用了命令C:\ Python27\python.exe setup.py build_ext --inplace --fcompiler = g95.我的setup.py文件包含以下代码:

import sys, os
extra_link_args = []
extra_link_args = ['-framework', 'accelerate']
from numpy.distutils.core import setup, Extension
opt_flags = ['-g', '-fbounds-check', '-I/usr/include/']
files1 = ['particle_solvers/fbsl_sim_fmod.f90',
          'particle_solvers/fbsl_parts_fmod.f90',
          'particle_solvers/fbsl_poisson_fmod.f90',
          'particle_solvers/fbsl_convol_fmod.f90',
          'particle_solvers/fbsl_lbfr_parts_fmod.f90',
          'particle_solvers/fbsl_ltp_parts_fmod.f90',
          'particle_solvers/fbsl_pusher_fmod.f90',
          ]
ext1 = Extension(name='_fbsl_f90',
                 sources=files1,
                 extra_compile_args=opt_flags,
                 extra_link_args=extra_link_args)
setup(name="_fbsl_f90",
      version='0.1',
      description="Hidden",
      author="Hidden",
      author_email='Hidden',
      url='',
      ext_modules=[ext1])
Run Code Online (Sandbox Code Playgroud)

但我有以下错误:

g95.exe:f90: build\src.win32-2.7\_fbsl_f90-f2pywrappers2.f90
In file build\src.win32-2.7\_fbsl_f90-f2pywrappers2.f90:211
     &ef2pywrap, smooth_heaviside, r)
                                   1
Error: Extra formal argument for 'f2pywrap_fbsl_sim_f90_smooth_heaviside' at (1)
In file build\src.win32-2.7\_fbsl_f90-f2pywrappers2.f90:13
     &nf2pywrap, t)
                 1
In file build\src.win32-2.7\_fbsl_f90-f2pywrappers2.f90:217
     &nf2pywrap, f_exact_is_known, …
Run Code Online (Sandbox Code Playgroud)

python fortran numpy setup.py python-2.7

20
推荐指数
1
解决办法
708
查看次数