c++ - 如何快速找到 vector 和的最大元素?

标签 c++ algorithm performance intrinsics

我在程序的最内层循环中有以下代码

struct V {
  float val [200]; // 0 <= val[i] <= 1
};

V a[600];
V b[250];
V c[250];
V d[350];
V e[350];

// ... init values in a,b,c,d,e ...

int findmax(int ai, int bi, int ci, int di, int ei) {
  float best_val = 0.0;
  int best_ii = -1;

  for (int ii = 0; ii < 200; ii++) {
    float act_val =
      a[ai].val[ii] +
      b[bi].val[ii] +
      c[ci].val[ii] +
      d[ci].val[ii] +
      e[ci].val[ii];

    if (act_val > best_val) {
      best_val = act_val;
      best_ii = ii;
    }
  }

  return best_ii;
}

我不在乎它是一些聪明的算法(但这将是最有趣的)还是一些 C++ 技巧或内在函数或汇编程序。但我需要使 findmax 函数更高效。

非常感谢。

编辑: 分支似乎是最慢的操作(预测错误?)。

最佳答案

如果编译器难以缩短跳转,这可能会有所帮助:

int findmax(int ai, int bi, int ci, int di, int ei) {
  float best_val = 0.0;
  int best_ii = -1;

  float* a_it = &a[ai].val[0]
  float* b_it = &b[bi].val[0]
  float* c_it = &c[ci].val[0]
  float* d_it = &d[di].val[0] // assume typo ci->di
  float* e_it = &e[ei].val[0] // assume typo ci->ei

  for (int ii = 0; ii < 200; ii++) {
    float act_val = *(a_it++) + *(b_it++) + *(c_it++) + *(d_it++) + *(e_it++);
    best_val =  (act_val <= best_val) ? best_val : act_val; // becomes _fsel
    best_ii  =  (act_val <= best_val) ? best_ii : ii; // becomes _fsel
  }

  return best_ii;
}

就缓存未命中而言,生成总和表可能会更快我稍后会发布:

int findmax(int ai, int bi, int ci, int di, int ei) {
  float best_val = 0.0;
  int best_ii = -1;

  float* its[] = {&a[ai].val[0], &a[bi].val[0], &a[ci].val[0], &a[di].val[0], &a[ei].val[0] };

  V sums;
  for (int ii = 0; ii < 200; ii++) {
    sums.val[ii] = * (++its[0]);
  }

  for (int iter = 1 ; iter < 5; ++iter)  {
      for (int ii = 0; ii < 200; ii++) {
        sums.val[ii] += * (++its[iter]);
      }
    }
  }
  for (int ii = 0; ii < 200; ii++) {
    best_val =  (sums.val[ii] <= best_val) ? best_val : sums.val[ii]; // becomes _fsel
    best_ii  =  (sums.val[ii] <= best_val) ? best_ii : ii; // becomes _fsel
  } 
  return best_ii;
}

关于c++ - 如何快速找到 vector 和的最大元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374372/

相关文章:

c++ - cocos2d-x v3 CallFunc 作为参数/变量如何

c++ - BitBlt 问题 GDI

ruby - 用于配对两个数组元素的快速 Ruby 方法/算法

Python:变长元组

c++ - 将具有数字的十六进制表示形式的字符串转换为实际数值

c++ - 错误 Id 到错误字符串映射 - C++ 中的实现

算法:使用 union find 来计算岛屿的数量

java - 在 Java 中展平迭代器的迭代器

java - 最佳 Collection 使用?

java - 在 JAVA 中使用 BLOB 获得更好的性能