0

gpu exで配列を割り当てることができると思います。__device__ int device_array[100];長さが既知であるため、 cudaMalloc を使用しません。しかし、次のコードを実行すると、無関係な数字が表示されます。私は cuda に関する人気のある本を調べましたが、そこにあるすべての例は cudaMalloc を使用しています。固定サイズの配列はこのように使用できますか、それとも cudaMalloc で割り当てる必要がありますか?

__device__ int device_array[100];

__global__ void kernel() {

    device_array[blockIdx.x] = blockIdx.x;
}

void call_kernel( int *host_array ) {

    kernel<<<100,1>>>();

    cudaMemcpy( host_array, device_array, 100 * sizeof( int ), cudaMemcpyDeviceToHost );
}

int main() {

    int host_array[100];

    call_kernel( host_array );

    for ( int i = 0; i < 100; i++ )
        cout << host_array[i] << endl;
}
4

1 に答える 1

1

ロバートが彼のコメントでほのめかしたように、ホスト上のシンボルにcudaMemcpyFromSymbolアクセスするときに使用する必要があります。__device__したがって、cudaMemcpy現在の形式での呼び出しは、「無効な引数」の行に沿ってエラーを与えるはずです。これを見たい場合は、cudaMemcpy行を次のように変更してみてください。

cudaError_t cuda_status = cudaMemcpy(...); 
std::cout << cudaGetErrorString(cuda_status) << std::endl;

とにかく、正しい答えを得たい場合は、cudaMemcpy行を次のように変更する必要があります。

cudaMemcpyFromSymbol( host_array, device_array, 100 * sizeof( int ), 0, cudaMemcpyDeviceToHost);

cudaMemcpyFromSymbol の署名は次のとおりです。

cudaError_t cudaMemcpyFromSymbol ( void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )

オフセットのデフォルトは 0 で、メモリ コピーの方向のデフォルトはcudaMemcpyDeviceToHostであるため、これらは技術的にオプションです。これらすべてから得られる主なポイントは、cuda-call の戻り値を常にチェックすることです。これは通常、正しい方向に導くためです。

于 2013-03-28T19:41:50.043 に答える