2016-06-19 4 views
8

ジュリアのCUDArtパッケージを使用してGPUコンピューティングを管理し始めました。私は必要な計算がすべて実行される前にgpuから(例えばto_host()を使用して)データを取得するようにする方法を知りたいと思っています。Julia CUDArtと同期するには?

特定のCudaArrayが更新されている間、若干の実験を通して、to_host(CudaArray)が遅れているようです。だから、おそらくこれを使って安全性を確保するだけで十分でしょうか?しかし、ちょっとばかげているようです。

今はdocumentationのように、launch()関数を使用してカーネルを実行しています。

CUDArtのドキュメントではJuliaの@syncマクロを使用した例がありますが、これは美しいかもしれません。しかし、@syncの目的のために私は自分の「仕事」を終え、カーネルがlaunch()で開始されるとすぐに移行する準備が整いました。私がlaunch()の操作を理解している限り、この機能を変更する方法はありません(「起動する機能の出力を受け取るのを待つ」など)。

どのように同期を行うことができますか?

答えて

1

私はより多くの標準的な方法は、各デバイスのストリームを作ることだと思う:@asyncブロック内

streams = [(device(dev); Stream()) for dev in devlist]

、その後、あなたが計算を行うには、それを教えた後、あなたがwait(stream)機能を使用しますそのストリームがその計算を終了するのを待つように指示します。 READMEのStreamsの例を参照してください。

+0

良い点。私は 'device_synchronize'はまだ多くの設定で役に立つと思います。 1. CUBLAS、CUSPARSEなど、ストリームを引数として取らない他の関数とともに使用することができます。また、1つのGPUで作業しているだけであれば、ストリームを必要としない場合もあります。したがって、 'device_synchronize'は少し単純なアプリケーションにつながります。 –

10

しかし、CUDArtパッケージには数多くのドキュメンテーションはありませんが、私はソースコードを見ていますが、これを行う方法は簡単です。特に、現在アクティブなデバイス上のすべての作業が終了するまでブロックする機能があると思われます(device_synchronize())。このように、特に以下が動作するようです:

using CUDArt 
md = CuModule("/path/to/module.ptx",false) 
MyFunc = CuFunction(md,"MyFunc") 
GridDim = 2*2496 
BlockDim = 64 
launch(MyFunc, GridDim, BlockDim, (arg1, arg2, ...)); 
device_synchronize() 
res = to_host(arg2) 

私はここで注意すべき多くのものがあるかどうかのより多くの専門知識を持つ誰からも聞いてみたいです。

+7

文書化されていない関数は、内部的に使用される可能性があります。明らかにこれは必ずしも当てはまるわけではありませんが、これらの機能を使用する場合は、次のバージョンにアップグレードするときに問題を引き起こす可能性があります。パッケージやライブラリの所有者は、マイナーリリース間でも、文書化されていない機能の大幅な変更や完全削除について、より簡単に感じる傾向があります。慎重に進み、回帰テストを必ず書いてください。 – JDB

関連する問題