2

PyCUDAのドキュメントは、「非達人」クラスの例を少し紹介していますが、gpuarrayの配列操作に使用できる操作について疑問に思っています。このループをgpuarrayしたい場合。

m=np.random.random((K,N,N))
a=np.zeros_like(m)
b=np.random.random(N) #example
for k in range(K):
    for x in range(N):
        for y in range(N):
            a[k,x,y]=m[k,x,y]*b[y]

このための通常のファーストストップPython削減は次のようになります

for k in range(K):
    for x in range(N):
        a[k,x,:]=m[k,x,:]*b

しかし、GPUArrayを使用してこれを行う簡単な方法は、カスタムの要素ごとのカーネルを作成する以外にわかりません。それでも、この問題では、カーネルにループ構造が必要であり、その複雑さの時点で、おそらく私はより良いでしょう。私自身の本格的なSourceModuleカーネルを書くだけです。

誰かが私を手がかりにできますか?

4

2 に答える 2

2

これはおそらく、独自のカーネルで行うのが最適です。PyCUDA の gpuarray クラスは、GPU メモリを numpy 配列と交換可能に使用できるものに非常に便利に抽象化したものですが、既製の線形代数と並列リダクション演算以外で GPU をコーディングする必要性を回避する方法はありません。

とは言っても、書くのはかなり簡単な小さなカーネルです。非常に些細なことで、メモリ帯域幅に制限されます。いくつかの同様の操作を「融合」して、FLOPS とメモリ トランザクションの比率を少し改善できるかどうかを確認することをお勧めします。

カーネルに関するサポートが必要な場合は、コメントをお送りください。大まかなプロトタイプを含めて回答を拡張できます。

于 2011-04-18T20:23:17.947 に答える
2

memcpy_dtod()メソッドと gpuarrays のスライス機能を使用することもできます。通常の割り当てが機能しないのは奇妙です。set()ホストからデバイスへの転送 ( を使用) を想定しているため、機能しませんmemcpy_htod()

    for k in range(K):
        for x in range(N):
            pycuda.driver.memcpy_dtod(a[k,x,:].gpudata, (m[k,x,:]*b).gpudata, a[k,x,:].nbytes)
于 2013-08-01T13:50:41.630 に答える