MSVC是否自动优化双核架构的计算?

时间:2010-01-14 03:28:56

标签: c++ visual-studio architecture compiler-construction

MSVC会自动优化双核架构的计算吗?

void Func()
{
   Computation1();
   Computation2();
}

如果在函数中没有关系的2计算,是视觉工作室

编译器会自动优化计算并将它们分配给不同的核心吗?

5 个答案:

答案 0 :(得分:9)

不要引用我,但我对此表示怀疑。 OpenMP pragma是你在这里尝试做的最接近的事情,但即便如此,你必须告诉编译器使用OpenMP并描述任务。

除非链接到本质上是多线程的库,否则如果要使用两个核心,则必须设置线程并智能地划分您想要的工作。

答案 1 :(得分:6)

没有。由您来创建线程(或光纤)并指定在每个线程上运行的代码。定义的函数将按顺序运行。它可能在执行期间切换到另一个线程(感谢Drew) core ,但它仍然是顺序的。为了使两个函数在两个不同的内核上并发运行,它们必须首先在两个不同的线程中运行。

正如greyfade指出的那样,编译器无法检测是否可能。事实上,我怀疑这是NP-Complete类问题。如果我错了,我相信其中一位编译大师会告诉我。

答案 2 :(得分:2)

编译器没有可靠的方法来检测这两个函数是完全独立的还是没有状态。因此,编译器无法知道将它们分解为单独的执行线程是安全的。事实上,线程甚至不是C ++标准的一部分(直到C ++ 1x),即使它们将成为它们,它们也不会成为内在特性 - 您必须明确地使用该特性才能从中受益。

如果你希望你的两个函数在独立的线程中运行,那么为它们创建独立的线程来执行。检查boost::thread(如果你的编译器有它,它也可以在std::tr1命名空间中使用)。它易于使用,非常适合您的使用案例。

答案 3 :(得分:2)

没有。如果编译器在你背后做了这样的事情,那么疯狂就会随之而来;如果Computation2依赖于Computation1的副作用怎么办?

如果你正在使用VC10,请查看Concurrency Runtime(ConcRT或“音乐会”),它是Parallel Patterns Library(PPL)的合作伙伴

类似的解决方案包括OpenMP(一种旧的和破坏的IMO,但得到广泛支持)和英特尔的Threading Building Blocks(TBB)。

答案 4 :(得分:2)

编译器无法判断这是不是一个好主意。

首先,当然,编译器必须能够证明它是一个安全的优化:函数可以安全地并行执行。一般来说,这是一个NP完全问题,但在很多简单的情况下,编译器可以解决这个问题(它已经做了大量的依赖性分析)。

一些更大的问题是:

  • 它可能会变慢。创建线程是一项相当昂贵的操作。这样做的成本可能会超过并行化代码的收益。
  • 无论CPU核心数量多少,它都必须正常工作。编译器不知道运行程序时可用的核心数。所以它必须插入某种可选的分叉代码。如果核心可用,请遵循此代码路径并分支到单独的线程,否则请遵循此其他代码路径。而且,更多代码和更多条件也会对性能产生影响。结果还值得吗?或许,但编译器应该怎么知道呢?
  • 它可能不是程序员所期望的。如果我已经在双核系统上精确创建了两个CPU重的线程怎么办?我希望它们都能在99%的时间内运行。突然,编译器决定在底层创建更多线程,突然间我有三个 CPU重线程,这意味着我的执行时间比我预期的少。
  • 应该多少次这样做?如果在循环中运行代码,它是否应该在每次迭代中生成一个新线程?迟早增加的内存使用量开始受到伤害。

总的来说,这不值得。有太多的情况可能适得其反。除了编译器只能在相当简单的情况下安全地应用优化这一事实之外,它不值得为此烦恼。