32x32乘以并添加优化

vik*_*smk 3 c optimization loops

我正在努力优化应用程序.我发现我需要优化内循环以提高性能.rgiFilter是一个16位的arrary.

for (i = 0; i < iLen; i++) {
    iPredErr = (I32)*rgiResidue;
    rgiFilter = rgiFilterBuf;
    rgiPrevVal = rgiPrevValRdBuf + iRecent;
    rgiUpdate = rgiUpdateRdBuf + iRecent;

    iPred = iScalingOffset;

    for (j = 0; j < iOrder_Div_8; j++) {


                 iPred += (I32) rgiFilter[0] * rgiPrevVal[0]; 
                 rgiFilter[0] += rgiUpdate[0];

                 iPred += (I32) rgiFilter[1] * rgiPrevVal[1]; 
                 rgiFilter[1] += rgiUpdate[1];

                 iPred += (I32) rgiFilter[2] * rgiPrevVal[2]; 
                 rgiFilter[2] += rgiUpdate[2];

                 iPred += (I32) rgiFilter[3] * rgiPrevVal[3]; 
                 rgiFilter[3] += rgiUpdate[3];

                 iPred += (I32) rgiFilter[4] * rgiPrevVal[4]; 
                 rgiFilter[4] += rgiUpdate[4];

                 iPred += (I32) rgiFilter[5] * rgiPrevVal[5]; 
                 rgiFilter[5] += rgiUpdate[5];

                 iPred += (I32) rgiFilter[6] * rgiPrevVal[6]; 
                 rgiFilter[6] += rgiUpdate[6];

                 iPred += (I32) rgiFilter[7] * rgiPrevVal[7]; 
                 rgiFilter[7] += rgiUpdate[7];

                    rgiFilter += 8;
        rgiPrevVal += 8;
                    rgiUpdate += 8;



}
Run Code Online (Sandbox Code Playgroud)

颂歌

Bli*_*ndy 5

您唯一的选择是一次执行多个操作,这意味着以下3个选项之一:

  1. SSE指令(SIMD).您可以使用单个指令处理多个内存位置
  2. 多线程(MIMD).如果你有超过1个CPU核心,这个效果最好.将数组拆分为多个相似大小的条带,它们彼此独立(依赖性会大大增加此选项的复杂性,如果需要大量锁定,则比顺序计算所有内容要慢).请注意,数组必须足够大,以抵消额外的上下文切换和同步开销(它非常小,但不可忽略).最适合4芯或更多芯片.
  3. 两个都是一次.如果你的阵列真的很大,你可以通过两者结合获得很多.