Debugging 如何测试生成的汇编程序?

Debugging 如何测试生成的汇编程序?,debugging,testing,assembly,convolution,verification,Debugging,Testing,Assembly,Convolution,Verification,我已经做了一个程序,根据向量扩展的参数生成汇编指令来执行卷积。注意,我假设我的向量扩展没有循环或分支指令 但是,如果我将输入宽度设置为7,内核宽度设置为3,输入通道设置为128,输出通道设置为4,那么生成的指令数几乎是90000。我有一个用于向量处理器的指令模拟器,但我不知道如何检查生成的指令是否正常 有什么好的开始点或好主意吗?显而易见的事情是使用一些完全随机的测试输入运行它,并与使用相同数据输入的简单已知良好实现的结果进行比较。(例如,用C或您最喜欢的高级语言编写,可能只是在主机CPU上运行

我已经做了一个程序,根据向量扩展的参数生成汇编指令来执行卷积。注意,我假设我的向量扩展没有循环或分支指令

但是,如果我将输入宽度设置为7,内核宽度设置为3,输入通道设置为128,输出通道设置为4,那么生成的指令数几乎是90000。我有一个用于向量处理器的指令模拟器,但我不知道如何检查生成的指令是否正常


有什么好的开始点或好主意吗?

显而易见的事情是使用一些完全随机的测试输入运行它,并与使用相同数据输入的简单已知良好实现的结果进行比较。(例如,用C或您最喜欢的高级语言编写,可能只是在主机CPU上运行,而不是在模拟器内运行)。在模拟器中运行一个简单的实现也是很好的,或者更容易实现

在比较结果时,如果简单实现使用不同的操作顺序,则可能需要为FP舍入错误留出一些回旋空间。一个非常标准的方法是检查绝对差是否都在1e-7或其他范围内,或者检查相对差(尽管由于减法而导致的接近零的数字的相对误差可能很大;灾难性消除是FP的一个已知问题)

(如果您还没有意识到这些问题,请参阅Bruce的FP系列文章和其他文章。)

也许有一个以双精度计算的参考实现是值得的,这样当评估带有舍入误差的计算时,您就可以更好地了解实际正确答案是什么


数据与引用不匹配时的调试: 使用非常简单的输入数据再次进行测试,就像所有
0.0
一样,除了一个元素中的
1.0
。这可能会突出显示错误的数组索引问题。或者全部
1.0
,或者全部
-2.0

或一些输入,对于您试图实现的已知算法,这些输入应该会产生非常简单的输出。e、 g.如果大多数输出都应该是
0.0
,那么看看哪些输出不是,或者它们有什么值,可能是一个很大的提示



还要注意的是,大多数真实世界的CPU都有某种指令缓存,因此循环一个适合缓存的循环体(大的展开循环)通常值得一点循环开销,而不是将循环完全展开/剥离成一大块直线代码。(像90k指令听起来太多了)。但是,如果真的没有任何简单的重复可以通过展开进行摊销,那么值得考虑。

显而易见的事情是使用一些完全随机的测试输入运行它,并与使用相同数据输入的简单已知良好实现的结果进行比较。(例如,用C或您最喜欢的高级语言编写,可能只是在主机CPU上运行,而不是在模拟器内运行)。在模拟器中运行一个简单的实现也是很好的,或者更容易实现

在比较结果时,如果简单实现使用不同的操作顺序,则可能需要为FP舍入错误留出一些回旋空间。一个非常标准的方法是检查绝对差是否都在1e-7或其他范围内,或者检查相对差(尽管由于减法而导致的接近零的数字的相对误差可能很大;灾难性消除是FP的一个已知问题)

(如果您还没有意识到这些问题,请参阅Bruce的FP系列文章和其他文章。)

也许有一个以双精度计算的参考实现是值得的,这样当评估带有舍入误差的计算时,您就可以更好地了解实际正确答案是什么


数据与引用不匹配时的调试: 使用非常简单的输入数据再次进行测试,就像所有
0.0
一样,除了一个元素中的
1.0
。这可能会突出显示错误的数组索引问题。或者全部
1.0
,或者全部
-2.0

或一些输入,对于您试图实现的已知算法,这些输入应该会产生非常简单的输出。e、 g.如果大多数输出都应该是
0.0
,那么看看哪些输出不是,或者它们有什么值,可能是一个很大的提示



还要注意的是,大多数真实世界的CPU都有某种指令缓存,因此循环一个适合缓存的循环体(大的展开循环)通常值得一点循环开销,而不是将循环完全展开/剥离成一大块直线代码。(像90k指令听起来太多了)。但如果真的没有任何简单的重复可以通过展开来摊销,那么值得考虑。

@PeterCordes我完全同意你的观点。但是,当数据与“良好的实现”不匹配时,我很难找到从何处开始调试。你有什么好的或方便的想法吗?啊,调试是一个不同于你所问的通过/失败测试的问题。在我的回答中添加了一个关于这一点的部分,并更新了您的问题标签以包括调试。@PeterCordes我完全同意您的看法。但是,当数据与“良好的实现”不匹配时,我很难找到从何处开始调试。你有什么好的或方便的想法吗?啊,调试是一个不同于你所问的通过/失败测试的问题。在我的回答中添加了一个关于这一点的部分,并更新了您的问题标签以包括调试。