2017-02-13 6 views
1

私は、データエッジを介して接続された計算を行う複数のタスクを持つワークフローを持っています。 1つのタスクが別のタスクのためのデータを生成するようにする。各タスクは別のスレッドにバインドされています。これらのタスクの1つは、メモリを解放する別のタスクによってリサイクルされるメモリプールからメモリを取得することです。C++のメモリに関するメタデータにアクセスする方法

MemoryDataは、メモリの起源(GPUアドレス空間/ CPUアドレス空間)とリリースルール(メモリをリサイクルできる時期を示す)などの情報を格納するためにメモリプール内で使用されます。

タスク1プールからメモリを取得:

std::shared_ptr<MemoryData<Type>> m = memGet<Type>("MemoryManagerName", ruleForReleasingMemory); 
// Store the memory to passed along with data 
data->setMemory(m); 

mはそれを解放するタスクに到達するまで、データ内のタスクにタスクから渡されなければなりません。

タスク2がメモリを解放する:

std::shared_ptr<MemoryData<Type>> m = data->getMemory(); 
memRelease("MemoryManagerName", m); 

私が何をしようとしているだけでTypeを返すためにmemGetの戻り値の型を変更しています。その後、リリース中に、ある方法を使用してMemoryDataにメモリをリサイクルさせることができます。これによりDataの表現が簡素化されるので、std::shared_ptr<MemoryData<Type>>を保存する必要はありません。

これまでのところ私は2つのデザインを考えた:

(1)ポインタ**へのポインタを使用し、そこからMemoryDataの開始アドレスを計算するために、ポインタ演算を使用します。

(2)TypeへのポインタとMemoryDataへのポインタとの間のマッピングを作成します。これは、この情報を各タスクに送信する必要があり、動的メモリ割り当てを追加する必要がある場合、少し難しいでしょう。

+6

なぜCタグですか? CはC++とは異なります。 –

+0

私はCまたはC++からの提案にオープンしています。私は、クラスより簡単な構造体の中でポインタの算術演算を行うことが分かっています。 – Jameshobbs

+5

Cは 'std :: shared_ptr'やテンプレートを持っていないので、C言語にすることはできません。 C言語タグを削除することをお勧めします。 –

答えて

3

メモリに関するメタデータは(デフォルトでは)存在しません(ある場合は実装固有)。

は、あなた自身のメモリallocatorオペレーティングシステムの既存の上記のプリミティブもmallocで使用されているLinux上mmap(2)など)を書いて、そのメタデータを自分で管理することができます。

現在のアリーナまたはメモリチャンクを取得するために、メモリアドレス(たとえば、ビットと右シフト、またはなどのキャスト)でトリックをプレイすることができます。私が考えていることなど

、あなたのアロケータが提供するメモリゾーン内の何かにvoid* pいくつか任意のポインタを持っている場合、あなたはあなたのメタデータの一部にいくつかの小さなインデックスを取得するために(uintptr_t)p >> 14を使用するかもしれないということですもちろん、そのようなアドレスビット処理は、プロセッサおよびオペレーティングシステム特有のものである(ページサイズおよびOSがそれらをどのように扱うかに依存する)。

+0

私は現在、 'cudaMalloc'のように、プール内のものを割り当てるためのアドレス空間を指定するために使用されるアロケータインタフェースを持っています。 mmapの方法で私自身のメモリアロケータを書くことによって、これは 'Type'のプリミティブ' double * 'をどうやって管理しますか?メモリチャンクを取得するためにメモリ上でビットシフトと右シフトを使用する例がありますか? – Jameshobbs

+0

あなたは 'mmap'のようなことを書くつもりはないでしょう。あなた自身のアロケータで* mmapを使うでしょう。 –

+0

グローバルに、またはローカルに新しい演算子と削除演算子をオーバーロードすることができます。しかし、世界的に過負荷がかかっていると、迂回路や雑草が混じった圃場になりますが、これはアドレス問題の迅速な対応ではありません。 –

関連する問題