【发布时间】:2015-05-22 17:16:30
【问题描述】:
我有一个大数组(图像),我需要对该数据进行许多小的可配置计算。 我将在这里发布一个示例。 注意:这不是实际问题,而是我需要做的一个最小/希望说明性的示例。
// different functions that can be called based on the configuration
float func1( float* a )
{
return (*a) * (*a);
}
float func2( float* a )
{
return (*a) + (*a);
}
float func3( float* a )
{
return 2 * (*a) * (*a);
}
// my data
float* data = new float[1024*1024];
// function that manages the configurations
int main( )
{
int param1 = 0;
int param2 = 1;
for ( int k = 0; k < 1024*1024; k++ )
{
if ( param1 == 2 && param2 == 0 )
data[k] = func1( data + k );
else if ( param1 == 1 && param2 == 1 )
data[k] = func2( data + k );
else if ( param1 == 0 && param2 == 1 )
data[k] = func3( data + k );
else
continue;
}
}
在我的代码中,不将循环放在每个函数中是有意义的。
但是,param1 和 param2 在循环期间保持不变,它们在编译时是已知的。
有没有办法消除 if/elseif 语句的影响?
【问题讨论】:
-
将变量标记为
constexpr(或const),编译器应该能够优化检查并只调用一个函数。如果不确定,请查看生成的汇编代码。此外,如果未调用函数,则没有开销。如果您调用的函数很小,请将它们标记为inline以获取更多优化替代方案。如果您不修改它们,请将参数标记为const。为什么将参数作为指针传递?间接会增加开销。 -
@JoachimPileborg 你怎么看汇编代码?它是什么文件,如何理解?
-
几乎所有编译器都有停止和生成汇编代码而不是二进制目标文件的选项。该选项当然取决于编译器,在 GCC 和 Clang 上它是
-S。 -
真的很想知道“气味可配置计算”是如何完成的;)
-
@PaulEvans 一个人不能放纵他的嗅觉吗?这几天世界怎么了! ;)
标签: c++ performance branch function-pointers branch-prediction