Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC是否自动优化双核架构上的计算?_C++_Visual Studio_Architecture_Compiler Construction - Fatal编程技术网

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

C++ MSVC是否自动优化双核架构上的计算?,c++,visual-studio,architecture,compiler-construction,C++,Visual Studio,Architecture,Compiler Construction,MSVC是否自动优化双核架构上的计算 void Func() { Computation1(); Computation2(); } 如果给定2计算,且函数中没有关系,visual studio 编译器会自动优化计算并将它们分配到不同的内核?否。您可以创建线程(或光纤)并指定在每个线程上运行的代码。定义的函数将按顺序运行。在执行过程中,它可能会切换到另一个线程(感谢Drew)核心,但仍然是顺序的。为了使两个函数在两个不同的内核上同时运行,它们必须首先在两个单独的线程中运行 正如gr

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

void Func()
{
   Computation1();
   Computation2();
}
如果给定2计算,且函数中没有关系,visual studio


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

否。您可以创建线程(或光纤)并指定在每个线程上运行的代码。定义的函数将按顺序运行。在执行过程中,它可能会切换到另一个线程(感谢Drew)核心,但仍然是顺序的。为了使两个函数在两个不同的内核上同时运行,它们必须首先在两个单独的线程中运行


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

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


正如greyfade指出的那样,编译器无法检测它是否可行。事实上,我怀疑这是一类问题。如果我错了,我相信一位编译器大师会让我知道。

不要引用我的话,但我对此表示怀疑。OpenMP pragmas是最接近您在这里尝试执行的操作,但即使如此,您也必须告诉编译器使用OpenMP并描述任务


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

请不要引用我的话,但我对此表示怀疑。OpenMP pragmas是最接近您在这里尝试执行的操作,但即使如此,您也必须告诉编译器使用OpenMP并描述任务


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

编译器无法可靠地检测这两个函数是否完全独立且没有状态。因此,编译器无法知道将它们分解为单独的执行线程是安全的。事实上,线程甚至不是C++标准的一部分(直到C++ 1x),即使它们将是,它们也不会是一个固有的特征——你必须明确地使用它来从中受益。
如果希望两个函数在独立线程中运行,则创建独立线程以供它们在中执行。签出(如果您的编译器有,
std::tr1
名称空间中也有该名称空间)。它很容易使用,并且非常适合您的用例。

编译器没有可靠的方法来检测这两个函数是否完全独立,它们是否没有状态。因此,编译器无法知道将它们分解为单独的执行线程是安全的。事实上,线程甚至不是C++标准的一部分(直到C++ 1x),即使它们将是,它们也不会是一个固有的特征——你必须明确地使用它来从中受益。
如果希望两个函数在独立线程中运行,则创建独立线程以供它们在中执行。签出(如果您的编译器有,
std::tr1
名称空间中也有该名称空间)。它很容易使用,并且非常适合您的用例。

不。如果编译器在您背后做这样的事情,那么疯狂就会接踵而至;如果计算2依赖于计算1的副作用呢

如果您使用的是VC10,请查看(ConcRT或“concert”)及其合作伙伴(PPL)


类似的解决方案包括(IMO有点老掉牙,但得到了广泛的支持)和英特尔(TBB)。

不。如果编译器在你背后做这样的事情,疯狂就会接踵而至;如果计算2依赖于计算1的副作用呢

如果您使用的是VC10,请查看(ConcRT或“concert”)及其合作伙伴(PPL)


类似的解决方案包括(IMO有点陈旧,但得到了广泛支持)和Intel(TBB)。

编译器无法判断这是否是个好主意

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

一些更大的问题是:

  • 结果可能会更慢。创建线程是一个相当昂贵的操作。这样做的成本可能会超过并行化代码的收益
  • 无论CPU核的数量如何,它都必须工作良好。编译器不知道运行程序时有多少内核可用。所以它必须插入一些可选的分叉代码。如果核心可用,则遵循此代码路径并分支到单独的线程,否则遵循此其他代码路径。同样,更多的代码和更多的条件也会对性能产生影响。结果还值得吗?也许吧,但是编译器怎么会知道呢
  • 这可能不是程序员所期望的。如果我已经在一个双核系统上创建了两个CPU密集型线程,该怎么办?我预计他们两人99%的时间都在跑步。突然,编译器决定在引擎盖下创建更多线程,突然我有了三个CPU密集型线程,这意味着我的线程得到的执行时间比我预期的要少
  • 它应该这样做多少次?如果在循环中运行代码,它是否应该在每次迭代中生成一个新线程?增加的内存使用量迟早会受到影响