1

PyCudaの例からSimpleSpeedTest.pyを実行して、次の出力を生成しました。

Using nbr_values == 8192
Calculating 100000 iterations
SourceModule time and first three results:
0.058294s, [ 0.005477  0.005477  0.005477]
Elementwise time and first three results:
0.102527s, [ 0.005477  0.005477  0.005477]
Elementwise Python looping time and first three results:
2.398071s, [ 0.005477  0.005477  0.005477]
GPUArray time and first three results:
8.207257s, [ 0.005477  0.005477  0.005477]
CPU time measured using :
0.000002s, [ 0.005477  0.005477  0.005477]

最初の4回の測定は妥当ですが、最後の1回(0.000002s)はかなり離れています。CPUの結果は最も遅いものになるはずですが、最も速いGPU方式よりも桁違いに高速です。したがって、明らかに測定された時間は間違っているに違いありません。同じタイミング方法が最初の4つの結果でうまく機能するように見えるので、これは奇妙です。

そこで、SimpleSpeedTest.pyからいくつかのコードを取得し、小さなテストファイル[2]を作成しました。これにより、次のようになります。

time measured using option 1:
0.000002s 
time measured using option 2:
5.989620s 

オプション1pycuda.driver.Event.record()は(SimpleSpeedTest.pyのように)を使用して期間を測定し、オプション2はを使用しtime.clock()ます。この場合も、オプション1はオフですが、オプション2では妥当な結果が得られます(テストファイルの実行にかかる時間は約6秒です)。

なぜこれが起こっているのかについて誰かが考えを持っていますか?

SimpleSpeedTest.pyではオプション1の使用が承認されているので、問題の原因は私のセットアップでしょうか?GTX 470、ディスプレイドライバー301.42、CUDA 4.2、Python 2.7 64、PyCuda 2012.1、X5650Xeonを実行しています

[2]テストファイル:

import numpy
import time
import pycuda.driver as drv
import pycuda.autoinit

n_iter = 100000
nbr_values = 8192 # = 64 * 128 (values as used in SimpleSpeedTest.py)

start = drv.Event() # option 1 uses pycuda.driver.Event
end = drv.Event()

a = numpy.ones(nbr_values).astype(numpy.float32) # test data

start.record() # start option 1 (inserting recording points into GPU stream)
tic = time.clock() # start option 2 (using CPU time)

for i in range(n_iter):
    a = numpy.sin(a) # do some work

end.record() # end option 1
toc = time.clock() # end option 2

end.synchronize() 

events_secs = start.time_till(end)*1e-3
time_secs = toc - tic 

print "time measured using option 1:"
print "%fs " % events_secs
print "time measured using option 2:"
print "%fs " % time_secs
4

1 に答える 1

-1

アンドレアス・クレックナーに連絡したところ、彼はスタートイベントでも同期することを提案しました。

...
start.record()
start.synchronize()
...

そして、これは問題を解決するようです!

time measured using option 1:
5.944461s
time measured using option 2:
5.944314s 

どうやらCUDAの振る舞いは過去2年間で変わったようです。SimpleSpeedTest.pyを更新しました。

于 2012-09-18T11:53:56.817 に答える