小编Blk*_*ght的帖子

编写健壮的"现代"Fortran代码

在一些科学环境中,你经常离不开FORTRAN,因为大多数开发人员只知道这个习语,并且有很多遗留代码和相关经验.坦率地说,高性能编程没有很多其他跨平台选项(C++可以完成任务,但语法,零启动数组和指针与某些人不兼容).

所以,让我们假设一个新项目,必须使用Fortran 90的,但我想建立最先进的软件架构出来的,同时与最新的编译器兼容(英特尔ifort,而且还包括Sun/HP/IBM编译)

所以我想要强加一些众所周知的常识,但在我的环境中还不是标准:

  • 全局变量禁止,没有getos,没有跳转标签implicit none
  • "面向对象编程"(具有数据类型和相关子例程的模块)
  • 模块化/可重用的功能,文档齐全,可重用的库
  • 断言/前提条件/不变量(使用预处理程序语句实现)
  • 所有(大多数)子程序和"对象"的单元测试
  • 一个强烈的"调试模式"(#ifdef DEBUG),带有更多检查和所有可能的英特尔编译器检查(数组边界,子程序接口等)
  • 统一和强制清晰的编码风格,使用代码处理工具助手.

所有这一切的目标是拥有值得信赖,可维护和模块化的代码.然而,在许多遗留代码中,可重用性不是一个重要的目标.

我四处搜寻有关面向对象的Fortran编程契约式引用(断言/前提条件的/ etc.),发现只有丑陋的和过时的文件,通过人与没有大规模参与项目进行语法和文章,和死了的项目.

有关此主题的任何好的URL,建议,参考文件/书籍?

oop fortran scientific-computing assertions fortran90

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

共享内存,MPI和排队系统

我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被分割为N cpus,并且每个块都是并行执行,非常高效,非常好的速度缩放,工作正确完成.

但是在每个过程中都会重复一些数据,并且由于技术原因,这些数据不能轻易地通过MPI(...)进行分割.例如:

  • 5 Gb的静态数据,为每个进程加载完全相同的东西
  • 可以在MPI中分发的4 Gb数据,使用的CPU越多,每个CPU的RAM越小.

在4 CPU工作中,这意味着至少有20Gb的RAM负载,大部分内存"浪费",这很糟糕.

我正在考虑使用共享内存来减少总体负载,每台计算机只会加载一次"静态"块.

所以,主要问题是:

  • 是否有任何标准的MPI方式在节点上共享内存? 某种现成的+免费图书馆?

    • 如果没有,我将使用boost.interprocess和使用MPI调用来分发本地共享内存标识符.
    • 共享内存将由每个节点上的"本地主机"读取,并以只读方式共享.不需要任何类型的信号量/同步,因为它不会改变.
  • 任何性能损失或特别问题要警惕?

    • (不会有任何"字符串"或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
  • 该作业将在PBS(或SGE)排队系统中执行,如果进程不干净退出,我想知道这些是否会清理特定于节点的共享内存.

c++ mpi shared-memory pbs boost-interprocess

20
推荐指数
2
解决办法
5408
查看次数