【发布时间】:2015-12-02 05:53:05
【问题描述】:
根据从 8x8 到 20x20 的矩阵大小,我有不同的方阵乘法函数。这些函数彼此不同,因为每个函数都采用不同的优化策略,即不同的循环排列和不同的循环展开因子。矩阵大小在程序的生命周期内是不变的。我的目标是减少决定必须使用哪个功能的时间。例如,一个简单的实现是:
if (matrixSize == 8) C = mxm8(A, B);
else if (matrixSize == 9) C = mxm9(A,B);
...
else if (matrixSize == 20) C = mxm20(A,B);
在这种情况下,决定每次矩阵乘法使用哪个函数所花费的时间是非常重要的。是否可以立即调用适当的函数,或者使用 C++ 函数模板?
【问题讨论】:
-
如果
matrixSize是编译时常量,那么我完全期望优化编译器在编译时选择分支,并生成相当于单个函数调用的机器代码。如果matrixSize不是编译时常量,那么模板无论如何也无济于事——在运行时不必进行分支。 -
The time taken to decide which function to use for every matrix multiplication is non-trivial in this case.恕我直言,我觉得这很难相信。你有没有在非调试优化的构建上实际测量过这个时间? -
谢谢。我认为矩阵大小可以作为编译时间常数,因为与运行时间相比,编译时间可以忽略不计。尽管我没有测量分支的时间,但我可以看到当在我的应用程序中有大量调用此函数时它很受欢迎 - 100,000 甚至更多。
-
如果它不是编译时间常数,那么改变逻辑以使用 switch 语句可能会有所帮助 - 尽管一个好的优化编译器可能会以与 switch 相同的方式优化上述内容。
-
在最简单的情况下:创建一个全局变量
Matrix (*mxm)(Matrix, Matrix)(调整类型以适应口味)。一旦知道大小,设置mxm指向对应的函数;你只会分支一次。之后,只需拨打mxm。
标签: c++ templates if-statement optimization