0

我经常需要调试使用大量复杂数据的遗留 Fortran 代码,可用的最佳选项是 TotalView。我创建了自己的可视化工具来查看运行良好的数据(按照 TotalView在此处的说明)。它比默认的更灵活,并且能够摄取和显示复杂的数据,但 TotalView 不会通过其可视化管道发送复杂的数组。

有什么方法可以让 TotalView 能够显示复杂的数据,而无需使用额外的调试数组重新编译代码来获取绝对值?

例如,对于像以下简短示例这样的代码,我可以在 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。

4

1 回答 1

0

如果您的数组在内存中是连续的,您可以执行此操作,并且您可以调整可视化器以将复杂数据作为实数数组输入,该数组具有包含实部和虚部的额外维度。

在上面的示例中,如果您“潜入”变量my_arr,它将显示为 type

COMPLEX(4)(100,30)

这实际上与内置的 TotalView 相同$complex_8。您可以通过简单地将以下内容重新键入“类型:”字段来重新转换类型和尺寸:

$real_4(2,100,30)

然后实部和虚部将驻留在第一个(迭代最快的)维度中,TotalView 将允许您将 3D 浮点数组传递给可视化器。注意:默认情况下,TotalView 将自身限制为可视化 2D 数组,因此您需要将其更改为 3D(或您的可视化器可以处理的任意数量),在“最大值”下的“启用可视化器启动”框中的“首选项->启动字符串”下阵列排名。”

可分配数组:

可以以相同的方式处理动态大小的数组,但需要几个额外的步骤。

  1. 通常对数组的引用地址并不是内存中实际数组的地址,因此您将不得不手动调整潜水窗口的地址。

    在右侧的潜水窗口中,滚动条上方有一个选项按钮,用于指示窗口中显示的列 - 打开“地址”并记下数组中第一个元素的十六进制地址。通过更改类型字符串重铸后,将该十六进制地址键入顶部的“地址”字段,然后您的数据将正确显示。

    TotalView 变量窗口,带圆圈的按钮

  2. 类型字符串将包含类似 的内容COMPLEX(4),allocatable::(:,:),而“实际类型”字符串将显示尺寸。当您进行重铸时,请确保移除,allocatable::并将 更改(:,:)为实际尺寸(例如(100,30))。

于 2017-05-26T16:26:20.830 回答