2017-12-15 7 views
3

PyCUDAを使用していくつかの行列演算を並列化しようとしています。行列に10行以上の行があると、np.dotは(少なくとも)10倍長くなりません。

しかし、私は本当に理解していない結果があります。行列積A * Bの行列Aの行数に10を乗じると、計算時間はほとんどの場合10倍になりません。

は、このコードを取る:私はそれを実行すると

import time 
import numpy as np 

nb_traces=pow(10,1) # Nb lines 
nb_samples=100 # Nb columns 

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32) 
b_cpu=np.ones((nb_samples,2)).astype(np.float32) 

t1PythonBegin=time.clock() 
c_cpu=np.dot(a_cpu,b_cpu) 
t1PythonEnd=time.clock() 

print(t1PythonEnd-t1PythonBegin) 
print(c_cpu.shape) 
print(" ") 
nb_traces=pow(10,2) # Nb lines of A : 10 times bigger than before 
nb_samples=100 # Nb colonnes 

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32) 
b_cpu=np.ones((nb_samples,2)).astype(np.float32) 

t1PythonBegin=time.clock() 
c_cpu=np.dot(a_cpu,b_cpu) 
t1PythonEnd=time.clock() 

print(t1PythonEnd-t1PythonBegin) 
print(c_cpu.shape) 

は、私は2つの計算のための同じ大きさのオーダーを持っています。ここ

私は、例えばあっ出力である:

は、最初の行は、私は10^2行を持っている場合、私は10^1 Aの行と第二を持って計算時間がある(私はまた、形状を表示しました時間計算の下でAの)。

SIMU 1:

3.120985184068559e-05 
(10, 2) 

9.086412319447845e-06 
(100, 2) 

SIMU 2:

3.358022058819188e-05 
(10, 2) 

3.0024667466932442e-05 
(100, 2) 

SIMU 3:

1.6987641174637247e-05 
(10, 2) 

1.7777763787307777e-05 
(100, 2) 

時々、計算時間がさらに速く10倍以上の行のためにあります!

これはどのように説明しますか?私は実際には理解していません...実際には、行列Aに10倍以上の線があれば、計算する係数は10倍です。したがって、プログラムは並列化されていないため、10倍長くなります。

+2

実際の計算にはオーバーヘッドよりも時間がかかります。私の場合、計算時間は、約10^3行の行数でしかスケーリングしません。 – Swier

答えて

4

これには複数の理由があります。まず、Swierが指摘しているように、関数へのオーバーヘッド(実際に関数を呼び出す前にPythonが行うこと)は、関数自体よりも時間がかかります。

しかし、大量の入力に対しては、NumpyはBLASという名前のものを使用して行列操作を行います。 BLASがそのように設定されている場合(特にあなたのために自動的にこれを行うAnacondaを使用している場合)、あなた自身のコードを並列化します。

関連する問題