我将系统并行并对其进行了一些测试,但我无法理解发生了什么。每列是矩阵计算和计算它所花费的时间。为什么增加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
答案 0 :(得分:0)
每个问题都会达到一个阈值。以下是您需要考虑的事项:
MIC和GPU是高效的协处理器,如果您愿意,可以考虑使用。
答案 1 :(得分:0)
这取决于问题的类型。最简单的情况被称为一个令人尴尬的并行问题 - 你有N个解耦的任务,不需要相互通信。然后,当您添加到N个处理器时,这些任务将线性扩展。
许多现实世界的任务并非如此 - 它们需要与系统的其他元素进行相互通信。消息传递需要两个并行进程进行同步,这意味着在此期间浪费了时间。有很多方法可以做到这一点,但从根本上说 - 任何时候这种沟通都需要发生,你“浪费”效率和扩展。
Ahmdahl's law涵盖了这一点 - 原则是你永远不会通过增加并发性来获得并行性能的线性扩展,但是你可以越多地分离你的任务,你得到的越多。
也许违反直觉 - 你可以通过'浪费时间'重复计算来获得更多性能,因为Inter Process Communications(IPC)的相对费用和开销超过了重复工作所花费的时间。
所以它的长短是 - 这取决于你的算法。最小化IPC,您将获得更好的可扩展性。