我如何优化算法和条件在这个for循环

How can I optimize the arithmetic and conditionals in this for loop?

本文关键字:条件 循环 for 算法 何优化 优化      更新时间:2023-10-16
for (int i = 0; i < someValue; i += 4) {
  __m64 mmxValue;
  if (i + 3 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], _buffer[i + 2], _buffer[i + 3]);
      // add and use result
  } else if (i + 2 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], _buffer[i + 2], 0);
      // add and use result
  } else if (i + 1 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], 0, 0);
      // add and use result
  } else {
      mmxValue = _mm_set_pi16(_buffer[i], 0, 0, 0);
      // add and use result
  }
}

我试图用最多4个16位带符号的值设置mmxValue,然后我将在每个条件中用于添加。

我想知道是否有可能以更优的方式使用更少的条件(或根本没有)重写这个。

条件存在,因为对于i>= someValue的值,_buffer的索引超出了范围

更快的循环将移动4,直到到达最后一个块

int i = 0;
while (i <= somevalue-4) {
    mmxValue = _mm_set_pi16(_buffer[i],
                            _buffer[i+1],
                            _buffer[i+2],
                            _buffer[i+3]);
    ... use the the result ...
    i += 4;
}
... handle only last block with conditionals ...

当然,如果可能的话,更好的方法是扩大_buffer变量,以便为填充所需的额外零提供空间。