我在程序的最内层循环中有以下代码
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/