【问题标题】:Kernel function and cudaMemcpy内核函数和 cudaMemcpy
【发布时间】:2018-01-09 10:55:28
【问题描述】:

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

【问题讨论】:

  • 您的代码对我有用。输出为 14。检查所有 CUDA 调用的返回类型。
  • 我意识到在同一个流中这应该不是问题,但过去我看到过奇怪的结果,除非我在内核调用之后放置一个 cudaDeviceSynchronize()。您可能想至少尝试一下,看看是否由于某种原因在内核完成之前发生了 memcpy。
  • 您的代码完全没有错误检查。很可能内核没有执行,因此 a 的值没有改变。
  • 您安装了哪个图形设备、CUDA Toolkit 和驱动程序?您是否尝试过一些 CUDA SDK 的示例?例如,deviceQuery?
  • 感谢您的回复。问题出在司机身上。我安装了最新的驱动程序版本,现在它可以工作了。

标签: cuda


【解决方案1】:

当您在使用 CUDA 程序时遇到问题时,第一步应该是在所有 cuda API 调用和内核调用上使用正确的cuda error checking。通过错误检查,这个错误(驱动程序问题)会立即显而易见。

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

【讨论】:

    【解决方案2】:

    也许你需要把 cudaDeviceSynchronize(); AddIntCUDA>>(d_a, d_b);

    当你执行 AddIntCUDA>>(d_a, d_b);如果你不放 cudaDeviceSynchronize(); 主机不会等到 CUDA 内核;

    【讨论】:

    • 不,cudaMemcpy 调用是阻塞调用。不需要同步。
    • 考虑检查 cudaMemcpy、cudaMemcpyAsync 和 cudaDeviceSynchronize 之间的区别
    猜你喜欢
    • 2016-06-03
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多