MSVC会自动优化双核架构的计算吗?
void Func()
{
Computation1();
Computation2();
}
如果在函数中没有关系的2计算,是视觉工作室
编译器会自动优化计算并将它们分配给不同的核心吗?
答案 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完全问题,但在很多简单的情况下,编译器可以解决这个问题(它已经做了大量的依赖性分析)。
一些更大的问题是:
总的来说,这不值得。有太多的情况可能适得其反。除了编译器只能在相当简单的情况下安全地应用优化这一事实之外,它不值得为此烦恼。