【问题标题】:Parallel processing vs Serial processing并行处理与串行处理
【发布时间】:2017-01-27 13:47:41
【问题描述】:

我有一个通用矩阵的实现,我创建了一个选项 在并行处理和串行处理中使用“*”和“+”运算符。

并行计算示例: 考虑我们有 m1 和 m2 矩阵和 m3 = m1 * m2。 我们用不同的线程计算 m3 行 i'。 加:

串行计算只计算m3[0,0]、m3[0,1]..等

比我使用大小矩阵测量每个操作的时间 我注意到,在小矩阵上,串行处理比并行处理更快,但另一方面,并​​行处理在大矩阵上的性能更好。

The results:
+----------------------------+--------------------------------+------------+
|             Big            |              Small             |            |
+----------------------------+--------------------------------+------------+
|      *      |       +      |       *       |        +       |            |
+-------------+--------------+---------------+----------------+------------+
| 0.697798sec | 0.0407585sec | 8.7408e-05sec | 0.000109052sec | Parallel   |
+-------------+--------------+---------------+----------------+------------+
| 11.9984sec  | 0.0235058sec | 6.68e-07sec   | 7.76e-07sec    |  Serial    |
+-------------+--------------+---------------+----------------+------------+

谁能解释一下原因?

非常感谢!

【问题讨论】:

  • CPU 缓存针对线性内存访问进行了优化。获取一些可以向您展示 L1、L2 和 L3 缓存性能的工具。
  • 启动线程需要时间。
  • Big 和 Small 也是无意义的术语,我们取 10 和 100 吗?对于每种尺寸,有多少线程,您是使用线程池还是为每个工作包启动一个新线程?
  • 我们说的是大小为 2*2 的小矩阵和大尺寸:1000*1000
  • 我为每个工作包启动新线程

标签: c++ matrix parallel-processing operators serial-processing


【解决方案1】:

在一个小的矩阵中,例如,一个大小为 10*10 的矩阵,串行处理是有利的,因为程序不需要被分解成更小的部分,然后传送到串行或单处理器上进行进一步处理. 当通过并行处理对相同的 10*10 矩阵进行操作时,它将被分解成更小的部分,然后将其馈送到每个单独的处理器(请记住,所有这些都会破坏矩阵并将其处理给每个处理器)并行处理器需要时间),因此并行处理的性能在小矩阵上会降低。

如果将一个大矩阵,例如大小为 100*100 的矩阵移交给串行处理器,处理器无法处理这个单个程序,但必须处理所有中断,所有其他过多的进程因此在这种情况下等待时间会增加。但是,当将相同的 100*1000 矩阵移交给并行处理时,它会被分解成相当小的块,并且可能由多个处理器进行操作。例如,如果 CPU 包含两个内核/处理器,它可以将一个专用于该矩阵,另一个专用于所有其他中断处理和其他程序,因此等待时间将随着时间的推移而显着减少

【讨论】:

    【解决方案2】:

    多线程或多任务的性能有很多因素。

    开销
    无论您是否拥有操作系统,并行编程都会产生开销。最低限度,必须设置另一个处理器(核心)来执行线程核心。这需要执行时间。

    另一项是同步等待时间。在某些时候,主处理器需要等待其他处理器完成。

    还有与信令或通信相关的开销。辅助处理器必须花费执行时间来通知主处理器计算已完成,并且它们必须将结果存储在某处。

    如果您的线程中的开销比线程的执行时间花费的时间更多(例如简单的单次乘法),您可能不会注意到并行工作节省了任何时间。

    工作量
    线程执行的工作量应该很大。 10x10 矩阵可能没有足够的工作来克服间接费用。在创建线程时,他们应该执行更多的工作来证明他们的创建和监控的开销是合理的。

    代表团
    如果有操作系统,则操作系统负责线程将如何执行。即使系统中有多个处理器,它们也可以在一个处理器上循环执行。 (操作系统可以为每个处理器委派一个任务或应用程序)。当操作系统在单核上共享您的线程时,性能不会有太大提升。您可能想研究操作系统,看看是否可以强制将线程代码委托给其他内核。

    内存冲突
    大多数多处理器平台共享内存。硬件在处理器和内存之间可能只有一条数据总线。因此,当另一个处理器访问内存时,一个处理器将不得不等待(因为一次只有一个处理器可以使用数据总线)。这会降低程序的效率,从而使您的性能结果可以忽略不计。

    数据缓存和指令管道
    如果您的程序没有针对数据缓存进行优化,那么创建多个线程不会产生显着的性能提升。处理器可能会因为不得不从内存中重新加载它的缓存而浪费时间(尤其是在等待 opter 处理器完成使用数据总线时)。通过围绕数据缓存结构设计数据和数据处理,您可以在单个执行线程中显示更多改进。

    处理器也可能有缓存或指令流水线。程序执行中的传输对处理器来说很烦人。它必须浪费时间评估代码是在缓存中还是去获取代码。减少执行传输的数量将加快您的程序,通常比创建线程更快。

    由于各种因素,您的结果可能并不显着,尤其是当您的平台正在运行其他应用程序时,您的平台正在运行。研究基准测试技术。您可能需要拥有大量数据或运行程序大量时间(或两者兼而有之)。通常重要的是基准区域周围的 1E09 次迭代(许多计算机可以在 1E-8 秒左右执行指令,因此您必须运行多次才能获得良好的平均值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2019-09-16
      • 2023-03-31
      相关资源
      最近更新 更多