如何优化for循环中的算术和条件?

时间:2014-03-15 07:23:26

标签: c++ optimization

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的索引超出范围。

1 个答案:

答案 0 :(得分:2)

更快的循环将移动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变量,以便它有足够的空间来填充填充所需的额外零。