我想为非连续数组调用
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
指针作为参数时,我可能会遇到类似的问题吗?
在这里,编译器必须自动创建一个临时数组。如果您多次调用此类子例程,甚至可能多次。
您无法保证临时数据是否位于堆上或堆栈上(由于堆栈溢出错误而导致崩溃)。
如果多次使用子数组,我会考虑显式分配一个临时可分配数组并手动将数据复制到那里。它将是安全的,如果它避免了几个自动临时数组,它甚至可能会更快。