2012-06-23 9 views
5

Cudaは素晴らしいですし、私は狂気のように使用していますが、私はメモリを転送する問題を抱えているため、彼女の完全な可能性を使用していません。可変量のメモリを出力する。基本的に私は65535項目の配列をCudaに送り、Cudaは各データ項目を20,000種類の方法で分析し、プログラムロジックに一致するものがあれば結果として30個のintリストを保存します。それぞれの異なる組み合わせを分析して合計を調べるロジックを考えてみて、合計が探している数と等しい場合は、結果を保存します(分析される各アイテムの30のintリストです)。Cudaから大きな可変量のメモリを転送する

問題は65535(データ配列内のブロック/アイテム)* 20000(アイテムごとにテストされた合計の組み合わせ)= 1,310,700,000です。これは、すべてのデータが正の一致となる可能性を扱うために、そのサイズの配列を作成する必要があることを意味します(これは非常に起こりにくく、メモリを作成するのに夢中です)。 Cudaがリンクリストや動的なサイズのリストに効率的に書き込むことができるかどうかわからないので、私はそれを小さくして処理するブロックを少なくしなければなりません(このアプローチでは、ブロックを使用して出力をホストメモリに書き込みます* number_of_different_way_tests)。

これを行うより良い方法はありますか? Cudaは何とかブロックIDから派生したものではない空きメモリに書き込めますか?このプロセスをCPUでテストすると、アイテム配列の10%以下が正の一致を持つので、カーネルに作業を送信するたびに非常に多くのメモリを使用することはほとんどありません。

p.s.私は上記を見ていますが、正確には私がやっていることですが、それについての別の考え方を混乱させるならば(私がやっていることではありませんが問題を理解するのに十分です)、私は20,000の配列65,535個のアイテムが含まれています)、他の配列にピアを持つ各アイテムを追加します。合計が数値(たとえば200-210)に等しい場合、そのマッチング結果を得るために追加した数字を知りたいと思います。数値が非常に幅広い場合は、すべてが一致するわけではありませんが、私のアプローチを使用すると、その膨大なメモリをmallocする必要があります。少ないメモリ容量で結果をキャプチャできますか?私の現在のアプローチはmallocだけですが、効率的ではないブロックを少なく実行する必要があります(私はCudaがブロックを構成して実行する方法が好きなので、多くのブロックとスレッドを実行したいです) 。私はこれに使用できるCudaやCのテクニックがありますか?可能な限り最大限の結果を得ることができます。

+0

いくつかのコードはどうですか? – wallyk

+0

肯定的な一致が少ない場合は、[この回答](http://stackoverflow.com/q/11148860/442006)で説明している代替手順が適している可能性があります。その度にインデックスを30ずつ増やします。 –

+0

ちょっと@wallyk私がもっと説明できることは不明な点はありますか?コードが必要であると感じる場合は、サンプルを作成することができます(実際のコードベースは非常に大きく、他のファイルに依存しているので、もっと役立ちます)。 – Lostsoul

答えて

0

As Per Roger Dahl's great answer: 探している機能をストリーム圧縮といいます。

コンパクトな形式で結果を直接格納しようとすると、パフォーマンスが得られるスレッド間で非常に多くの依存関係が作成される可能性があるため、スレッドごとに4つの解決策の余地がある配列を用意する必要がありますカーネルの実行時間が長くなると、ホストに戻されるデータが少なくなります。例外はほとんどのスレッドが解決策を見つけられない場合です。その場合、アトミック操作を使用してインデックスを配列に維持できます。そのため、見つかった各ソリューションに対して、インデックスに配列を格納し、アトミック操作を使用してインデックスを増やします。私はこれにatomicAdd()を使うのが安全だと思います。結果を格納する前に、スレッドはatomicAdd()を使用してインデックスを1つ増やします。 atomicAdd()は古い値を返し、スレッドは古い値をインデックスとして使用して結果を格納できます。

しかし、より一般的な状況では、かなりの数の結果がある場合、最適な解決策は、別の手順として圧縮操作を実行することです。これを行う1つの方法はthrust :: copy_ifです。いくつかの背景については、この質問を参照してください。

関連する問題