1
我想比較非並行版本和並行版本函數的運行時間。問題在於,儘管並行函數適用於線程包,但在切換到多處理包後,這些進程永遠不會啓動。我想知道這是否是由我的編譯器或其他任何東西引起的。任何人都可以運行我的代碼,看看它是否在其他環境中工作?如果沒有,我的代碼中有什麼問題?多處理不起作用計算矩陣的叉積
import numpy as np
from multiprocessing import Process
def single_row(a,b,output):
for j in range(len(b[0])):
for k in range(len(a)):
output[j]=output[j]+a[k]*b[k][j]
#Parallel Matrix Cross Multiplication
def cross_parallel(a,b):
if len(a[0])==len(b):
tasks=[None]*len(a)
T=np.array([[0]*len(b[0])]*len(a))
for i in range(len(a)):
tasks[i]=Process(target=single_row,args=(a[i],b,T[i]))
for task in tasks:
task.start()
for task in tasks:
task.join()
return T
else:
print 'Error: Invalid Matrices'
#Non-parallel Matrix Cross Multiplication
def cross_basic(a,b):
if len(a[0])==len(b):
T=np.array([[0]*len(b[0])]*len(a))
for i in range(len(a)):
for j in range(len(b[0])):
for k in range(len(a[0])):
T[i][j]=T[i][j]+a[i][k]*b[k][j]
return T
else:
print 'Error: Invalid Matrices'
if __name__ == '__main__':
x=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
y=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
print cross_basic(x,y)
print cross_parallel(x,y)
結果:
[[ 90 100 110 120]
[202 228 254 280]
[314 356 398 440]
[426 484 542 600]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
使用線程包工程(只在第15行不同)版本:
import numpy as np
from threading import Thread
def single_row(a,b,output):
for j in range(len(b[0])):
for k in range(len(a)):
output[j]=output[j]+a[k]*b[k][j]
#Parallel Matrix Cross Multiplication
def cross_parallel(a,b):
if len(a[0])==len(b):
tasks=[None]*len(a)
T=np.array([[0]*len(b[0])]*len(a))
for i in range(len(a)):
tasks[i]=Thread(target=single_row,args=(a[i],b,T[i]))
for task in tasks:
task.start()
for task in tasks:
task.join()
return T
else:
print 'Error: Invalid Matrices'
#Non-parallel Matrix Cross Multiplication
def cross_basic(a,b):
if len(a[0])==len(b):
T=np.array([[0]*len(b[0])]*len(a))
for i in range(len(a)):
for j in range(len(b[0])):
for k in range(len(a[0])):
T[i][j]=T[i][j]+a[i][k]*b[k][j]
return T
else:
print 'Error: Invalid Matrices'
if __name__ == '__main__':
x=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
y=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
print cross_basic(x,y)
print cross_parallel(x,y)
結果:
[[ 90 100 110 120]
[202 228 254 280]
[314 356 398 440]
[426 484 542 600]]
[[ 90 100 110 120]
[202 228 254 280]
[314 356 398 440]
[426 484 542 600]]