我最近写了一个程序,需要使用线程进行矩阵乘法运算,每个乘法都有一个线程。
现在我在想,对于3x2和2x3的矩阵相乘,使用线程是否真的有优势?对于小规模问题而言,串行代码仍然高效吗?如果我错了,那么针对这么小的问题,有没有任何优缺点?我认为这会使问题变得更加复杂,但这是不是正确的呢?
另一方面,如果有一个10000x10000的矩阵,使用线程是否有好处?我认为有,因为局部性变成了主导因素。但我还在思考多线程何时更有效。
谢谢!
我最近写了一个程序,需要使用线程进行矩阵乘法运算,每个乘法都有一个线程。
现在我在想,对于3x2和2x3的矩阵相乘,使用线程是否真的有优势?对于小规模问题而言,串行代码仍然高效吗?如果我错了,那么针对这么小的问题,有没有任何优缺点?我认为这会使问题变得更加复杂,但这是不是正确的呢?
另一方面,如果有一个10000x10000的矩阵,使用线程是否有好处?我认为有,因为局部性变成了主导因素。但我还在思考多线程何时更有效。
谢谢!
通常情况下,你不要让多个线程更新相同缓存行的值,那样会降低性能。你还想在线程内利用SIMD单元。这两者通常是通过在块中处理数据来实现的(查找寄存器块/缓存块术语)。此外,理想情况下,你希望创建与硬件并发度相同数量的线程(以避免昂贵的上下文切换)。对于数据并行(如矩阵乘法),这更容易。对于任务并行,通常使用线程池。
对于像3x2这样的小矩阵,多线程肯定比顺序处理慢得多。对于更大的矩阵,您需要进行测量以找出多线程更快的阈值。该阈值取决于太多参数,无法提供通用答案。