问候!
我在MSDN搜索了编译器(csc.exe)选项,我在Stackoverflow找到了一个关于compiling with multiple processors的答案。但我的问题是如何编译 for 多个处理器,如下所示。
我毕业的大学有11个机器群(有6个四核和5个四核双处理机)。它在linux下运行,但我可以在那里安装MONO。而不是编译与多个处理器或核心,我想编译为多个处理器机器。所以:
提前致谢,如果这个问题毫无意义,我很抱歉。我真的不知道如何处理多个核心,因为我只是一个物理学家,而不是计算机科学家!:)
答案 0 :(得分:11)
您无需进行任何不同的编译即可考虑多个内核。您需要以不同的方式编写代码,以使用多个线程。如果您可以在您的环境中使用.NET 4中的类(Mono的最新版本应该支持此类),您可以使用任务并行库,这使得这更容易。
基本上你没有免费得到并发 - 你必须思考你的代码哪些位可以并行运行。您可能想要阅读Patterns and Practices group for parallel programming的输出。 (这本书是一个非常好的起点。)
答案 1 :(得分:7)
你的假设是正确的;你的问题毫无意义。
不可能神奇地并行化任意代码;您需要修改代码以使用多个线程。
您可以使用Thread
或ThreadPool
类或使用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 经验的人这样做,因为这将有助于确定哪些库是合适的)。