2

我认为拥有一台四核计算机的意义在于不断增加。但我想知道这究竟发生在正常日常计算的哪个阶段。

如果我编写 C 代码来执行矩阵乘法(并行计算的“Hello World”),我系统上的编译器会自动知道如何针对所有 4 个内核进行优化吗?或者我是否必须在我的程序中显式创建多个线程才能利用所有 4 个内核?

基本上我想知道的是有多少程序是自动并行的,而程序员可以通过使调度程序发送到不同内核的多个线程来优化多少。

4

4 回答 4

2

如果您用纯 C 编写,则必须自己创建多个线程,或者使用 OpenMP(非常适合矩阵乘法;您可以编写代码以使用 OpenMP 将循环中的工作拆分为多个线程)为您生成线程代码。

但是,负载平衡必须由您完成。

一个程序必须有多个线程才能在不同的内核上运行。

于 2012-05-27T04:55:43.653 回答
1

几乎如果你用任何你知道的语言编写程序,它就不会并行运行。

要在此类语言中获得并行性,您必须求助于内置语言功能(“fork”或“do parallel”)或以某种方式使用线程的外部库。

函数式语言的人声称其主要价值之一是没有副作用,因此实际上您的整个函数式程序可以并行执行。我发现令人惊讶的是,Haskell 人员随后继续为您提供(据我所知,坚持使用)您想要的显式并行原语。

于 2012-05-27T04:55:45.773 回答
1

系统不知道如何在内核之间分配工作。由您来编写程序来分配工作量。只有当你有很多工作要做时,这才是值得的。这是线程的重要用途之一。

于 2012-05-27T04:56:53.060 回答
1

越来越多的框架和语言集成特性使声明式并行计算变得更加容易。但是,它仍然需要您对代码进行一些更改。更改量可以很小(几行)或很大(完全重写),这取决于代码的性质以及您的代码和框架之间是否有很好的契合。

有一些不需要你管理线程的并行化方法。这些通常被称为任务并行、数据并行、参与者、代理等。

于 2012-05-27T05:04:00.487 回答