最高提升115% 英特尔45nm Penryn实测
● Penryn :SSE4指令集强化视讯编码效率
SSE4指令集进一步强讯编码效果,例如可同时处理8个4-byte宽度的SAD(Sums of Absolute Differences)运算,常用于新一代高清影像编码如VC.1及H.264等规格中,令视频编码速度进一步提升。
据了解,在进行视讯编码时需要进行动态预测(Motion Estimation)及差分编码方式去除相邻2张影像之相关性,这是一个非常复杂的运算动作,在没有SSE4指令集时,以上工作所需指令如下:
for (int moveblock=0;moveblock<16;moveblock++)
for(int line=0; line<16; line++) // Does the 16 pixels large in 4 iteration
{
int i=0;
sum0+=abs( pBlock1[j]-pBlock2[i])+abs(pBlock1[j+1]-pBlock2[i+1])+abs(pBlock1[j+2]-pBlock2[i+2])+abs(pBlock1[j+3]-pBlock2[i+3]); // Compare with 0 pixel offset
sum1+=abs(pBlock1[j+1]-pBlock2[i])+abs(pBlock1[j+2]-pBlock2[i+1])+abs(pBlock1[j+3]-pBlock2[i+2])+abs(pBlock1[j+4]-pBlock2[i+3]); // Compare with 1 pixel offset
sum2+=abs(pBlock1[j+2]-pBlock2[i])+abs(pBlock1[j+3]-pBlock2[i+1])+abs(pBlock1[j+4]-pBlock2[i+2])+abs(pBlock1[j+5]-pBlock2[i+3]); // Compare with 2 pixel offset
sum3+=abs(pBlock1[j+3]-pBlock2[i])+abs(pBlock1[j+4]-pBlock2[i+1])+abs(pBlock1[j+5]-pBlock2[i+2])+abs(pBlock1[j+6]-pBlock2[i+3]); // Compare with 3 pixel offset
sum4+=abs(pBlock1[j+4]-pBlock2[i])+abs(pBlock1[j+5]-pBlock2[i+1])+abs(pBlock1[j+6]-pBlock2[i+2])+abs(pBlock1[j+7]-pBlock2[i+3]); // Compare with 4 pixel offset
sum5+=abs(pBlock1[j+5]-pBlock2[i])+abs(pBlock1[j+6]-pBlock2[i+1])+abs(pBlock1[j+7]-pBlock2[i+2])+abs(pBlock1[j+8]-pBlock2[i+3]); // Compare with 5 pixel offset
sum6+=abs(pBlock1[j+6]-pBlock2[i])+abs(pBlock1[j+7]-pBlock2[i+1])+abs(pBlock1[j+8]-pBlock2[i+2])+abs(pBlock1[j+9]-pBlock2[i+3]); // Compare with 6 pixel offset
sum7+=abs(pBlock1[j+7]-pBlock2[i])+abs(pBlock1[j+8]-pBlock2[i+1])+abs(pBlock1[j+9]-pBlock2[i+2])+abs(pBlock1[j+10]-pBlock2[i+3]); // Compare with 7 pixel offset
i=4;
j=moveblock+4;
…
… }
}
一大串的运算动作包括了ABS、Subtracion及Addition等,极度浪费处理器资源,但当处理器支持SSE4指令集,只需要采用4 SAD运算指令:
MPSADBW xmm0,xmm1,0
可以完全代替了以上繁复的指令串,大幅提升动态预测(Motion Estimation)及差分编码的运算速度。
除此之外,视讯编码需要寻找非常好的的SAD(Sums of Absolute Differences),由于旧有处理器只支持垂直寻找,十分浪费处理器资源,令视讯编码工作变得冗长,在没有SSE4指令集时,以上工作所需指令如下:
if (ret
ret=sum1;
best_mv->x=mv.x;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum1;
best_mv->x=mv.x+1;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum2;
best_mv->x=mv.x+2;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum3;
best_mv->x=mv.x+3;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum4;
best_mv->x=mv.x+4;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum5;
best_mv->x=mv.x+5;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum6;
best_mv->x=mv.x+6;
best_mv->y=mv.y+line;
}
if (ret
{
ret=sum7;
best_mv->x=mv.x+7;
best_mv->y=mv.y+line;
}
当软件支持SSE4指令集,以上复杂的指令组却只需要1条水平式搜查指令便可完成:
Phminposuw xmm7,xmm7
据 Intel 资深工程师兼 Penryn 微架构主管 Stephen Fischer 表示,全新 DivX Alaph 内部测试版本已完全支持 SSE4 指令集,1 颗 3.33G Hz 的 Yorkfield 的运算效能,相比上代 Intel Core 2 Duo QX6800 快约 105% ,其中约 7 成的增益来自 SSE4 指令集,效果令人满意。