2016-03-25 12 views
2

を使用して存在しない。ないスピードアップは、私は、次のコードを使用して、マルチGPUの性能をテストしようマルチGPUを

test__multi.py 

import time 
import numpy as np 
from numpy.random import random 
import theano 
import theano.tensor as T 
from theano import shared 
from theano import function 

a = time.time() 

v_00 = shared(
     value=random((10240, 10240)).astype(theano.config.floatX, copy=False) 
     ,target='dev0' 
) 
v_01 = shared(
     value=random((10240, 10240)).astype(theano.config.floatX, copy=False) 
     ,target='dev0' 
) 
v_10 = shared(
     value=random((10240, 10240)).astype(theano.config.floatX, copy=False) 
     ,target='dev1' 
) 
v_11 = shared(
     value=random((10240, 10240)).astype(theano.config.floatX, copy=False) 
     ,target='dev1' 
) 
b = time.time() 
print b - a 

f = function(inputs=[], outputs=[ 
     theano.tensor.dot(v_00, v_01), 
     theano.tensor.dot(v_10, v_11) 
     ] 
) 
c = time.time() 
print c - b 

res0, res1 = f() 
d = time.time() 
print d - c 

添付画像が示したように、私は結果を得たときI、何improvmentは存在しません

[email protected]:~$ cd python 
[email protected]:~/python$ THEANO_FLAGS='contexts=dev0->cuda0;dev1->cuda0' python test__multi.py 
Mapped name dev0 to device cuda0: Tesla K80 (CuDNN not available) 
Mapped name dev1 to device cuda0: Tesla K80 (CuDNN not available) 
6.47632694244 
0.34957909584 
2.27110910416 
[email protected]:~/python$ THEANO_FLAGS='contexts=dev0->cuda0;dev1->cuda1' python test__multi.py 
Mapped name dev0 to device cuda0: Tesla K80 (CuDNN not available) 
Mapped name dev1 to device cuda1: Tesla K80 (CuDNN not available) 
6.49380016327 
0.36678981781 
2.40865397453 

答えて

0

いくつかの変更が改善を明らかにする:

を次のように端末内のログは、二つの異なるGPUデバイスを使用(THEANO_FLAGSの= 'dev1-> cuda1コンテキスト= dev0-> cuda0')。 :

  1. たとえば、次のようにGPUに留まるように関数出力を伝えます。 theano.tensor.dot(v_00, v_01).transfer('dev0')
  2. タイミングを合わせる前に関数を呼び出す(コンパイルする)と、タイミングをとって何回もループを繰り返すことで、サイズを10,240から1,024に戻します。
  3. 最終回答のみをGPUから取り出します。 np.asarray(res0)、またはループ完了後のprint(res_0)でも可能です。これにより、すべての計算が実際に行われます。

スピードアップを守るために避けなければならないことは、計算が実行されるたびに出力をCPUに転送することです。ループの開始からnp.assarrayコールの終了までに経過した時間は、計算して最後の応答を転送する合計時間になります。ループ中に経過した時間は、GPUでの操作をキューに入れるが、終了する時間ではありません。私はGPUの実行時間をどのように孤立させて時間をとるかについてはわかりません。それを推論する必要があります。

関連する問題