对于多核处理器C++11或更高版本,计数高达数十亿


#include <iostream>
using namespace std;
volatile int counter = 0;
int main(int argc, char** argv){
size_t nb_iter = 1000000000;
for( int i=0; i<nb_iter; i++){
counter ++;
}
printf("counter: %ld / %ldn", counter, nb_iter);
return 0;
}

这需要大约2.19秒来构建和运行代码,如何在多核处理器中进行优化?

这需要大约2.19秒来构建和运行代码

这就像在说"我的车很慢,它在5天15秒内达到0-100km/h;其中5天是工厂制造汽车的时间。构建时间和执行时间是两个完全不相关的东西,彼此之间没有任何关系。

我们如何优化

volatile填充此代码的唯一目的是防止优化发生。可能是因为有人希望执行循环,而不是优化。如果你去掉volatile,循环就会得到优化,每个人都会很高兴。

在多核处理器中优化

由于counter++的本质是基于上一个值进行加法,因此不能以合理的方式执行此操作。要将工作拆分到多个工作线程上,理想情况下,它们应该能够在不了解彼此结果的情况下进行操作。

当然,你可以创建x个线程进行伪计数,每个线程都有自己的计数器。但我看不出这样做的目的——它不一定会带来任何性能优势,因为你必须考虑线程创建开销。

重要的是要理解线程并不是在任何情况下都能神奇地提高性能。您可以考虑手动创建线程并从那里进行基准测试,同时考虑或不考虑线程创建开销。当你尝试过并理解了它之后,才考虑玩OpenMP之类的东西。

最新更新