2013-03-18 129 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