[英]Odd behaviour in PARSEC x264 benchmark
我正在运行 PARSEC x264 基准测试,它运行良好,直到崩溃时关闭。 不幸的是,该套件似乎没有维护或维护不足 - 这个问题(崩溃,而不是细节)在近一年前发布在邮件列表中,但没有回复。
我已使用 printf 的老式调试将问题隔离到特定 function(见下文)的一部分:
void x264_cqm_delete( x264_t *h )
{
int i, j;
printf("IN BAD CODE\n");
for( i = 0; i < 6; i++ )
{
for( j = 0; j < i; j++ )
if( h->quant4_mf[i] == h->quant4_mf[j] )
break;
if( j == i )
{
printf("DELETE CODE with i = %i and j = %i\n", i, j);
x264_free( h-> quant4_mf[i] );
x264_free( h->dequant4_mf[i] );
x264_free( h->unquant4_mf[i] );
}
for( j = 0; j < i; j++ )
if( h->quant4_bias[i] == h->quant4_bias[j] )
break;
if( j == i )
x264_free( h->quant4_bias[i] );
}
}
这将生成 output...
IN BAD CODE
DELETE CODE with i = 0 and j = 0
DELETE CODE with i = 4 and j = 4
DELETE CODE with i = 5 and j = 4
到底是怎么回事?
通过检查 x264 库本身中的规范代码,很明显代码已损坏,我看到这些问题的原因是代码正在破坏堆。
事实上,外部循环的限制应该是 4 - 它应该与各种 arrays 名称中使用的数字匹配 - 这是 x264 库本身使用的模式 - 并且 quant4_mf 数组在第一维中只有 4 个元素。 以这种方式修补代码可以看到编译后的二进制文件运行没有问题。
为了使它工作,您可以将编译器优化从 O3 更改为 O2: https://github.com/cirosantilli/parsec-benchmark/issues/3使用 Ubuntu-18.04 测试 gcc 7.5.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.