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的代码,谢谢了。

解决方案 »

  1.   

    nCoeffU是long型,4个long可以分成两组(SSE),或者合并成一组(SSE2)。
    nCoeffV跟上面一样。
    pPixel因为是short,不好跟上面对应,建议也改成long型。这样产生了六个64位变量或者三个128位变量,以4字节为单位执行乘法指令,一个指令就能获得第一个表达式的值。
    第二个表达式需要为nVal构造一个64位或128位变量,也是以4字节为单位执行乘法指令,但是累加需要自己来做。
    第三个表达式有问题,pPixel定义的是const数组,怎么能执行 += 操作呢?代码我就不想提供了,可以参考MSDN示例代码中对MMX指令的封装类,也可以直接使用这些封装类。
      

  2.   

    用intel C++编译,自动优化
      

  3.   

    看了一下,优化之后效率并没有提高多少,能不能将数据长度尽量压缩,
    比如 将 nCoeffU, nCoeffV压缩成word型,将pPixel压缩成byte型,这样才好并行处理。
      

  4.   

    大致总结了提高效率的一些技巧
    1、尽量减少内存的读取次数,也就是一次读取尽可能多的数据。
    2、尽量减少不连续内存的读取。
    3、将除法转化成乘法,例如,除以9可以转化为:乘以 65536/9 再移位,或者使用PMULHW指令与65536/9操作。