从C编写的程序中同时使用来自不同线程的ARPACK特征解析器安全吗?或者,如果ARPACK本身不是线程安全的,那么有没有API兼容的线程安全实现?在谷歌上快速搜索一下并没有找到任何有用的东西,但考虑到ARPACK在大型科学计算中被大量使用的事实,我会发现我是第一个需要线程安全稀疏特征解析器的人,这是非常令人惊讶的。
我对Fortran不太熟悉,所以我用f2c把ARPACK源代码翻译成了C,而且似乎有相当多的静态变量。基本上,转换后的例程中的所有局部变量似乎都是静态的,这意味着库本身不是线程安全的。
发布于 2010-10-11 02:55:30
Fortran 77不支持递归,因此符合标准的编译器可以分配程序数据部分的所有变量;原则上,既不需要堆栈也不需要堆1。
这可能是f2c正在做的事情,如果是这样的话,可能是f2c步骤使程序不是线程安全的,而不是程序本身。当然,正如其他人所提到的,也要检查公共块。编辑:另外,检查是否有显式的保存指令。保存意味着在后续的过程调用之间应保留变量的值,这与C中的静态类似。现在,在数据段中分配所有过程的本地数据会使所有变量隐式保存,不幸的是,许多旧代码都假定这一点,尽管Fortran标准并不保证这一点。显然,这样的代码不是线程安全的。Wrt。ARPACK具体地说,我不能保证任何事情,但ARPACK通常是良好的和广泛使用的,所以如果它遭受这种尘土飞扬的甲板问题,我会感到惊讶。
大多数现代Fortran编译器都使用堆栈分配。您可能会更幸运地使用gfortran和-frecursive选项编译ARPACK。
编辑:
1不是因为Fortran更高效,而是因为Fortran最初是在堆栈和堆发明之前设计的,而且出于某种原因,标准委员会希望保留在既不支持堆栈也不支持堆的硬件上实现Fortran的选项,直到Fortran 90。实际上,我猜测堆栈在当今严重依赖缓存的硬件上比访问遍布整个数据部分的过程本地数据更有效。
发布于 2010-10-08 17:29:46
ARPACK使用BLAC,对吗?那么这些库也需要是线程安全的。我相信你用f2c检查的想法可能并不是判断Fortran代码是否是线程安全的可靠方法,我猜这也取决于Fortran编译器和库。
发布于 2010-10-08 21:04:44
我不知道f2c在翻译Fortran时使用了什么策略。由于ARPACK是用FORTRAN77编写的,所以首先要做的是检查公共块的存在。这些都是全局变量,如果使用,代码很可能不是线程安全的。ARPACK的网页http://www.caam.rice.edu/software/ARPACK/上说有一个并行版本--看起来这个版本很可能是线程安全。
https://stackoverflow.com/questions/3889222
复制相似问题