2016-04-18 8 views
1

CUDAでRLEをデコードする必要があり、RLEをすべての自分の値でリストに展開する最も効率的な方法を考えようとしています。だから私の値は2、3、4で、私のランは3,3,1です。それを2、2、3、3、3、4に広げたいとします。CUDAでRLEを効率的にデコードする

最初は私が使うことができると思ったcudaMemsetしかし、私は今、カーネルを立ち上げ、CUDA Compute Capability 3.0を持っていると確信しています。これは、各値/実行ペアに対して新しいカーネルを起動するのはおそらく非効率ではないとしても、

CUDAでうまく動作しないようなことがたくさんあるので、このソリューションを試してみる前に、このソリューションが適切かどうかを知りたいと思っています。宛先に向かってcudaMalloc、次にcudaMemCpyを呼び出すカーネルを作ることは合理的でしょうか?私は簡単に接頭辞の合計を計算して、どこからメモリをコピーするかを知り、すべての読書を少なくとも合体させることができます。私が心配しているのは、cudaMalloccudaMemCpyを何回も呼び出すことです。

これらの値を共有メモリに書き込み、それらをグローバルメモリにコピーすることも考えられます。私は、私の最初の解決策が効果的かどうか、あるいは後者をしなければならないかどうかを知りたい。

答えて

3

各値/実行ペアごとに別々の操作(たとえば、cudaMalloc、またはcudaMemset)を行うことは考えたくありません。

実行シーケンスでプレフィックスsumを計算した後、プレフィックスsumの最後の値は合計割り当てサイズになります。最終的な展開されたシーケンス全体に対して、単一のcudaMallocオペレーションにこれを使用します。

必要な領域が割り当てられ、接頭辞の合計が計算されると、実際の展開はかなり簡単です。

thrust高速プロトタイプが必要な場合は、これを簡単に行うことができます。それにはan example codeがあります。

+0

ロバートはあなたの周りの最も素晴らしい人のひとりです。私はこれまでにCUDAを実行したすべての問題を解決しました。ありがとうございました! – flips

0

@RobertCrovellaは当然正しいですが、圧縮の程度をわずかに微調整する余裕があれば、さらに効率を上げることができます。

セルフ・プラグインは申し訳ありませんが、ラン・レングス・エンコーディングのバリエーションのmy own implementationに興味があります。入力に出力位置を固定することを追加しました。 2048番目の要素を持っていますか?これによりスレッドブロックに対する作業のより公平な割り当てが可能になり、本格的な接頭辞の合計が不要になります。それはまだ進行中ですので、執筆時点では336 GB /秒のメモリ帯域幅カード(Titan X)で〜34 GB/secしか得られませんが、それはかなり役に立ちます。

関連する問題