【发布时间】: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