2016-05-24 1 views
0

私は計算を実行したカーネルの中にI mallocという構造体があるとします。私はこれらの変数を返すしたいですが、私はカーネルを初期化したときにポインタとして送られなかったので、もし私がこれらの値を返そうとするならば。私はどうしたらいいのですか?以下のサンプルコード。カーネルのmallocデータを効率的にCPUに戻す方法

私はこれを一般的な質問として以下のコードを解決しないように要求しています。私はこれに遭遇する他の問題を抱えており、私はそれについて何が最善の方法であるのか分からない。ポインタを投げて結果をコピーするだけでよいことを理解しています。しかし、結果のサイズがあらかじめ決められていない場合、それを効率的に行うのは非常に難しいでしょう。だから私は良い方法があるかどうか尋ねています。

__global__ void addKernel() 
{ 
    int* c = (int*)malloc(sizeof(int) * 32); 
#pragma unroll 
    for (int i = 0; i < 32; i++){ 
     c[i] += 1; 
    } 
} 

答えて

2

ポインタは、ホスト側のAPI呼び出しで使用することができない装置側割当(newmalloc、又はcudaMalloc)を使用して割り当てられました。したがって、デバイスランタイムによって割り当てられたメモリに格納されたデータを転送する唯一の方法は、カーネル内のデータをホストによって割り当てられたメモリにコピーし、実行中のカーネルに渡すことです。

デバイスランタイムは、デバイスからデバイスへのメモリコピーではmemcpycudaMemcpyAsyncの両方をサポートします。私はそれらがこの場合あなたの最良の選択肢であると思う。デバイスランタイムAPIの制限を理解するために、ドキュメントのthis sectionを慎重に検討する必要があります。

+0

私はこの部分を読んだが、まだこのアイデアをあきらめる準備ができていなかった:)私はuvaを使用し、データがgpuによって操作されたかどうかを示すヘッダーを考えていた。ロケーション。それは良い考えですか?私がコードを書くことを私が望むなら、私が帰った後でそれをやります。 –

+0

私はあなたが解決しようとしている問題についてさらにいくつかの情報を提供するべきだと思います。可変量のデータを出力するカーネルに対処するために使用できる多くの異なる戦略がありますが、通常はそれに対してデバイス側のmallocは必要ありません。 –

関連する問題