2012-03-20 8 views
1

動的に展開する配列のメモリを割り当てるために、動的にcudaMallocを実行する必要があります。このサイズは広範囲に変わります。この配列は、2つのテーブルに対する結合操作の結果を表します。したがって、サイズがゼロであるか、最大のデータ量になることがあります(テーブルに完全に似たデータが含まれている場合)。私は、テーブルのデータがほぼ同じであることに起因期待にメモリを割り当てる場合動的にcudaMallocを作る方法

、私はCUDAを使用して動的にメモリ割り当てを実行するためのいくつかの方法があり、したがって、すべての

で使用されていないメモリの膨大な量を得ることができますメモリの使用効率を高めるには?

+0

質問が分かりません。 cudaMalloc *は動的なランタイムメモリ割り当てです。あなたは、実行中のカーネルの中でメモリ割り当てを行うことを求めていますか? – talonmies

+0

あなたは何とかcudaMallocが自動的にあなたの配列に余分なメモリを予約してくれると期待していますか? – Bart

+0

私は、配列が最初にカーネルを実行する前に最小サイズで割り当てられていることを意味しますが、カーネルが実行されている間は(追加のメモリ割り当て)展開することができます – dmdkv

答えて

2

以前に割り当てられたメモリをカーネル内で動的に展開する方法はありません。フェルミで最も近いのは「新」と「削除」です。しかし、それらは新しいチャンクを割り当てますが、既存のチャンクは拡張しません。しかし、私はカーネル内で割り当てられたメモリを拡張しようとすると、何の問題もありません。カーネルが使用できる最大量のメモリを割り当てます。それは、後でデータの処理を完了するのに十分なメモリがないことを意味する場合、メモリを動的に拡張することができたならば、プログラムはそのケースをどうにか処理できませんでした。

また、新しい結果を保持するために割り当てられたメモリを継続的に拡張するスキームでは、スレッド間で多くの通信が必要になります(すべてのスレッドは現在見つかっている結果の数を知る必要があるため)。代わりに、ギャップのない結果セットを作成しようとしないでください。ジョインの結果をスレッドインデックスに対応する場所に、割り当てられた領域全体に格納させます。その後、結果を第2のカーネルまたはスラストでスキャンし、結果をまとめます。

関連する問題