Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为多处理器机器编译C#?(使用VS 2010或csc.exe)_C#_Visual Studio 2010_Multicore_Compilation - Fatal编程技术网

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

如何为多处理器机器编译C#?(使用VS 2010或csc.exe),c#,visual-studio-2010,multicore,compilation,C#,Visual Studio 2010,Multicore,Compilation,你好 我在上搜索了编译器(csc.exe)选项,在这里找到了答案,在Stackoverflow,关于。但我的问题是为多处理器编译,如下所示 我毕业的大学有一个11台机器的集群(有6台四核和5台四核双处理机器)。它在linux下运行,但我可以在那里安装MONO。我不想用多处理器或内核编译,而是想为多处理器机器编译。因此: 是否有任何关于如何执行的具体细节,或者该系统上的CLR应该处理执行以将其分布到各个核心 如果有办法做到这一点,我如何使用VS2010或csc.exe命令行编译器来做到这一点

你好

我在上搜索了编译器(csc.exe)选项,在这里找到了答案,在Stackoverflow,关于。但我的问题是为多处理器编译,如下所示

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

  • 是否有任何关于如何执行的具体细节,或者该系统上的CLR应该处理执行以将其分布到各个核心
  • 如果有办法做到这一点,我如何使用VS2010或csc.exe命令行编译器来做到这一点

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

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

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

通过使用
线程
线程池
类,或者通过使用并行LINQ或TPL,可以在C#中显式使用多个内核。

没有涉及特殊的编译器。

考虑到多核,您不需要以任何不同的方式编译。不过,要使用多个线程,您需要以不同的方式编写代码。如果您可以在您的环境中使用.NET4中的类(Mono的最新版本应该支持这一点),那么您可以使用Task Parallel库,这样做会更简单


基本上,您不会免费获得并发性—您必须考虑哪些代码位可以合理地并行运行。您可能需要读取的输出。(这本书是一个很好的起点。)

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

由于它是一个集群,您必须依赖某种形式的消息传递并行性,没有编译器会自动转换您的代码。至少,一个好的旧MPI是受支持的:

您的问题的答案以两个看似矛盾的陈述的形式出现:

1:已经有了

2:你不能

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

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

冒着使用过于简单化比喻的风险,请这样想:您的代码,就目前的情况而言,只是一个非常长的完成特定任务所需执行的步骤列表。您现在已经将此指令列表带入了一个满是人的房间(每个人都代表一个处理核心),并且你希望尽可能有效地使用这些人。虽然一屋子博士生可能具备背景知识和主题知识,可以了解如何将你的指导分解为针对每个人的任务,但你已经将你的清单带到了一屋子人,他们都擅长于遵循指导,但完全是在这种情况下,你需要为每个人带来一套不同的指令,当所有指令都被执行时,你会得到相同的结果

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


深入到比这更详细的内容需要查看您的实际代码。您最好找一位有编写可靠、高性能多线程代码经验的人(如果可能的话,找一位最近有.NET经验的人来做这件事,因为这将有助于确定哪些库是合适的)Btw.,如果你考虑使用任何其他的.NET,你会发现更多的选择做分布式计算。我想知道……但是直到现在,C是最容易使用的(编译)语言(我的观点)。我将它与C,C++,FORTRAN(77, 90, 95)进行比较。java,Pascal和对象Pascal。它的简单性令人吃惊。我真的想花一些时间来C++,但是我的时间跑来完成我的硕士学位不允许我这么做……当你做一些物理的时候,你可能更感兴趣的是相关库的可用性,而不是编程语言本身。Fortran的数字库,而.NET的数字库并不多,还有一些特殊的计算语言,如Matlab(或Octave)、R和Mathematica