2017-11-27 15 views
-1

私は、OpenMPIを使用してMPIプロセス間でデータを分散させる非常に大きな並列アプリケーションに取り組んでいます。 「シリアル」のようないくつかのシリアライゼーションライブラリでMPIを使用すると、巨大なマルチオブジェクトを渡すことが非常に快適になります。私は、マルチ埋め込み構造によって何を意味するかのヒントを与えるために、私は現在のような、単純化されたバージョンで働いています:*オブジェクト/構造体が埋め込まれたcudaMalloc/cudaMemcpy

// structures for CUDA - this is inside std::vector<struct_multi_data> multi_data_vector 
struct struct_multi_data{ 
    int intended_kernel_block; 
    int intended_kernel_thread; 
    std::vector<float> data_float; 
    std::vector<float> data_int; 
    float result; 
}; 

struct struct_unique_data{ 
    // this structure is shared among all blocks/threads 
    float x; 
    float y; 
    float z; 
}; 


class Data_object{ 

// functions 
    public: 
     Data_object(); 
     ~Data_object(); 

     int resize(int multi_data_vector_len, int data_float_len, int data_int_len); 
     void set_id(int id); 

     int clean(void); 
     int get_multi_data_len(); 
     int get_multi_data(struct_multi_data * data, int vector_element); 
     int set_multi_data(struct_multi_data * data, int vector_element); 


// variables 
    private: 
     std::vector<struct_multi_data> multi_data_vector; 
     struct_unique_data unique_data; 
     int data_id; 
}; 

上記のコードは、簡略化され、私は、シリアル化の機能や他のいくつかの基本的なものを削除しました全体的な構造は、簡単に言えば

を保持しているが、私はすべての構造struct_multi_dataは、いくつかのベクトル{floatを含んでいる構造体のベクトルであるベクトル{struct_multi_data}を含む、Data_objectの周りに移動しています}

すべてのデータを1 Data_objectに埋め込む理由は、MPIの送受信を簡素化するためです。


QUESTION

がcudaMalloc/cudaMemcpy機能を使用してGPUメモリにData_objectを移動するためのいくつかの快適な方法はありますか?

正規のstd :: vectorに問題があるようです。 推力ライブラリに依存したいと思っていません。MPIシリアル化ソリューションで動作するかどうかわからないからです。

EDIT質問 私ははGPUにデータにアクセスできるように私のData_objectためを管理し、またはcudaMallocManaged()を使用することはできますか?


Data_objectの大きさがよく、プログラム実行の最初に定義されて

をお読みください。どのベクトルもサイズを変更するものではなく、実行の開始点です。だから私はなぜベクトルを使用していますか?この方法では、データサイズを変更するためにプログラムを再コンパイルする代わりに(データが配列として定義されている場合など)、パラメータを渡すことでベクトルサイズを設定できます。コメント 1)私は配列へのポインタを持つすべてのベクトルを置き換えることができると思いTO


応答。

+3

ワンワード回答はノーです。 – talonmies

+0

これはstd :: vectorを使用するといくらか難しくなり、メモリをどのように割り当てているのか誤解していると思います。この場合、少なくともベクトルのように動的に割り当てられた配列を使うほうが簡単でしょう。少なくとも、どのブロックのメモリをコピーする必要があるか分かっているからです。そして、ベクターと全く同じ方法でサイズを初期化することができます。 –

+0

まだ管理されているメモリは、GPU上でホストコンテナクラスを使用できないという問題を解決できず、CUDA APIはどのような種類の「ディープコピー」もサポートしていません。 – talonmies

答えて

2

いいえ、この質問の余分なセクションは役に立ちません。 std::vectorは、そのように動作することを意図したものではありません。それは、それが指すメモリを「所有」していて、他の場所に(たとえホストメモリ内に)mem-copyしてそこから使用すると、メモリが破壊されます。また、std::vectorコードは__device__ -codeではないため、GPU上で実行することもできません。あなたは何ができるか

ではなくstd::vectorの、メモリを所有していないstd::spanを、使用しています。あなたがそれを行い、メモリが管理されている場合、クラスをmemコピーすると動作するかもしれません。

注意ここでは、主な問題であると思われるベクトル以外のメンバーを完全に無視しています。

関連する問題