为每个操作创建一个线程或为各种操作创建一些线程?

时间:2012-03-16 03:36:24

标签: python multithreading matrix distributed

对于一个类项目,我在Python中编写一个简单的矩阵乘法器。我的教授要求它有线程。我现在处理这个问题的方法是为每一行创建一个线程并将结果抛出另一个矩阵。

我想知道,如果更快的是,不是为每一行创建一个线程,而是创建一些线程,每个线程处理各行。

例如:给定Matrix1 100x100 * Matrix2 100x100(矩阵大小可能有很大差异):

  • 4个线程,每个处理25行
  • 10个线程,每个处理10行

也许这是一个微调的问题,或者线程创建过程开销仍然比上面的分发机制更快。

2 个答案:

答案 0 :(得分:2)

如果为运行应用程序的计算机可用的每个CPU核心使用一个线程,则可能会获得最佳性能。通过运行比处理器更多的线程,您不会获得任何性能优势。

如果您计划在每次执行矩阵乘法时生成新线程,那么您的多线程应用程序几乎没有希望超越单线程版本,除非您将真正巨大的矩阵相乘。相对于乘法矩阵所需的时间,线程创建所涉及的开销太高。但是,如果在进程启动时生成所有工作线程一次,然后一遍又一遍地重复使用它们来执行许多矩阵乘法,则可以获得显着的性能提升。

对于要增加的每对矩阵,您需要将被乘数和乘数矩阵加载到内存中一次,然后允许所有工作线程同时访问内存。这应该是安全的,因为这些矩阵在乘法过程中不会改变。

您还应该能够允许所有工作线程同时将其输出写入相同的输出矩阵,因为(由于矩阵乘法的性质)每个线程最终将其输出写入矩阵的不同元素不会有任何争论。

我认为你应该通过维护一个由所有线程共享的整数NextRowToProcess来在线程之间分配行。每当一个线程准备好处理另一行时,它就会调用InterlockedIncrement(或者你平台上可用的任何原子增量操作)来安全地获取要处理的下一行。

答案 1 :(得分:2)

在任何情况下,在多线程模式下,Python中的CPU绑定任务都会更快。由于Global Interpreter Lock,一次只能执行一个线程(除非你编写一些C扩展并明确释放锁)。

这适用于标准的CPython实现以及PyPy。在Jython中,尝试每个核心使用一个线程,更多没有意义。

请在David Beazley之前查看精彩的GIL概述。

另一方面,如果您的教授不介意,您可以使用multiprocessing