HPXはアクティブなグローバルアドレス空間をサポートしています。長い間、私は「AGAS」が本当に何であるか把握できません。 HPX-5でいくつかの調査を行うことで、memory modelsをサポートします。私が見ることができるのは、 "AGAS:システムをバランスさせるためにメモリを他の地域に移すことができますが、" PGASではそうすることができません。しかし、hpxでは、それを作成するパラメータ(場所のグローバル識別子)を使用してリモートオブジェクト(コンポーネント)を作成します。しかし、デスクトップでHPXを使用すると、実際にこの機能が隠され、HPXをロスタムで実行すると、 "PGAS"メモリシステムでHPXを区別することはできません。 HPXの黒い魔法の特徴を理解するのを手伝ってください。HPXのメモリアーキテクチャ
答えて
AGASは分散キー/値の「メモリ」データベースと考えることができます。 オブジェクトをローカルに作成すると、*this
またはthis->
を使用して参照可能な標準品種のポインタが取得され、内部にアクセスできます。 しかし、あるノードから別のノードにポインタthis
を渡して、それを任意に使用することはできません。 hpx::
コンポーネントを作成するか、AGASで作成したオブジェクトを登録すると、実質的にデータベースにthis
ポインタが格納され、ハンドル(キー)としてhpx::id_type
が表示されます。このidは、オブジェクトを参照する方法として、ローカルまたはリモートノード上の関数呼び出しで使用できます。
オブジェクトをあるノードから別のノードに移動すると(AGAS機能を使用)、AGASはthis
ポインタの値が変更されたことを反映するために内部値を更新します(ローカルに呼び出されたデストラクタが内部的に呼び出されます)他の場所に構築された新しいものへのコンテンツの移動)、別のノードに配置されていますが、そのオブジェクトのid_typeは有効です。AGASが再配置を行っている場合にのみtrueです。コピーを別の場所に作成してローカルオブジェクトを削除すると、同じではありません。
一般に、PGASシステムでは、すべてのノードが互いに1つのメモリブロックを共有し、各ノードはこの共有メモリ領域にインデックスを付けて、他のノードのメモリ/データ/オブジェクトに「アクセス」することができます。したがって、PGASでは、ノード1のデータがshared_region + offset * 1にあり、ノード2のデータが+ offset * 2にあるという意味で、他のノードのアイテムのアドレスは「固定」されています。これはやや簡素化されていますが、あなたはそのアイディアを得ています。
HPXでは、オブジェクトは自由に浮動しており、id_typesを使ってオブジェクトを参照し、AGASに「実際の」アドレス検索を処理させることができます。 PGASとは対照的に、「Active」がAGASにある理由です。 このようにして、データ項目(コンポーネント)をある場所から別の場所に再配置できますが、それらを参照するハンドルは変更できません。 この意味で、AGASの 'Address Space'部分は、hpx :: id_typeをジョブ内のすべてのノードにまたがるアドレスと考えることができると言っています。
しかし、異なるシステムには正しいメモリアーキテクチャがありますか? HPXは、システム全体のメモリにアクセスするためのかなり低レベルのツールや、ターゲット固有のアーキテクチャを効率的に使用するためのアーキテクチャを使用して、そのようなものをハックするメカニズムを使用していますか? – praveen
これをクリアしてください - コンパイラが分散システムのマシンコードを生成する方法は?私はこれがHPXに関連していないことを知っていますが、これはすべての分散アプリケーションに当てはまります。おかげで – praveen
直接番号。 HPXは他の人と同じようにメモリを使います。しかし、異なるアーキテクチャ上の異なる種類のメモリ用のアロケータを作成するための開発が行われている。 HPXは単なるC++なので、あなたが選んだようにメモリを管理することができます。 hpx :: computeにGPUメモリコピーの簡単な例があります.HNMを公開するためにKNLにいくつかの作業がありましたが、numaドメインなどにメモリをバインドするための自分のnuma_allocatorがあります。HPXが成熟すると、これらのツール/ユーティリティは徐々に吸収されますライブラリに追加します。 – biddisco