3

Theano と Deep Learning を使い始めたばかりです。Theano チュートリアル ( http://deeplearning.net/software/theano/tutorial/using_gpu.html#returning-a-handle-to-device-allocated-data )の例を試していました。コード例を次に示します。

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

「vlen」を定義する表現を理解しようとしていますが、

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core

この例で指定されている GPU コアの数と、30 が選択された理由について言及しているテキストはどこにもありません。また、768 スレッドの値が使用された理由もわかりません。私の GPU (GeForce 840M) には 384 コアがあります。値 30 の代わりに 384 を代入すると、384 個のコアすべてを使用すると仮定できますか? また、768 スレッドの値は固定のままにする必要がありますか?

4

1 に答える 1

2

以下のようなロジックだと思います。参照ページを見ると、GTX 275 GPU についての言及があることがわかります。そのため、そのチュートリアルで使用されている GPU は、cc1.x 世代の非常に古い CUDA GPU である可能性があります (CUDA 7.0 および 7.5 ではサポートされなくなりました)。コメントでは、開発者は GPU SM (マルチプロセッサ) を指すために「コア」という言葉を使用しているようです。

そのファミリには、 GTX 275 (240 CUDA コア = 30SM * cc1.x の 8 コア/SM ) を含む、30 個の SM (cc1.x SM は cc 2+ SM とは非常に異なる動物でした) を備えた多数の GPU がありました。世代)。したがって、30 という数字は、その時点で使用されている GPU の SM の数から導き出されます。

さらに、そのような GPU をサポートする CUDA バージョンの古いドキュメントを確認すると、cc1.0 および cc1.1 GPU がマルチプロセッサ (SM) あたり最大 768 スレッドをサポートしていることがわかります。これが768という数字の由来だと思います。

最後に、優れた CUDA コードは GPU をオーバーサブスクライブします (スレッドの総数は、GPU が瞬時に処理できる数よりも多くなります)。したがって、係数 10 は「オーバーサブスクリプション」を確保するためのものだと思います。

特定の数値に魔法はありません。それは単に配列 ( vlen) の長さです。この配列の長さは、theano フレームワークを通過した後、最終的に CUDA カーネル起動のスレッド数を決定します。このコードは、実際にはベンチマークやその他のパフォーマンス インジケーターではありません。目的は、GPU が使用されていることを実証することです。

だから私はその数字をあまり読みません。GPU に関連する一定量のロジックに従うのは、開発者によるカジュアルな選択でした。

于 2016-01-05T06:37:29.703 に答える