【问题标题】:How can I send complex data to my visualizer in TotalView?如何将复杂数据发送到 TotalView 中的可视化工具?
【发布时间】:2017-05-26 16:26:20
【问题描述】:

我经常需要调试使用大型复杂数据数组的旧版 Fortran 代码,可用的最佳选项是 TotalView。我创建了自己的可视化工具来查看运行良好的数据(按照 TotalView 的说明 here)。它比默认的更灵活,能够摄取和显示复杂的数据,但 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。

【问题讨论】:

    标签: fortran totalview


    【解决方案1】:

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

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

    COMPLEX(4)(100,30)
    

    这其实和TotalView内置的$complex_8是一样的。您只需在“类型:”字段中重新键入以下内容即可重新转换类型和尺寸:

    $real_4(2,100,30)
    

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

    可分配数组:

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

    1. 通常引用数组的地址并不是内存中实际数组的地址,所以你必须手动调整潜水窗口的地址。

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

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

    【讨论】:

    • 如果您读过这篇文章,我真的很想详细了解您如何编写自定义可视化工具...
    • @philb 遗憾的是,我目前无法访问实际代码,但我给出了一个简短的概述。它是使用 PyQt 编写的,它分两部分工作……第一部分是一个类,当从主要部分实例化时,该类旨在根据 Totalview 的规范接受来自标准输入的数据并存储它,同时在列表。我使用 QSocketNotifier 来确保它是一个贪婪的阅读器。第二个是使用 PyQt 和 matplotlib 的 GUI 类,可以进行一些简单的显示操作。任何其他细节都可能超出评论的长度,抱歉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多