2013-03-18 106 views
0

我想创建n个线程,并且每个线程计算结果矩阵的整个行。我曾尝试下面的代码,python中的矩阵乘法的多线程

import numpy 
import random 
import threading 

class MatrixMult(threading.Thread): 
    """A thread which computes the i,j entry of A * B""" 
    def __init__(self, A, B, i): 
     super(MatrixMult, self).__init__() 
     self.A = A 
     self.B = B 
     self.i = i 
     #self.j = j                
    def run(self): 
     print "Computing %i, %i" % (self.i, self.i) 
     x = 0 
     result=[] 
     for k in range(self.A.shape[0]) 
      x += self.A[self.i,k] * self.B[k,self.i 
     self.result=x 
     print "Completed %i, %i" % (self.i, self.j) 

def mult(n): 
    """A function to randomly create two n x n matrices and multiply them""" 
    # Create two random matrices             
    A = numpy.zeros((n,n)) 
    B = numpy.zeros((n,n)) 
    for i in range(n): 
     for j in range(n): 
      A[i,j] = random.randrange(0, 100) 
      B[i,j] = random.randrange(0, 100) 
    # Create and start the threads            
    threads = [] 
    for i in range(n): 
     # for j in range(n):              
     t = MatrixMult(A, B, i) 
      threads.append(t) 
      t.start() 
    for t in threads: t.join() 
    C = numpy.zeros((n,n)) 
    for t in threads: 
     C[t.i] = t.result 
    return C 
print multi(30) 

但它打印出许多怪异的矩阵:

[ 66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 
    66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 
    66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 66695. 
    66695. 66695. 66695.] 
[ 88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 
    88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 
    88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 88468. 
    88468. 88468. 88468.]] 

任何人看到我的代码有问题吗?我不明白我做错了什么。

+0

假定的输出是什么? – inf 2013-03-18 23:44:42

+1

你想在紧接着'def self(...)','x = 0'和't = MatrixMult(...)'之后的行中加入什么样的缩进? – 2013-03-18 23:45:13

+0

这就是现在的缩进。输出很难说,因为它使随机数字,应该多个,肯定它不会看起来像这样 – 2013-03-18 23:49:23

回答

2

你的代码设置

C[t.i] = t.result 

其设定的C一整行的值t.result,这是一个标量。我在那里看到一些关于j的评论内容;你大概要占这一点,也解决

x += self.A[self.i,k] * self.B[k,self.i 

使用j(并且也不是一个语法错误)。按照原样,您似乎在计算C[i, i],然后将该值分配给整行。

另外:你知道这个代码保证比np.dot慢很多,对吧?在Python中执行紧密循环之间,尽管有GIL,并且首先是an inefficient algorithm for matrix multiplication,但跨线程分配计算工作。如果您的目标实际上是使用多个内核来加速矩阵乘法,请将您的numpy链接到MKL,OpenBLAS或ACML,请使用np.dot,并将其称为一天。

+0

但我希望每个线程来计算每一行。当我分配C [ti,tj] = t.result,然后我得到一个错误,MatrixMult的对象没有属性'结果' – 2013-03-19 00:10:34

+0

那么,你将需要计算一整行......目前,只重新计算一个元素。不知道缺少“结果”错误。 – Dougal 2013-03-19 04:05:35

+0

但你怎么能通过整行?这是我制作线程的方式吗? – 2013-03-19 05:43:59