将非连续数组的指针传递给 Fortran 中的 Lapack95 例程是否安全?

问题描述 投票:0回答:1

我想为非连续数组调用

syevd
Lapack95 子例程,如下所示:

real :: mat(15000, 15000), vec(15000)
mat=1.d0
associate(eig_vects=>mat(:10000,:10000),eig_vals=>vec(:10000))
   call syevd(eig_vects,eig_evals,'V')
end associate

这样做安全吗? 早些时候,我在将非连续数组切片传递给子例程时遇到了问题(无法分配该子例程创建的临时数组)。 当使用

eig_vects
指针作为参数时,我可能会遇到类似的问题吗?

arrays fortran lapack contiguous associate
1个回答
0
投票

在这里,编译器必须自动创建一个临时数组。如果您多次调用此类子例程,甚至可能多次。

您无法保证临时数据是否位于堆上或堆栈上(由于堆栈溢出错误而导致崩溃)。

如果多次使用子数组,我会考虑显式分配一个临时可分配数组并手动将数据复制到那里。它将是安全的,如果它避免了几个自动临时数组,它甚至可能会更快。

© www.soinside.com 2019 - 2024. All rights reserved.