多核编程:做什么是必要的?

我有一个四核处理器,我真的很想利用所有这些核心,当我运行快速模拟。 问题是我只熟悉我们在实验室中使用的小型Linux集群,而我正在家中使用Vista。

用C或Java进行多核编程需要考虑什么样的事情? 什么是我想谷歌的行话?

谢谢您的帮助。

关键词是“线程化” – 在集群中不起作用,但在单个多核机器中将会很好(实际上,在任何类型的Windows上,总体上比产生多个进程好得多 – Windows的进程是与Linux相比相当重)。 在C中不是那么容易,在Java中非常容易 – 例如,从这里开始!

你想要线程和演员

好点…你不能谷歌,除非你知道一些关键字。

C: google pthread ,Posix Thread的简写,尽管win32本地接口是非posix,请参阅MSDN上的创建线程 。

Java: 请参阅类Thread

最后,你应该阅读函数式编程,actor并发和不可变对象。 事实证明,在普通的旧共享内存中管理并发是非常困难的,但是消息传递和函数式编程可以让你使用本质上更安全的样式,避免并发问题。 Java确实可以让你尽一切努力,数据是可变的共享内存,而且你拼命尝试手动互锁共享状态结构。 但是你也可以使用java中的高级风格。 也许从这个JavaWorld文章开始: JVM上的Actor 。

看看这本书: 实践中的Java并发

我想你也应该考虑Clojure。 它运行在JVM上,具有良好的Java互操作性。 作为一个Lisp,它与你习惯于C和Java的不同,所以它可能不是你的一杯茶,但是值得关注一下Clojure解决的问题,因为这个概念是有价值的,不管它是什么你使用的语言。 看看这个视频 ,然后,如果你这么倾向,clojure 网站 ,它链接到一些其他更好的屏幕录像更具体地关于Clojure在右上角。

这取决于你的首选语言是完成工作。

除了线程解决方案之外,您还可以将MPI视为Java和C以及Python或R或任何您喜欢的可能性。 DeinoMPI似乎在Windows上很受欢迎, OpenMPI刚刚在当前版本1.3.3中也支持Windows。

很多人都谈过线程,这是一种方法,但考虑另一种方法。 如果你有几个JVM启动,连接到网络,并等待工作来到他们的方式呢? 你将如何编写一个应用程序,以便它可以利用所有这些JVM而不知道它们是否在同一个CPU上?

在一个quadcore机器上,你应该可以运行12个或更多的JVM来处理工作。 如果从这个角度来看这个问题,扩展到多台计算机是相当简单的,但是当你的通信跨越一个真实的网络时,你必须考虑更高的网络延迟。

这里有一个很好的关于C#线程的信息来源。

您需要创建多线程程序。 Java支持多线程(尽管较老的JVM在一个内核上运行所有线程)。 对于C,您需要使用特定于平台的代码来创建和操作线程(Linux的pthread *,Windows的CreateThread和company)。 或者,你可能想要从C ++进行线程化,在那里有相当数量的库(例如Boost :: threads)使生活更简单一些,并允许可移植的代码。

如果您希望可以在具有多个核心和一个集群的单台计算机上进行移植的代码,则可以查看MPI。 它确实是针对集群的情况,但是已经被移植到具有多个处理器或多个内核的单个机器上,尽管它不像专门为单个机器编写的代码那样高效。

所以,这是一个非常广泛的问题。 您可以使用多种不同的编程语言(包括C或Java)来尝试多线程编程。 如果你想让我为你选一个,那我就选择C.

你想看看Windows线程,POSIX线程(或多线程在Java中,如果这是语言)。 您可能想尝试找出一些问题进行试验。 我建议尝试矩阵乘法; 从一个顺序版本开始,然后尝试使用线程提高时间。

此外,OpenMP可用于Windows,并提供了如何多线程编程的不同观点。

即使你特别要求C或者Java,Erlang也不是一个错误的语言选择,如果这只是一个学习练习

它可以让你非常轻松地进行多进程风格的编程,并且它有一大堆库,可以让你以任何你喜欢的级别进入。

它是以非常实用的方式为分布式编程而构建的。 如果你对Java感到满意,那么转换不应该太困难。

如果您有兴趣,我会推荐Joe Armstrong编写的“Programming Erlang”一书。

(注意:在Haskell这样高度并行的环境中,还有其他的语言是可以运行的,Erlang只比Haskell更为实用)

如果你想做简单的线程,比如并行循环,我建议检查一下.NET 4.0 Beta(VS2010 Beta中的C#)。

Joe的书链接是一个非常好的,我自己使用和强烈推荐,但不包括.NET框架的新并行扩展。

是的,许多线程,但如果线程正在访问内存中的相同位置,只有一个线程将执行,

我们需要多个内存核心

到目前为止,在Windows上执行多核编程最简单的方法是使用.NET 4和C#或F#。 下面是一个简单的例子,其中一个并行程序(来自枪战)在F#中比Java短7倍,同样快。

.NET 4为并行编程提供了许多新的基础结构,而且它非常易于使用。

你说的“利用”对我来说听起来不仅仅是做任何多线程。 在我的书中的模拟是计算密集型的,在这方面,最有效的语言是C.有人会说汇编,但有很少的x86汇编程序员可以打败一个现代的C编译器。

对于Windows NT引擎(NT4,2000,XP,Vista和7),您应该查看的机制是线程,关键部分和I / O完成端口(iocp)。 线程是很好的,但是你需要能够在它们自己之间和I / O进行同步,这是cs和iocps进来的地方。为了确保你的代码中的每一点性能都得到了扭转,你需要进行配置,分析,实验/重建。 很多的乐趣,但非常耗时。

多个线程可以存在于一个进程中。 属于同一进程的线程共享相同的内存区域(可以读取和写入相同的变量,并且可以相互干扰)。 相反,不同的进程存在于不同的存储区域,每个进程都有自己的变量。 为了沟通,流程必须使用其他渠道(文件,管道或套接字)。

如果你想并行化一个计算,你可能会需要多线程,因为你可能希望线程在同一个内存上合作。

说到性能,与线程相比,线程创建和管理的速度更快(因为OS不需要分配全新的虚拟内存区域),线程间通信通常比进程间通信更快。 但是线程更难编程。 线程可以相互干扰,并可以写入对方的内存,但这种情况发生的方式并不总是很明显(由于几个因素,主要是指令重新排序和内存缓存),所以你将需要同步原语来控制访问到你的变量。

从这个答案采取。