我经常需要调试利用大型复杂数据阵列的传统Fortran代码,而最好的选择是TotalView。我创建了自己的可视化工具来查看运行良好的数据(根据TotalView的说明here)。它比默认数据库更灵活,并且能够摄取和显示复杂数据,但TotalView不会通过其可视化管道发送复杂数组。
有没有什么方法可以让TotalView能够显示复杂的数据,而无需使用额外的调试数组重新编译代码来获取绝对值?
E.g。对于像以下简短示例的代码,我可以在Fortran中创建另一个数组,但我真的想停下来检查变量my_arr
:
program main
implicit none
integer N, M, i, j
parameter (N=100, M=30)
complex my_arr(N, M)
real pi
pi = ACOS(-1.0)
do j = 1, M
do i = 1, N
my_arr(i,j) = cmplx(i*cos(j/pi), i*sin(j/pi))
end do
end do
return
end
对于小型数组,我可以用这样的表达式来逃避:
my_arr%Real_Part**2 + my_arr%Imaginary_Part**2
但是对于任何非常大的东西都不起作用,TotalView会抱怨内存。
我正在使用TotalView 8.13。
答案 0 :(得分:0)
如果你的数组在内存中是连续的,那么你可以这样做和你可以调整你的可视化工具,将复杂的数据作为一个真实数组输入,其中包含真实和虚部的额外维度。
在上面的示例中,如果您“潜入”变量my_arr
,它将显示为类型
COMPLEX(4)(100,30)
这实际上与TotalView内置$complex_8
相同。您只需在“类型:”字段中重新输入以下内容即可重新输入类型和尺寸:
$real_4(2,100,30)
然后,实部和虚部将驻留在第一个(最快迭代)维度中,TotalView将允许您将3D浮点数组传递给可视化工具。注意:默认情况下,TotalView将自身限制为可视化2D数组,因此您需要在“启用可视化器启动”框下的“首选项 - >启动字符串”下将其更改为3D(或者您的可视化工具可以处理多少)最大阵列等级。“
可分配数组:
动态大小的数组可以以相同的方式处理,但需要几个额外的步骤。