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倍長くなります。
実際の計算にはオーバーヘッドよりも時間がかかります。私の場合、計算時間は、約10^3行の行数でしかスケーリングしません。 – Swier