我有一个需要快速运行的代码,我正在优化内循环运行几百万亿次。
为了实现这一点,我在这个内循环中编写了几个不同版本的代码,一些使用了朴素的方法,一些使用了SSE内在函数等等。我做了所有这一切的想法,当我运行它时在特定的硬件组合上,我可以运行测试,看看哪种实现/编译器命令组合最好并运行它。
首先,当它只有两种不同的方法时,我在循环中使用了一个简单的条件编译,如下所示
do
{
#ifdef naive_loop
//more code here
#endif
#ifdef partially_unrolled_loop
//more code here
#endif
}
while( runNumber < maxRun );
后来随着我尝试的变化和不同事物的数量增长,它变成了这个:
#ifdef naive_loop
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
#ifdef partially_unrolled_loop
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
#ifdef sse_intrinsics
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
//etc
然而,这使得我的文件变得庞大而且令人烦恼。 有更优雅的方式吗?
答案 0 :(得分:4)
您可以使用模板和模板专业化来完成工作。例如:
template <typename T>
class CalcRunner;
template <>
class CalcRunner<naive_loop>
{
void loopFunction(void){...}
};
template <>
class CalcRunner<partially_unrolled_loop>
{
void loopFunction(void){...}
};
// Now instantiate what you wanna at compiler time
typename CalcRunner<partially_unrolled_loop> CalcRunner_t
int main()
{
CalcRunner_t runner;
runner.loopFunction();
}
答案 1 :(得分:1)
为什么不将不同的实现放在不同的文件中,并有条件地包含正确的实现? 这就是人们通常对多平台代码所做的事情。