了解并行化

时间:2015-09-26 03:49:47

标签: 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 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

2 个答案:

答案 0 :(得分:0)

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

  1. 产生线程的时间
  2. 沟通开销
  3. 内存带宽和核心竞争访问内存以进行读/写
  4. 你有多少个存储库
  5. 如何编写代码以实现最大缓存命中
  6. 你是否试图隐藏内存延迟?
  7. MIC和GPU是高效的协处理器,如果您愿意,可以考虑使用。

答案 1 :(得分:0)

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

许多现实世界的任务并非如此 - 它们需要与系统的其他元素进行相互通信。消息传递需要两个并行进程进行同步,这意味着在此期间浪费了时间。有很多方法可以做到这一点,但从根本上说 - 任何时候这种沟通都需要发生,你“浪费”效率和扩展。

Ahmdahl's law涵盖了这一点 - 原则是你永远不会通过增加并发性来获得并行性能的线性扩展,但是你可以越多地分离你的任务,你得到的越多。

也许违反直觉 - 你可以通过'浪费时间'重复计算来获得更多性能,因为Inter Process Communications(IPC)的相对费用和开销超过了重复工作所花费的时间。

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