Multithreading 理解并行化

Multithreading 理解并行化,multithreading,performance,parallel-processing,Multithreading,Performance,Parallel Processing,我制作了一个并行系统,并对其进行了一些测试,但我不明白发生了什么。每列都是一个矩阵计算以及计算所需的时间。为什么增加CPU的线程数会达到一个阈值 当我有4个CPU和4、8、16个线程时,为什么系统没有进一步加速?是不是因为每个CPU的读/写成本太高,导致效率下降 **2 CPUs** 1 Thread 0.72 s 10.31 s 34.77 s 42.07 s 120.93 s 2 Threads 0.48 s 7.88 s 22.63 s 28.40 s 82.81 s 4

我制作了一个并行系统,并对其进行了一些测试,但我不明白发生了什么。每列都是一个矩阵计算以及计算所需的时间。为什么增加CPU的线程数会达到一个阈值

当我有4个CPU和4、8、16个线程时,为什么系统没有进一步加速?是不是因为每个CPU的读/写成本太高,导致效率下降

**2 CPUs**

1 Thread    0.72 s  10.31 s 34.77 s 42.07 s 120.93 s
2 Threads   0.48 s  7.88 s  22.63 s 28.40 s 82.81 s
4 Threads   0.50 s  7.12 s  24.22 s 28.68 s 80.78 s
8 Threads   0.49 s  6.92 s  24.14 s 28.80 s 80.88 s
16 Threads  0.57 s  6.89 s  24.23 s 29.68 s 81.35 s

**4 CPUs**

1 Thread    0.71 s  10.30 s 34.95 s 43.07 s 120.93 s
2 Threads   0.48 s  7.06 s  22.78 s 28.33 s 82.81 s
4 Threads   0.49 s  5.47 s  20.37 s 21.82 s 67.45 s
8 Threads   0.40 s  5.16 s  17.83 s 21.84 s 61.71 s
16 Threads  0.46 s  5.20 s  17.75 s 22.19 s 65.37 s

每一个问题都会达到一个临界点。以下是您需要考虑的事项:

  • 产生线程的时间到了
  • 通信开销
  • 内存带宽和内核竞争访问内存进行读/写
  • 你有多少个内存库
  • 如何编写代码以实现最大缓存命中率
  • 您是否试图隐藏内存延迟

  • MIC和GPU是高效的协处理器,如果您愿意,可以考虑。

    < P>每一个问题都会达到一个阈值。以下是您需要考虑的事项:

  • 产生线程的时间到了
  • 通信开销
  • 内存带宽和内核竞争访问内存进行读/写
  • 你有多少个内存库
  • 如何编写代码以实现最大缓存命中率
  • 您是否试图隐藏内存延迟

  • MIC和GPU是高效的协处理器,如果你喜欢的话,可以考虑。

    < P>这取决于问题的类型。最简单的情况是一个令人尴尬的并行问题——您有N个不需要相互通信的解耦任务。然后,当您添加到N个处理器时,这些任务将线性扩展

    然而,现实世界中的许多任务并非如此——它们需要与系统的其他元素进行交互。消息传递需要两个并行进程同步,这意味着在此期间会浪费时间。有各种各样的方法可以做到这一点,但从根本上说,任何时候这种交流都会“浪费”效率和规模

    涵盖了这一点——原则是,通过增加并发性,您永远不会获得并行性能的线性扩展,但您可以将任务解耦得越多,效果就越好

    也许与直觉相反,您实际上可以通过“浪费时间”重复计算来获得更高的性能,因为进程间通信(IPC)的相对费用和开销大于复制工作所花费的时间


    所以它的长短取决于你的算法。最小化IPC,您将获得更好的可扩展性

    这取决于问题的类型。最简单的情况是一个令人尴尬的并行问题——您有N个不需要相互通信的解耦任务。然后,当您添加到N个处理器时,这些任务将线性扩展

    然而,现实世界中的许多任务并非如此——它们需要与系统的其他元素进行交互。消息传递需要两个并行进程同步,这意味着在此期间会浪费时间。有各种各样的方法可以做到这一点,但从根本上说,任何时候这种交流都会“浪费”效率和规模

    涵盖了这一点——原则是,通过增加并发性,您永远不会获得并行性能的线性扩展,但您可以将任务解耦得越多,效果就越好

    也许与直觉相反,您实际上可以通过“浪费时间”重复计算来获得更高的性能,因为进程间通信(IPC)的相对费用和开销大于复制工作所花费的时间


    所以它的长短取决于你的算法。最小化IPC,您将获得更好的可扩展性

    我们可以看看你的实际代码吗?我们可以看看你的实际代码吗?