【问题标题】:c++ calls to fortran and backc ++调用fortran并返回
【发布时间】:2012-01-16 08:22:40
【问题描述】:

在我的 c++ 代码 (my_app) 中,我需要启动外部应用程序 (app_ext),该应用程序动态加载我用 fortran (lib_fort) 编写的库 (dll,so)。从这个库 (lib_fort) 我需要从 my_app 同步回调一些方法。

所以它是这样的: (my_app) --launches--> (app_ext) --loads--> (lib_fort) --"calls"--> (my_app)

app_ext 不是我开发的。

您对如何做有什么建议,最重要的是,高效地做吗?

编辑:

澄清。启动外部应用程序 (app_ext) 并从中加载我的库 (lib_fort) 在整个程序执行过程中只会发生一次。所以这部分不需要超高效。 lib_fort 和 my_app 之间的通信对性能至关重要。 Lib_fort 需要“调用” my_app 数百万次。

重点在于高效的进程间通信。 启动 app_ext 后的 My_app 角色是等待并服务来自 lib_fort 的“呼叫”。棘手的部分是解决方案需要同时适用于分布式和共享内存环境,即 my_app 和 app_ext+lib_fort 在单个主机上 (1) 和 my_app 和 app_ext+lib_fort 在不同机器上 (2)。

在 (1) 场景中,我正在考虑 MPI,但我不确定是否可以在两个不同的应用程序之间使用 MPI 进行通信(与单进程、多进程、MPI 应用程序相比)。

在(2)场景中可能是某种使用共享内存的进程间通信? (或者也可能是 MPI?)

【问题讨论】:

  • 启动一个应用程序然后加载一个 dll 需要一定的时间。由于文件缓存,第二次会更快。所以尽量少做。
  • 谢谢。我澄清了我的问题。您提到的部分不太重要 - 我最关心的是进程间通信。

标签: c++ performance fortran mpi interprocess


【解决方案1】:

好的,真正的问题是如何在进程之间进行通信。 (忘记 MPI,这是针对不同类型的问题。)您可能在谈论 COM(组件对象模型)或 RPC(远程过程调用)或管道,但在它下面将使用套接字。 IME 最简单和最有效的方法是自己打开套接字连接并通过这些连接进行对话。那将是速率限制器,真的没有比这更快的了。

【讨论】:

  • 非常感谢 - 看起来我在使用 MPI 时走错了路。但是单机场景呢?套接字也会在那里获得性能胜利吗?对这两种情况都有一个实现很诱人:)
  • @garret:我会试试看。然后套接字就像管道一样,操作系统非常擅长唤醒等待 I/O 的进程,所以作为进程间通信的一种方式,我希望它是最有效的,而且你是不要乱用不必要的上下文切换。基本上,您应该能够使 I/O 通道几乎 100% 忙碌,其中堆栈样本几乎都显示您处于 I/O 等待状态。 IME,你能以多快的速度完成这些事情,真是太神奇了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2015-04-18
  • 2019-11-30
  • 1970-01-01
相关资源
最近更新 更多