2016-03-23 27 views
1

ホストとデバイスの両方からアクセス可能な構造体を割り当てる最も良い方法は何か疑問です。一例として、以下の構造体を取る:統合GPUにゼロコピー構造体を割り当てる

チャンクは、配列の簡単な構造体である
struct Buff { 
    int * index; 
    Chunk * chunks; 
} 

:今、私は、最初の構造体のためのゼロコピーメモリを割り当てることによって、これを達成し、その後のため

struct Chunk { 
    int sas[CHUNK_SIZE]; 
    int das[CHUNK_SIZE]; 
}; 

構造体のメンバーは、次のとおり、深いコピーはユニで自動的に処理されている方法のようなもの。このため、より効率的な方法がある場合は

Buff * my_buff; 

// Allocate zero-copy memory for the struct (as the container) 
checkCudaErrors(cudaHostAlloc(&my_buff, sizeof(Buff), cudaHostAllocMapped)); 

// Allocate zero-copy memory for index 
checkCudaErrors(cudaHostAlloc(&my_buff->index, sizeof(int), cudaHostAllocMapped)); 

// Allocate zero-copy memory for the array of chunks 
checkCudaErrors(cudaHostAlloc(&my_buff->chunks, sizeof(Chunk) * NUM_CHUNKS, cudaHostAllocMapped)); 

、私が知りたいのですがfiedメモリ。

+0

私はあなたの方法が最善であると信じています。私はあなたがTegra TK1またはTX1で作業していると仮定しています。その場合、最高のパフォーマンスを得るために一般的にやりたいことは、メモリー間コピーをまったく*避けることです。ゼロコピーはそれを達成するはずです。 –

+0

@RobertCrovellaありがとう!はい、実際には、私は両方で働いています。次の質問として、my_buff-> indexを読み書きするためには、グローバルメモリへのアクセスがいくつ必要ですか?私は1つだけ願っています。 – arima

+0

'index'はポインタではありません。 'buff'が既にGPUにアクセス可能な場合、それはどのような目的に役立ちますか? – talonmies

答えて

2

ここに私の質問に対する上記のコメントからの短い答えがあります。

このメソッドの基本的な考え方は、最初に構造体にゼロコピーメモリを割り当て、その後ポインタメンバーのそれぞれに割り当てるという意味では、そう思われます。

indexは、既にmy_buffがGPUでアクセス可能であり、indexをポインタとして使用すると、1つ以上のグローバルメモリアクセスが発生するため、ポインタであってはなりません。一般に、ポインタ追跡方式はGPUの使用には最適ではなく、そのような構造を平坦化し、効果的にAoSからSoAに変換することがアドバイスです。

関連する問題