ARPACK线程安全吗?

时间:2010-10-08 09:20:20

标签: c thread-safety fortran arpack

从用C编写的程序中同时使用来自不同线程的ARPACK本征解析器是否安全?或者,如果ARPACK本身不是线程安全的,那么是否存在与API兼容的线程安全实现?一个快速的谷歌搜索没有发现任何有用的东西,但鉴于ARPACK在大型科学计算中被大量使用,我发现成为第一个需要线程安全稀疏的本征解析器的人非常令人惊讶。

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

4 个答案:

答案 0 :(得分:3)

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

这可能是f2c正在做的事情,如果是这样,可能是f2c步骤使程序不是线程安全的,而不是程序本身。当然,正如其他人提到的那样,请查看COMMON块。 编辑:另外,检查明确的SAVE指令。 SAVE意味着变量的值应该在过程的后续调用之间保留,类似于C中的静态。现在,在数据部分中分配所有过程本地数据会使所有变量隐式保存,不幸的是,有很多旧的即使Fortran标准无法保证,也会假设这一代码。显然,这样的代码不是线程安全的。 WRT。特别是ARPACK,我不能保证任何东西,但ARPACK通常被广泛使用并广泛使用,所以如果它遭受这些尘土飞扬的问题我会感到惊讶。

大多数现代Fortran编译器都使用堆栈分配。你可能有更好的运气编译ARPACK,比如gfortran和-frecursive选项。

编辑

[1]不是因为它效率更高,而是因为Fortran最初是在堆栈和堆之前设计的,并且出于某种原因,标准委员会希望保留在没有堆栈和堆支持的硬件上实现Fortran的选项。实际上,我猜测堆栈在当今高度依赖缓存的硬件上更有效,而不是访问遍布数据部分的过程本地数据。

答案 1 :(得分:3)

我已使用f2c将ARPACK转换为C.每当您使用f2c并且您关心线程安全时,您必须使用-a开关。这使得局部变量具有 a 自动存储,即基于堆栈的局部变量,而不是默认的静态。

即便如此,ARPACK本身绝对不是线程安全的。它使用许多公共块(即全局变量)来保持对其函数的不同调用之间的状态。如果内存服务,它使用反向通信接口,往往导致开发人员使用全局变量。当然,ARPACK很可能是在多线程很常见之前编写的。

我最终重新处理转换后的C代码,以系统地删除所有全局变量。我创建了一些C结构并逐渐将全局变量移动到这些结构中。最后,我将指向这些结构的指针传递给需要访问这些变量的每个函数。虽然我可以将每个全局变换成一个参数,只要它需要它就可以将它们全部保存在一起,包含在结构中。

本质上,我们的想法是将全局变量转换为堆栈变量。

答案 2 :(得分:1)

ARPACK使用BLAC吗?那些库也需要是线程安全的。 我相信你用f2c检查你的想法可能不是告诉Fortran代码是否是线程安全的防弹方法,我猜它也取决于Fortran编译器和库。

答案 3 :(得分:1)

我不知道f2c在翻译Fortran时使用了什么策略。由于ARPACK是在FORTRAN 77中编写的,因此首先要检查是否存在COMMON块。这些是全局变量,如果使用,代码很可能不是线程安全的。 ARPACK网页http://www.caam.rice.edu/software/ARPACK/表示存在并行版本 - 该版本似乎可能是线程安全的。