gpt4 book ai didi

c - ARPACK 是线程安全的吗?

转载 作者:太空狗 更新时间:2023-10-29 17:21:01 27 4
gpt4 key购买 nike

使用 ARPACK 安全吗?来自不同线程的本征求解器同时来自用 C 编写的程序?或者,如果 ARPACK 本身不是线程安全的,是否有 API 兼容的线程安全实现?快速的 Google 搜索没有找到任何有用的东西,但考虑到 ARPACK 在大型科学计算中被大量使用的事实,我发现成为第一个需要线程安全的稀疏特征求解器的人是非常令人惊讶的。

我对Fortran不太熟悉,所以我用f2c将ARPACK源码翻译成C,貌似静态变量不少。基本上,翻译例程中的所有局部变量似乎都是静态的,这意味着库本身不是线程安全的。

最佳答案

Fortran 77 不支持递归,因此符合标准的编译器可以在程序的数据部分分配所有变量;原则上,堆栈和堆都不需要 [1]。

这可能是 f2c 正在做的事情,如果是这样,则可能是 f2c 这一步使程序成为非线程安全的,而不是程序本身。当然,正如其他人所提到的,也要检查 COMMON block 。 EDIT:另外,检查明确的 SAVE 指令。 SAVE 意味着变量的值应该在过程的后续调用之间保留,类似于 C 中的静态。现在,在数据部分分配所有过程本地数据会使所有变量隐式保存,不幸的是,有很多旧的假定这一点的代码,即使它不受 Fortran 标准的保证。这样的代码显然不是线程安全的。写。特别是 ARPACK,我不能保证任何事情,但 ARPACK 普遍受到好评并被广泛使用,所以如果它遇到这些灰尘甲板问题,我会感到惊讶。

大多数现代 Fortran 编译器都使用堆栈分配。使用 gfortran 和 -frecursive 选项编译 ARPACK 时您可能运气更好。

编辑:

[1] 不是因为它更高效,而是因为 Fortran 最初是在堆栈和堆发明之前设计的,出于某种原因,标准委员会希望保留在堆栈和堆都不支持所有的硬件上实现 Fortran 的选项一直到 Fortran 90。实际上,我猜堆栈在当今严重依赖缓存的硬件上比访问分布在整个数据部分的过程本地数据更有效。

关于c - ARPACK 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3889222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com