0

以下のコードに示すように、ホスト メモリを割り当てる方法を方法 1 から方法 2 に変更しました。コードはエラーなしでコンパイルおよび実行できます。方法2を使用してポインターからポインターにメモリを割り当てるのは適切な方法または副作用なのだろうか.

#define TESTSIZE  10
#define DIGITSIZE 5

//Method 1  
int **ra;
ra = (int**)malloc(TESTSIZE * sizeof(int));
for(int i = 0; i < TESTSIZE; i++){
    ra[i] = (int *)malloc(DIGITSIZE * sizeof(int));
}

//Method 2  
int **ra;
cudaMallocHost((void**)&ra, TESTSIZE * sizeof(int));

for(int i = 0; i < TESTSIZE; i++){
    cudaMallocHost((void**)&ra[i], DIGITSIZE * sizeof(int));
}
4

1 に答える 1

1

どちらも正常に動作します。ただし、 と の間には違いがcudaMallocHostありmallocます。その理由は、cudaMallocHost固定されたメモリを割り当てるため、内部で OSmallocがページを固定するために似たようなことを行ったり、いくつかの追加機能を実行したりするためです。これは、cudaMallocHost一般的に時間がかかることを意味します。

cudaMemcpyそうは言っても、単一のバッファから繰り返したい場合はcudaMallocHost、固定されたメモリからデータを転送する方が速いため、長期的にはメリットがあります。

また、固定メモリを使用してデータ転送/計算をオーバーラップする必要streamsがあります。

于 2016-02-22T19:39:20.183 に答える