从我读过的.net 4.0预览到现在已经有很多关于下一个.net版本如何处理和使用带有多个内核的cpus的讨论。我们将有像plinq这样的附加功能,可以帮助我们使用多个内核。我的问题是,当我想要的是让我的应用程序运行得更快时,为什么我必须在处理多个核心时烦恼。为什么不能有一种虚拟cpu层将所有核心暴露为我的应用程序的1核心?
编辑: 我想重新解释我的问题以避免误解, 是否可以制作一个软件,将虚拟线程暴露给我的应用程序,速度要快10倍,因为它使用了10个内核。我不希望让不同的线程在并行中执行操作,我只希望我的一个线程运行得更快。我想今天这不是一个大问题,但很快我们将有80个核心处理器可供使用,然后我会感觉有点简短只使用其中一个。
答案 0 :(得分:12)
因为没有人的帮助就无法实现并行化。
有一定数量可以完成 - 并且已经 在一个核心内完成。微观并行比“分析整个程序并使其并行运行”要容易得多,原因很明显。一般而言,编写并行程序时必须做出的许多困难决定取决于您希望程序执行的操作,以及它在各种条件下的行为。
随着时间的推移,有可能会更多地自动并行化,但我很高兴目前手动操作变得非常容易。
编辑:在您的问题中看过编辑后,没有办法让它变得更快。对此有一个非常简单的物理隐喻:怀孕需要9个月。如果您有9名孕妇,9个月后最终可能会有9名婴儿,但是您不能让9名女性在1个月内生育1名婴儿。它只是不起作用。并非所有问题都是可并行的。 (弗雷德布鲁克斯:“无论分配多少女性,孩子的生活需要9个月。”(神话人月,第17页))答案 1 :(得分:4)
您首先误解了多核的重点。
使用多个核心,您可以并行执行两个或多个不同的操作(同时)。这称为线程。
这不能自动完成,因为您编写的“普通”程序是线性的。您不能轻易地将一系列指令转换为几个指令系列而不考虑副作用。
例如,GPU(图形卡上的专用CPU)可能包含数百个“核心”(流处理器),它们并行运行以渲染屏幕上的像素。只需一个处理器,您就必须在超高速处理器上逐像素渲染才能达到同样的效果。CPU制造商迁移到多个核心的原因是因为以更高的速度制造单个核心变得更加困难和昂贵,并且单个核心将以两倍速度吸收更多功率并产生比两个核心更多的热量(基本上;在所有情况下都不是这样)。
答案 2 :(得分:0)
是和否..如果您希望能够正常编程,但让系统“神奇地”使用多个线程,那么您需要查看一些多处理框架。例如:OpenMP。
如果要使用所有核心运行数组,请使用以下代码:
int main(int argc, char **argv) {
const int N = 100000;
int i, a[N];
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
return 0;
}
只需添加#pragma即可让你的代码神奇地多线程化。现在,你必须了解一些限制,例如。你不能在下一个元素的处理中使用一个元素的值(即你不能将[0]设置为1,然后将1设置为[0] +1等,因为它们无疑会被处理由不同的线程,因此可能无法在需要时计算)或者你会从openmp编译器中得到错误,但如果你在这些限制内工作(并且有很多),那么你可以得到你想要的。
这些限制是使您的代码无法实现的最终目标的原因。在我的示例中,除非已经计算了第一个元素,否则您根本无法基于另一个计算1个元素。这实际上意味着像这样的代码只能是单线程的,无论你有多少核心。
这也意味着80核芯片不会很快真正起飞,除非它们都是3Ghz通用处理器,所以你不必过于担心必须为它们编码。现在,附加协处理器可以处理像我的例子中那样编码的阵列,这是另一回事,我希望将来可以看到更多。你可能会use the graphics card for that kind of thing并且拥有数千个'cpus',而不仅仅是80.