0

n 個のスレッドを作成し、各スレッドが結果行列の行全体を計算するようにしたいと考えています。私は次のコードを試しました、

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.]]

私のコードに問題がある人はいますか? 私が間違っていることはわかりません。

4

1 に答える 1

3

コード セット

C[t.i] = t.result

の行全体をCt.resultに設定します。これはスカラーです。そこにコメントjされたものがいくつかあります。おそらくそれを説明し、修正したいでしょう

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

使用する必要がありますj(また、構文エラーにもなりません)。そのままでは、計算C[i, i]してその値を行全体に割り当てているようです。

また、このコードは よりもはるかに遅いことが保証されていますnp.dotよね? Python でタイトなループを実行すること、 GILにもかかわらずスレッド間で計算作業を分散すること、そしてそもそも行列乗算の非効率なアルゴリズムであることの間で。複数のコアを使用して行列乗算を高速化することが実際の目標である場合は、numpy を MKL、OpenBLAS、または ACML にリンクし、 を使用して、1 日で終了np.dotします。

于 2013-03-18T23:53:58.667 に答える