我仍在学习 C++,并为其编写粒子模拟库。我想尽可能优化我的工作代码,我的下一个瓶颈是我的向量运算符。
我创建了一个模板向量类,该类取决于向量中包含的类型和维度:
template<typename T, unsigned int D>
class Vector {
private:
T values[D];
}
Run Code Online (Sandbox Code Playgroud)
然后我的运算符定义如下:
template<typename T, unsigned int D>
Vector<T, D> operator+(const Vector<T, D>& v1, const Vector<T, D>& v2) {
T values [D];
for(unsigned int i = 0; i < D; i++) {
values[i] = v1[i] + v2[i];
}
return Vector<T, D>(values);
}
Run Code Online (Sandbox Code Playgroud)
在我的模拟中,我最终进行了大量的矢量计算,我想尝试优化它。
我的第一个假设是,如果我提前知道尺寸,我可以摆脱循环并得到类似的东西:
T values[3];
values[0] = v1[0] + v2[0];
values[1] = v1[1] + v2[1];
values[2] = v1[2] + v2[2];
return Vector<T, 3>(values);
Run Code Online (Sandbox Code Playgroud)
所以我想到了一个递归宏,如下所示:
#define vec_sum(D, values, v1, v2) if D > 0 {
vec_sum(D-1, values, v1, v2)
values[D-1] = v1[D-1] + v2[D-1];
} else {
values[0] = v1[0] + v2[0];
}
Run Code Online (Sandbox Code Playgroud)
然后,我的函数将如下所示:
template<typename T, unsigned int D>
Vector<T, D> operator+(const Vector<T, D>& v1, const Vector<T, D>& v2) {
T values [D];
vec_sum(D, values, v1, v2)
return Vector<T, D>(values);
}
Run Code Online (Sandbox Code Playgroud)
C++ 可以生成这样的代码吗?
用手做是没有意义的。编译器可以将循环展开自身作为优化步骤。
如果您在正确读取生成的程序集和基准测试后发现编译器优化不理想,则可以将编译器特定的属性添加到循环中以通知编译器展开它。
展开是否有益也不是显而易见的,取决于具体情况。如果您没有进行基准测试,并且对您正在编译的架构/CPU 没有更深入的了解,那么就不要默认认为它一定具有更高的性能。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |