Fortran 奇遇记
内容提要
BLAS和LAPACK的错误处理程序xerbla_默认会终止整个进程,替换它需依赖链接器,在macOS、Windows和静态库上日益困难。参考实现中已有开放拉取请求,允许客户端程序直接传入新处理程序,无需链接器介入。实现需用Fortran的ENTRY关键字存储持久数据,因LAPACK的自动翻译工具无法处理模块。该方案将解决动态语言绑定等难题。
延伸解读
链接器替换的困境
文章指出,传统上替换xerbla_错误处理程序需要依赖链接器插入替代例程,但在macOS、Windows以及使用静态库时,这种做法越来越困难甚至不可行。这导致开发者难以自定义错误处理行为,尤其是在跨平台或静态链接场景下。
新方案:直接传入处理程序
参考实现中已有开放拉取请求,允许客户端程序直接传入新的错误处理程序,无需链接器介入。这将永久解决上述难题,使错误处理更加灵活,尤其有利于动态语言绑定和跨平台开发。
Fortran实现的技术挑战
实现该方案需在Fortran中存储持久数据。由于LAPACK的自动翻译工具无法处理模块,作者改用ENTRY关键字这一较老的惯用法,成功在xerbla_中实现了回调注册与获取,并验证了其可行性。
Q&A
BLAS和LAPACK中的xerbla_默认行为是什么?
xerbla_是BLAS和LAPACK的错误处理程序,默认会终止整个进程。
为什么替换xerbla_在macOS、Windows和静态库上越来越困难?
因为替换xerbla_需要依赖链接器将替换例程插入,而在macOS、Windows和静态库上,这种链接器操作日益困难或不可能。
新的拉取请求如何解决xerbla_替换问题?
新的拉取请求允许客户端程序直接传入新的处理程序,无需链接器介入,从而永久解决替换问题。
为什么在LAPACK中实现新方案需要使用ENTRY关键字?
因为LAPACK有自动翻译工具,会将源文件转换为后缀为_64的版本,但该工具无法处理模块,所以必须使用ENTRY关键字这种旧式惯用法来存储持久数据。
新方案将解决哪些难题?
新方案将解决动态语言绑定等难题,尤其对制作BLAS等动态语言绑定的人,以及在macOS、Windows等平台上使用的人有帮助。
实现新方案时,第一次尝试使用模块为什么失败?
因为LAPACK的自动翻译工具无法处理模块,所以使用模块的第一次尝试在LAPACK中失败。