首页 文章

ARPACK线程安全吗?

提问于
浏览
5

从用C编写的程序中同时使用不同线程的ARPACK本征解析器是否安全?或者,如果ARPACK本身不是线程安全的,那么是否存在与API兼容的线程安全实现?一个快速的谷歌搜索没有发现它是第一个需要一个线程安全的稀疏eigensolver非常令人惊讶 .

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

4 回答

  • 1

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

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

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

    EDIT

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

  • 1

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

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

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

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

  • 3

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

  • 3

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

相关问题