0

カーネル コードでデバイスのグローバル メモリ配列を作成しようとしました。実行が終了したら、配列の内容をホスト メモリに渡します。デバイス コード スコープでグローバル メモリ配列を動的に作成することは可能ですか、それともデバイス コード スコアがグローバル配列である場合、配列を外部で定義する必要がありますか。

__global__ void kernel_code(...,int array_size){
    __device__ int array_data[size];

    // fill the array_data 
    ...
}

int main(){
    //pass data from array_data to host array
}

そうでない場合、最も可能性の高いプラクティスは何ですか?

4

2 に答える 2

1

配列の割り当ては、コンパイラによって静的に実行できる必要があります。そのため、そのサイズをカーネルに渡すパラメーターとして宣言することはできません。

また、__device__関数本体内での変数宣言はできません。したがって、関数スコープではなく、モジュールのグローバル スコープにある必要があります。

それとは別に、静的に宣言されたデバイス配列とホスト配列の間でデータを渡すことができます。__device__変数には次の特性があります。

  • グローバルメモリ空間に常駐し、
  • アプリケーションの寿命があり、
  • グリッド内のすべてのスレッドとホストからランタイム ライブラリ (cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol()) を介してアクセスできます。

したがって、ホスト コードでは、cudaMemcpyToSymbol を使用てホスト配列からデバイス配列にデータを転送し、cudaMemcpyFromSymbolを使用してデバイス配列からホスト配列にデータを転送します。

動的にサイズ変更されたデバイス配列の場合、最も一般的な方法は、次のような通常のホスト ランタイム API 関数を使用してそれらを割り当てcudaMalloc、ホスト配列からデバイス配列へ、またはその逆にデータを転送することです。cudaMemcpy

于 2013-05-16T21:33:04.580 に答える
0

通常の方法では、カーネル内でのみデバイス メモリを操作します (はるかに高速です)。cudaMemcpy(dst, src, cudaMemcpyDeviceToHost)を使用して、データをホスト メモリにコピーするだけです ( をmain()参照)。

于 2013-05-16T23:52:32.250 に答える