如何为多处理器机器编译C#? (使用VS 2010或csc.exe)

时间:2011-03-07 17:16:46

标签: c# visual-studio-2010 multicore compilation

问候!

我在MSDN搜索了编译器(csc.exe)选项,我在Stackoverflow找到了一个关于compiling with multiple processors的答案。但我的问题是如何编译 for 多个处理器,如下所示。

我毕业的大学有11个机器群(有6个四核和5个四核双处理机)。它在linux下运行,但我可以在那里安装MONO。而不是编译多个处理器或核心,我想编译多个处理器机器。所以:

  • 是否有关于如何操作的特定细节,或者该系统上的CLR应该处理执行以将其分布在核心上?
  • 如果有办法做到这一点,我怎么能用VS2010或csc.exe命令行编译器来做呢?

提前致谢,如果这个问题毫无意义,我很抱歉。我真的不知道如何处理多个核心,因为我只是一个物理学家,而不是计算机科学家!:)

5 个答案:

答案 0 :(得分:11)

您无需进行任何不同的编译即可考虑多个内核。您需要以不同的方式编写代码,以使用多个线程。如果您可以在您的环境中使用.NET 4中的类(Mono的最新版本应该支持此类),您可以使用任务并行库,这使得这更容易。

基本上你没有免费得到并发 - 你必须思考你的代码哪些位可以并行运行。您可能想要阅读Patterns and Practices group for parallel programming的输出。 (这本书是一个非常好的起点。)

答案 1 :(得分:7)

你的假设是正确的;你的问题毫无意义。

不可能神奇地并行化任意代码;您需要修改代码以使用多个线程。

您可以使用ThreadThreadPool类或使用Parallel LINQ或TPL在C#中显式使用多个内核。
没有特殊的编译器。

答案 2 :(得分:2)

默认情况下,CLR不会做任何特别的事情来将工作分散到多个核心。在开发应用程序时,您负责充分利用机器的资源。 .NET Framework确实有几个库和技术使多线程操作易于实现:查找Thread类,Delegate.BeginInvoke / EndInvoke和任务并行库。

答案 3 :(得分:1)

由于它是一个集群,你必须依赖某种形式的消息传递并行性,没有编译器会自动转换你的代码。至少,支持一个好的旧MPI:http://osl.iu.edu/research/mpi.net/

答案 4 :(得分:1)

你的问题的答案来自两个看似矛盾的陈述:

1:它已经

2:你不能

现代操作系统以及开发环境使用线程。从根本上说,一个线程代表处理器将执行的一系列顺序步骤(以及以“S”开头的单词)。这些线程由操作系统和处理器体系结构管理,其中处理器将执行线程的一些部分(或全部),保存其状态,然后切换到另一个线程。

在存在多个内核(无论是多核处理器还是多处理器或两者兼有)的情况下,计算机实际上可以同时执行两个线程,假设它们在内存中读写不同的位置(利用相同资源的线程需要通过在核心之间分配线程来实现同步,这是一个复杂的球赛。

冒着使用过于简单的明喻的风险,可以这样想:你的代码就像现在一样,只是一个非常长的执行特定任务的步骤列表。您现在已经将这个指令列表放入一个满是人的房间(每个代表一个处理核心),并且您希望尽可能高效地使用这些人。虽然一个满是博士生的房间可能具有背景和主题知识,可以弄清楚如何将指示分解为每个人的任务,但是你已经把你的名单带到了一个满是方向的人的房间里。但在演绎方面却完全是愚蠢的。在这种情况下,您需要为每个人带来一组不同的指令,当执行所有时,您最终会得到相同的结果。

简单地说,为了让你的代码利用多个内核或处理器,你必须将你的工作分解成小的,最好是原子的代码块。用于将代码分解为多个线程的特定方法可能有所不同;使用System.Threading.ThreadPool或最近引入的任务并行库可以使这些事情变得更容易,尽管在效率或控制方面总是需要权衡(与所有事物一样)。

进入更多细节需要查看您的实际代码。您可以更好地找到具有编写可靠,高性能多线程代码经验的人(如果可能,有最近.NET 经验的人这样做,因为这将有助于确定哪些库是合适的)。