【发布时间】:2010-12-08 03:19:45
【问题描述】:
我有一个四核处理器,我真的很想在运行快速模拟时利用所有这些内核。问题是我只熟悉我们实验室的小型 Linux 集群,而我在家里使用的是 Vista。
对于使用 C 或 Java 进行多核编程,我希望了解哪些方面的内容?我想用谷歌搜索什么术语?
感谢您的帮助。
【问题讨论】:
-
实际上,我在发帖前通读了这两个问题,觉得他们没有回答我的具体问题:我进入多核编程需要什么必要的术语......
我有一个四核处理器,我真的很想在运行快速模拟时利用所有这些内核。问题是我只熟悉我们实验室的小型 Linux 集群,而我在家里使用的是 Vista。
对于使用 C 或 Java 进行多核编程,我希望了解哪些方面的内容?我想用谷歌搜索什么术语?
感谢您的帮助。
【问题讨论】:
关键词是“线程”——不能在集群中工作,但在单个多核机器上就可以了(实际上,在任何类型的 Windows 上,要好得多而不是产生多个进程——与 Linux 相比,Windows 的进程相当重)。在 C 中不是那么容易,在 Java 中非常容易——例如,start here!
【讨论】:
您需要创建多线程程序。 Java 支持开箱即用的多线程(尽管较旧的 JVM 在一个内核上运行所有线程)。对于 C,您需要使用特定于平台的代码来创建和操作线程(Linux 为 pthread*,Windows 为 CreateThread 和 company)。或者,您可能希望从 C++ 中进行线程处理,其中有相当数量的库(例如 Boost::threads)以使生活更简单并允许可移植代码。
如果您希望代码可以在具有多核和集群的单台机器上移植,您可以考虑 MPI。它确实适用于集群情况,但已被移植到具有多个处理器或多个内核的单台机器上工作——尽管它不如专门为单台机器编写的代码高效。
【讨论】:
所以,这是一个非常广泛的问题。您可以使用多种不同的编程语言(包括 C 或 Java)来试验多线程编程。如果你想让我为你选一个,那么我会选 C。:)
您想研究 Windows 线程、POSIX 线程(或 Java 中的多线程,如果那是语言的话)。您可能想尝试找出一些问题进行试验。我建议尝试矩阵乘法;从顺序版本开始,然后尝试使用线程来改进时间。
此外,OpenMP 可用于 Windows,并为如何进行多线程编程提供了截然不同的视图。
【讨论】:
【讨论】:
很多人都谈到了线程,这是一种方法,但考虑另一种方法。如果您有多个 JVM 启动、连接到网络并等待工作的到来怎么办?您将如何对应用程序进行编程,以便它可以在不知道它们是否在同一个 CPU 上的情况下利用所有这些 JVM?
在四核机器上,您应该能够运行 12 个或更多 JVM 来处理工作。如果您从这个角度处理问题,扩展到多台计算机是相当简单的,尽管当您通过真实网络进行通信时,您必须考虑更高的网络延迟。
【讨论】:
好点……除非你知道一些关键字,否则你不能用谷歌搜索它。
C: google pthread,Posix Thread 的缩写,虽然 win32 原生接口是非 posix 的,见Creating Threads on MSDN。
Java: See class Thread
最后,您应该阅读一些有关函数式编程、actor 并发和不可变对象的知识。事实证明,在普通的旧共享内存中管理并发非常困难,但是消息传递和函数式编程可以让您使用本质上更安全的样式并避免并发问题。 Java 确实允许您以艰难的方式完成所有工作,其中数据是可变的共享内存,并且您拼命尝试手动互锁共享状态结构。但是您也可以在 java.util.s 中使用高级样式。也许从这篇 JavaWorld 文章开始:Actors on the JVM。
【讨论】:
即使您专门要求使用 C 或 Java,如果这只是一个学习练习,Erlang 也不是一个糟糕的语言选择
它允许您非常轻松地进行多进程样式编程,并且它具有大量库,可让您深入了解您喜欢的任何级别。
它以非常实用的方式为分布式编程而构建。如果您对 java 很熟悉,那么过渡应该不会太困难。
如果您有兴趣,我会推荐 Joe Armstrong 的《Programming Erlang》一书。
(请注意:还有其他语言被设计为在像 Haskell 这样的高度并行环境中运行。Erlang 往往比 Haskell 等更注重理论的语言更实用)
【讨论】:
Here 是有关 C# 线程的一个很好的信息来源。
【讨论】:
如果您想做简单的线程,例如并行循环,我建议您查看 .NET 4.0 Beta(VS2010 Beta 中的 C#)。
Joe 链接到的书章节是我自己使用并强烈推荐的一本非常好的书,但没有涵盖 .NET 框架的新并行扩展。
【讨论】:
是的,很多线程,但是如果线程访问内存中的相同位置,则只有一个线程会执行,
我们需要多个内存核心
【讨论】:
到目前为止,在 Windows 上进行多核编程的最简单方法是使用 .NET 4 和 C# 或 F#。 Here 是一个简单的示例,其中并行程序(来自枪战)在 F# 中比 Java 短 7 倍,并且速度一样快。
.NET 4 为并行编程提供了很多新的基础设施,而且非常易于使用。
【讨论】:
您所说的“利用”对我来说听起来不仅仅是做任何多线程。我书中的模拟是计算密集型的,在这方面最有效的语言是 C。有人会说汇编,但很少有 x86 汇编程序员可以击败现代 C 编译器。
对于 Windows NT 引擎(NT4、2000、XP、Vista 和 7),您应该研究的机制是线程、临界区和 I/O 完成端口 (iocp)。线程很好,但您需要能够在它们之间以及与 I/O 同步,这是 cs 和 iocps 的用武之地。为了确保从代码中榨取最后一点性能,您需要分析、分析、实验/重建。非常有趣,但非常耗时。
【讨论】:
单个进程中可以存在多个线程。属于同一进程的线程共享相同的内存区域(可以读取和写入相同的变量,并且可以相互干扰)。相反,不同的进程生活在不同的内存区域,每个进程都有自己的变量。为了进行通信,进程必须使用其他通道(文件、管道或套接字)。
如果您想并行计算,您可能需要多线程,因为您可能希望线程在同一内存上协作。
谈到性能,线程比进程更快地创建和管理(因为操作系统不需要分配全新的虚拟内存区域),并且线程间通信通常比进程间通信更快。但是线程更难编程。线程可以相互干扰,并且可以写入彼此的内存,但这种情况发生的方式并不总是很明显(由于多种因素,主要是指令重新排序和内存缓存),因此您将需要同步原语来控制访问到你的变量。
取自this answer。
【讨论】: