如何将复杂数据发送到 TotalView 中的可视化工具?
How can I send complex data to my visualizer in TotalView?
我经常需要调试使用大量复杂数据的遗留 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。
如果你的数组在内存中是连续的,你可以这样做并且你可以调整你的可视化工具,将复杂的数据输入为一个包含实数和虚数的额外维度的实数数组部分。
在上面的示例中,如果您 'dive' 进入变量 my_arr
,它将显示为类型
COMPLEX(4)(100,30)
这其实和内置的TotalView是一样的$complex_8
。您只需在 "Type:" 字段中重新键入以下内容即可重铸类型和尺寸:
$real_4(2,100,30)
然后实部和虚部将驻留在第一个(迭代最快的)维度中,TotalView 将允许您将 3D 浮点数组传递给可视化工具。注意:默认情况下,TotalView 仅限于可视化 2D 数组,因此您需要在 [=52= 下的 "Enable Visualizer Launch" 框中的 "Preferences->Launch Strings" 下将其更改为 3D(或您的可视化工具可以处理的任何数量) ]
可分配数组:
可以用相同的方式处理动态大小的数组,但需要几个额外的步骤。
通常引用数组的地址并不是内存中实际数组的地址,所以需要手动调整潜水的地址window.
在右侧的潜水 window 中,滚动条正上方有一个选项按钮,用于指示 window 中显示的列 - 打开 "Address" 并写入数组中第一个元素的十六进制地址。通过更改类型字符串重铸后,将该十六进制地址键入顶部的 "Address" 字段,然后您的数据将正确显示。
类型字符串将包含类似于 COMPLEX(4),allocatable::(:,:)
的内容,而 "Actual Type" 字符串将显示尺寸。重铸时,请确保删除 ,allocatable::
并将 (:,:)
更改为实际尺寸(例如 (100,30)
)。
我经常需要调试使用大量复杂数据的遗留 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。
如果你的数组在内存中是连续的,你可以这样做并且你可以调整你的可视化工具,将复杂的数据输入为一个包含实数和虚数的额外维度的实数数组部分。
在上面的示例中,如果您 'dive' 进入变量 my_arr
,它将显示为类型
COMPLEX(4)(100,30)
这其实和内置的TotalView是一样的$complex_8
。您只需在 "Type:" 字段中重新键入以下内容即可重铸类型和尺寸:
$real_4(2,100,30)
然后实部和虚部将驻留在第一个(迭代最快的)维度中,TotalView 将允许您将 3D 浮点数组传递给可视化工具。注意:默认情况下,TotalView 仅限于可视化 2D 数组,因此您需要在 [=52= 下的 "Enable Visualizer Launch" 框中的 "Preferences->Launch Strings" 下将其更改为 3D(或您的可视化工具可以处理的任何数量) ]
可分配数组:
可以用相同的方式处理动态大小的数组,但需要几个额外的步骤。
通常引用数组的地址并不是内存中实际数组的地址,所以需要手动调整潜水的地址window.
在右侧的潜水 window 中,滚动条正上方有一个选项按钮,用于指示 window 中显示的列 - 打开 "Address" 并写入数组中第一个元素的十六进制地址。通过更改类型字符串重铸后,将该十六进制地址键入顶部的 "Address" 字段,然后您的数据将正确显示。
类型字符串将包含类似于
COMPLEX(4),allocatable::(:,:)
的内容,而 "Actual Type" 字符串将显示尺寸。重铸时,请确保删除,allocatable::
并将(:,:)
更改为实际尺寸(例如(100,30)
)。