2011-07-03 12 views
7

CUDAでプログラミングするホストからgpuにデータをコピーしようとして問題が発生しました。CUDAで構造体のディープコピーを実行するには?

私はこれらのような3ネストされた構造体を持っている:

typedef struct { 
    char data[128]; 
    short length; 
} Cell; 

typedef struct { 
    Cell* elements; 
    int height; 
    int width; 
} Matrix; 

typedef struct { 
    Matrix* tables; 
    int count; 
} Container; 

のでContainerは、順番にいくつかのCell要素を含んでいるいくつかのMatrixの要素を、 "含んでいます"。

のは、私は動的にこのようにホストメモリを割り当てるとしましょう:

ある
Container c; 
c.tables = malloc(20 * sizeof(Matrix)); 

for(int i = 0;i<20;i++){ 
    Matrix m; 
    m.elements = malloc(100 * sizeof(Cell)); 
    c.tables[i] = m; 
} 

、100個の細胞それぞれの20マトリックスのコンテナ。

  • 私はこのデータをcudaMemCpy()を使用してデバイスメモリにコピーできますか?
  • "struct of struct"のホストからデバイスへのディープコピーを実行する良い方法はありますか?

お時間をいただきありがとうございます。

アンドレア

答えて

3

短い答えは「しない」です。

  1. あなたは途方もなくなりますが、GPUに説明した構造を設定のwriteToとコピーする必要がありますAPI
  2. 結果のコードには深いコピー機能はありません:私はと言う理由4つの理由があります。複雑なもの(最低でも約4000のAPI呼び出し、おそらくあなたの20 Matrix of 100 Cellsの中間カーネル)
  3. 3レベルのポインタ間接参照を使用するGPUコードはメモリアクセスの待ち時間を大幅に増やし、キャッシュの一貫性GPUで利用可能です
  4. その後にデータをホストにコピーしたい場合は、あなたは逆に同じ問題を抱えています

代わりに線形メモリとインデックスを使用することを検討してください。これはホストとGPUの間で移植可能で、割り当てとコピーのオーバーヘッドはポインタベースの代替方法の約1%です。

本当にとしたい場合は、コメントを残しておきます。GPUに完全な虚偽のネストされたポインタが何であるかを示す古いコード例を掘り下げてみます。

+0

私は線形メモリの使用と配列の平坦化についてたくさん読んでいます。 実際には、 'Matrix'構造体の' elements'フィールドを線形メモリとして管理しますが、高レベル表現は2Dです。 3つの構造体を線形化/平坦化しようとしますが、どうやってこれを行うことができますか?すべてのインデックスを管理することは難しいでしょうか? とにかく、ありがとうございました。古いコードを探しても構いません。 – Andrea

関連する問題