Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如何优化双处理器、四处理器和更高级别的多处理器?_C#_.net_Parallel Processing_Cpu - Fatal编程技术网

C# 如何优化双处理器、四处理器和更高级别的多处理器?

C# 如何优化双处理器、四处理器和更高级别的多处理器?,c#,.net,parallel-processing,cpu,C#,.net,Parallel Processing,Cpu,伙计们,我已经编写了20多年的高速软件,我几乎知道了书中的每一个技巧,从微工作台制作协作、评测、用户模式多任务处理、尾部递归,你可以把它命名为Linux、Windows等高性能的东西 问题是,当CPU密集型工作的多个线程暴露在多核处理器中时,我发现自己被所发生的事情弄糊涂了 在微基准测试中,线程之间(不同内核上)共享数据的各种方式的性能结果似乎不符合逻辑 很明显,内核之间存在一些“隐藏的交互”,这在我自己的编程代码中并不明显。我听说过一级缓存和其他问题,但这些对我来说是不透明的 问题是:我在哪里

伙计们,我已经编写了20多年的高速软件,我几乎知道了书中的每一个技巧,从微工作台制作协作、评测、用户模式多任务处理、尾部递归,你可以把它命名为Linux、Windows等高性能的东西

问题是,当CPU密集型工作的多个线程暴露在多核处理器中时,我发现自己被所发生的事情弄糊涂了

在微基准测试中,线程之间(不同内核上)共享数据的各种方式的性能结果似乎不符合逻辑

很明显,内核之间存在一些“隐藏的交互”,这在我自己的编程代码中并不明显。我听说过一级缓存和其他问题,但这些对我来说是不透明的

问题是:我在哪里可以学到这些东西?我正在寻找一本关于多核处理器如何工作、如何编程以利用其内存缓存或其他硬件架构而不是受到惩罚的深入书籍

有什么建议或伟大的网站或书籍吗?在谷歌上搜索了很多次之后,我的搜索结果是空的

真诚地,
韦恩

这本书教会了我很多关于为什么原始CPU能力不是唯一需要注意的东西的问题。几年前我在研究生院就用过,但我认为所有的原则仍然适用:

从本质上讲,多进程配置中的一个主要问题是同步对主内存的访问,如果做得不好,可能会成为性能的真正瓶颈。缓存必须保持同步,这相当复杂。

  • 我对“”的回答
  • 赫伯萨特氏
  • 电视系列

    • 我自己的问题和答案,在stackoverflow的姐妹网站上:

      我将复制答案以避免点击:

      引用鲍里斯的话:

      使用Microsoft.NET进行并行编程:的设计模式 多核体系结构的分解与协调

      这是一本书,我衷心推荐

      它是:

      去年出版了一本新书。意味着你没有读到一些过时的东西 实践

      短-约200多页,信息密集。这些 每天有太多的时间去阅读,而只有太少的时间去阅读1000多页 书

      易于阅读-不仅写得很好,而且 以非常简单易读的方式介绍难以掌握的概念

      用于教学-每章都有练习。我知道是的 这样做总是有益的,但很少。这本书很有趣 令人信服和有趣的任务。令人惊讶的是,我做了大部分,而且 我喜欢这样做

      此外,如果您希望了解更多的底层细节,这是我找到的最好的资源:“它是使用java作为代码示例编写的,这与我的C#背景非常吻合


      PS:我有大约5年的“硬核”并行编程经验(教唆使用C#),所以当我说“岩石”时,希望你能相信我,在并行化代码中导致意外的糟糕结果的一个具体原因是,如果你不知道下面发生了什么,你就不会看到(我没有)。这里有两篇文章讨论.Net的原因和补救措施:


      Rgds GJ

      我找到了这个链接,专门解释了 CPU上的多核缓存处理影响了我的 多线程程序

      网站multicoreinfo.com总的来说有很多好处
      关于多核编程的信息和参考。

      多线程有不同的方面,需要不同的方法

      例如,在Web服务器上,线程池的使用被广泛使用,因为它被认为“有利于”性能。这样的池可能包含数百个等待投入工作的线程。使用这么多线程将导致调度程序超时工作,这对性能有害,但在Linux系统上无法避免。对于Windows,选择的方法是IOCP机制,它推荐的线程数不大于安装的内核数。它使应用程序成为(I/O完成)事件驱动的,这意味着轮询不会浪费任何周期。所涉及的几个线程将调度程序的工作减少到最低限度

      如果目标是实现可扩展的功能(更多的内核更高的性能),那么主要问题将是内存总线饱和。饱和将由于代码获取、数据读取和数据写入而发生。错误实现的代码在使用两个线程时比使用一个线程时运行得慢。解决此问题的唯一方法是通过以下方式减少内存总线工作:

      • 将代码裁剪为最小的内存占用(=适合代码缓存),并且不会调用其他函数或到处跳转
      • 将内存读写调整为最小大小
      • 将即将到来的RAM读取通知预取机制
      • 调整工作,使内核自身缓存(L1和L2)内执行的工作与外部工作(L3和RAM)的比例尽可能大
      换言之:将适用的代码和数据块放入尽可能少的缓存线(每个缓存线@64字节),因为这最终将决定可伸缩性。如果高速缓存/内存系统能够每秒执行x条高速缓存线操作,那么如果代码的要求是每工作单元五条高速缓存线(=>x/5),而不是十一条(x/11)或五十二条(x/52),那么代码的运行速度会更快

      实现这一点并非易事,因为每次都需要或多或少独特的解决方案。有些编译器在指令排序方面做得很好,以利用主机处理器的流水线。这并不一定意味着它将是多核的良好订购

      可伸缩代码的有效实现不一定是一个漂亮的实现。最终,推荐的编码技术和样式可能会