0

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

并行计算示例:假设我们有 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    |
+-------------+--------------+---------------+----------------+------------+

有人可以解释为什么吗?

非常感谢!

4

2 回答 2

0

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

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

于 2016-09-19T19:50:28.993 回答
0

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

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

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

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

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

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

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

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

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

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

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

于 2016-09-19T20:09:19.130 回答