0

何らかの理由で、このコードは機能しているようです。

bool * copyHostToDevice(bool * h_input, size_t numElems)
{
    bool * d_output;
    cudaMalloc((void **) &d_output, numElems*sizeof(bool));  
    checkCudaErrors(cudaMemcpy((void *)d_output,(void *)h_input,numElems*sizeof(bool), cudaMemcpyHostToDevice));
    return d_output;
}

しかし、これはエラーを生成します:

bool * copyDeviceToHost(bool * d_input, size_t numElems)
{
    bool * h_output;
    cudaMalloc((void **) &h_output, numElems*sizeof(bool));  
    cudaMemcpy((void *)h_output,(void *)d_input, numElems*sizeof(bool),cudaMemcpyDeviceToHost));
    return h_output;
}

これは、並列プログラミングの udacity クラスでリモートで実行しています。

2 番目の関数を呼び出したときの出力は次のとおりです。

コードを実行できません。グリッドやブロックのサイズを正しく設定しましたか?

コードがコンパイルされました!

そのため、実行時エラーが発生します。2 番目の fcn の一部を削除すると、エラーが cuaMemcpy() 呼び出しによって生成されていることが明らかになります。

前もって感謝します!

4

1 に答える 1

2

2 番目のコードでは、デバイスからホストへのコピーをホスト ポインターとしてcuda_malloc割り当てて渡すために使用しています。h_outputそれは間違っていh_outputます。ホスト ポインターである必要があります。コードは次のようになります。

bool * copyDeviceToHost(bool * d_input, size_t numElems)
{
    bool * h_output;
    h_output = (bool *)malloc(numElems*sizeof(bool));  
    cudaMemcpy((void *)h_output,(void *)d_input, numElems*sizeof(bool),cudaMemcpyDeviceToHost));
    return h_output;
}

すなわち。デバイスメモリ割り当てAPIではなく、ホストメモリ割り当てルーチン(malloc、C++ new、おそらくcudaMallocHostホストメモリを固定したい場合でも)を使用してください。

于 2013-10-06T18:16:55.527 に答える