核函数与cudaMemcpy

核函数与cudaMemcpy,cuda,Cuda,我不知道为什么我的内核函数不工作。理论上,我的程序应该显示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

我不知道为什么我的内核函数不工作。理论上,我的程序应该显示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;
}

a仍然是5?

也许您需要将cudaDeviceSynchronize()放入;在附加CUDA之后(d_a,d_b)


当您执行AddIntCUDA(d_a,d_b)时;如果不放置cudaDeviceSynchronize(),主机不会等待CUDA内核

每当您在CUDA程序中遇到问题时,第一步应该是在所有CUDA API调用和内核调用中使用正确的方法。通过错误检查,此错误(驱动程序问题)将立即变得明显


可以在cuda标签上找到其他建议。

您的代码适合我。产量为14。检查所有CUDA调用的返回类型。我意识到,在同一个流中,这不应该是一个问题,但在过去,我看到了奇怪的结果,除非我在内核调用之后放置一个cudaDeviceSynchronize()。您可能希望至少尝试一下,看看是否出于某种原因,memcpy在内核完成之前发生了。您的代码完全缺少错误检查。很可能内核没有执行,因此a的值没有改变。您安装了哪个图形设备、CUDA工具包和驱动程序?您是否尝试过CUDA SDK的一些示例?例如,deviceQuery?感谢您的回复。问题出在司机身上。我安装了上一个驱动程序版本,现在它可以工作了。不,cudaMemcpy调用是一个阻塞调用。不需要同步。请考虑检查CUADAMEMCPY、CUADAMEMCYPASYNC和CUDADEVICESE同步之间的差异。
cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice); //d_b = 9 on device
cudaMemcpy(&a, d_b, sizeof(int), cudaMemcpyDeviceToHost); //a = 9 on host