多线程概念问题

3

我最近写了一个程序,需要使用线程进行矩阵乘法运算,每个乘法都有一个线程。

现在我在想,对于3x2和2x3的矩阵相乘,使用线程是否真的有优势?对于小规模问题而言,串行代码仍然高效吗?如果我错了,那么针对这么小的问题,有没有任何优缺点?我认为这会使问题变得更加复杂,但这是不是正确的呢?

另一方面,如果有一个10000x10000的矩阵,使用线程是否有好处?我认为有,因为局部性变成了主导因素。但我还在思考多线程何时更有效。

谢谢!


1
试着问自己一个不同的问题:你会使用线程来将两个整数相加吗?那么三个或四个整数呢? - Tas
@Tas 对于两个整数来说不是这样,但在矩阵中情况不同,不是吗?为不同的线程创建许多线程可以提高效率,但我印象中针对大块数据使用线程可能也会低效...虽然我可能错了。 - Nano
1
很多线程是一个模糊的术语。使用太多线程会导致效率降低,因为需要频繁切换任务。如果您有大量计算是算法的一部分,并且可以轻松地将其分解 - 就像计算不依赖于先前步骤的结果一样 - 您可以将作业分成合理数量的线程,并获得几乎成比例的性能提升。一些时间将被用于线程管理,一些组装工作在最后也无法进行线程处理。有时,线程之间争夺共享资源会使线程处理变得毫无意义。 - user4581301
1
矩阵3x2相乘所需的时间比创建和加入线程的时间少。 - Pubby
谢谢大家提供的所有有用答案!看起来,在进行小型nxn矩阵乘法时使用线程并不是很有帮助,但是一旦维度太大,线程的帮助似乎也不是太大。 - Nano
显示剩余3条评论
1个回答

1

通常情况下,你不要让多个线程更新相同缓存行的值,那样会降低性能。你还想在线程内利用SIMD单元。这两者通常是通过在块中处理数据来实现的(查找寄存器块/缓存块术语)。此外,理想情况下,你希望创建与硬件并发度相同数量的线程(以避免昂贵的上下文切换)。对于数据并行(如矩阵乘法),这更容易。对于任务并行,通常使用线程池。


对于像3x2这样的小矩阵,多线程肯定比顺序处理慢得多。对于更大的矩阵,您需要进行测量以找出多线程更快的阈值。该阈值取决于太多参数,无法提供通用答案。


此外,我不明白你所说的“每个乘法都有一个线程”的意思。
你想为两个标量的每个乘积创建单独的线程吗?对于大矩阵,这将创建无数个线程,导致速度非常慢。

感谢您提供的信息丰富的答案。是的,这就是我的意思...所以如果我要将一个2x3矩阵和一个3x2矩阵相乘以创建一个3x3矩阵,我需要10个线程。 - Nano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接