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のテクニックがありますか?可能な限り最大限の結果を得ることができます。
いくつかのコードはどうですか? – wallyk
肯定的な一致が少ない場合は、[この回答](http://stackoverflow.com/q/11148860/442006)で説明している代替手順が適している可能性があります。その度にインデックスを30ずつ増やします。 –
ちょっと@wallyk私がもっと説明できることは不明な点はありますか?コードが必要であると感じる場合は、サンプルを作成することができます(実際のコードベースは非常に大きく、他のファイルに依存しているので、もっと役立ちます)。 – Lostsoul