long nSum = 0;for (int i=0; i<4; i++)
{
long nVal = nCoeffU[0]*pPixel[0] + nCoeffU[1]*pPixel[1] + nCoeffU[2]*pPixel[2] + nCoeffU[3]*pPixel[3];
nSum += nCoeffV[i]*nVal;
pPixel += pPic.nWidth;
}其中long nCoeffU[4], nCoeffV[4]; short pPixel[4]都是一些已经计算出来的数值哪位大哥能帮我改成MMX的代码,谢谢了。
{
long nVal = nCoeffU[0]*pPixel[0] + nCoeffU[1]*pPixel[1] + nCoeffU[2]*pPixel[2] + nCoeffU[3]*pPixel[3];
nSum += nCoeffV[i]*nVal;
pPixel += pPic.nWidth;
}其中long nCoeffU[4], nCoeffV[4]; short pPixel[4]都是一些已经计算出来的数值哪位大哥能帮我改成MMX的代码,谢谢了。
nCoeffV跟上面一样。
pPixel因为是short,不好跟上面对应,建议也改成long型。这样产生了六个64位变量或者三个128位变量,以4字节为单位执行乘法指令,一个指令就能获得第一个表达式的值。
第二个表达式需要为nVal构造一个64位或128位变量,也是以4字节为单位执行乘法指令,但是累加需要自己来做。
第三个表达式有问题,pPixel定义的是const数组,怎么能执行 += 操作呢?代码我就不想提供了,可以参考MSDN示例代码中对MMX指令的封装类,也可以直接使用这些封装类。
比如 将 nCoeffU, nCoeffV压缩成word型,将pPixel压缩成byte型,这样才好并行处理。
1、尽量减少内存的读取次数,也就是一次读取尽可能多的数据。
2、尽量减少不连续内存的读取。
3、将除法转化成乘法,例如,除以9可以转化为:乘以 65536/9 再移位,或者使用PMULHW指令与65536/9操作。