0

カーネル関数が機能しない理由がわかりません。理論的には、私のプログラムは a = 14 を表示するはずですが、a = 5 を表示します。

#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>

using namespace std;

__global__ void AddIntCUDA(int* a, int* b)
{
    a[0] += b[0];
}

int main()
{
    int a = 5;
    int b = 9;
    int *d_a ;
    int *d_b ;

    cudaMalloc(&d_a, sizeof(int));
    cudaMalloc(&d_b, sizeof(int)); 

    cudaMemcpy(d_a, &a, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice);

    AddIntCUDA<<<1, 1>>>(d_a, d_b);

    cudaMemcpy(&a, d_a, sizeof(int), cudaMemcpyDeviceToHost);

    cout<<"The answer is a = "<<a<<endl;

    cudaFree(d_a);
    cudaFree(d_b);

    return 0;
}

また、次の場合は理由がわかりません。

cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice); //d_b = 9 on device
cudaMemcpy(&a, d_b, sizeof(int), cudaMemcpyDeviceToHost); //a = 9 on host

aはまだ5ですか?

4

2 に答える 2

1

CUDA プログラムで問題が発生した場合、最初のステップは、すべての cuda API 呼び出しとカーネル呼び出しに対して適切なcuda エラー チェックを使用することです。エラー チェックがあれば、このエラー (ドライバーの問題) はすぐに明らかになります。

追加の提案は、cuda タグ情報タブにあります。

于 2013-07-12T04:41:41.217 に答える
-2

多分 cudaDeviceSynchronize(); を置く必要があるかもしれません。AddIntCUDA<<<1, 1>>>(d_a, d_b)の後;

AddIntCUDA<<<1, 1>>>(d_a, d_b); を実行した場合 cudaDeviceSynchronize(); を配置しない場合、ホストは CUDA カーネルを待機しません。

于 2013-02-26T17:31:39.383 に答える