nVidia CUDA 代码不起作用?

nVidia CUDA code doesn't work?

本文关键字:不起作用 代码 CUDA nVidia      更新时间:2023-10-16

我正在学习如何为nVidia卡编程。这是我的代码:

__global__ void add_one(int* i)
{
    i[0]++;
}
template<class TYPE>
void gpu_load(TYPE data)
{
    int size = 1;
    cudaMalloc( (void**) &data, size * sizeof(TYPE));
}
template<class TYPE>
void copy_to_gpu(TYPE* cpu_var, TYPE* gpu_var)
{
    int size = 1;
    cudaMemcpy(  gpu_var, cpu_var, size * sizeof(TYPE), cudaMemcpyHostToDevice); 
}
template<class TYPE>
void copy_to_cpu(TYPE* cpu_var, TYPE* gpu_var)
{
    int size = 1;
    cudaMemcpy( gpu_var, cpu_var, size * sizeof(TYPE), cudaMemcpyDeviceToHost);
}
int main() 
{
    int gpu_i[1];
    int cpu_i[1];
    cpu_i[0] = 5;
    gpu_load(cpu_i);
    copy_to_gpu(cpu_i, gpu_i);
    add_one<<<1, 1>>>(gpu_i);
    int res[1];
    copy_to_cpu(res, gpu_i);
    std::cout << res[0];
}

为什么cout不显示5+1而显示0?

我尽力让它发挥作用。。。好像什么都没发生。。。?

  • 您正在将cpu_i传递给您的cudaMalloc例程。这不是你想要的
  • gpu_i指针需要是可以由cudaMalloc例程修改的东西,所以我们需要将其地址作为指针传递给该例程
  • 您在copy_to_cpu例程中反转了参数

如果以下代码对您不起作用,请添加适当的cuda错误检查。您的系统配置可能也有问题:

#include <iostream>
__global__ void add_one(int* i)
{
    i[0]++;
}
template<class TYPE>
void gpu_load(TYPE* &data)
{
    int size = 1;
    cudaMalloc( (void**) &data, size * sizeof(TYPE));
}
template<class TYPE>
void copy_to_gpu(TYPE* cpu_var, TYPE* gpu_var)
{
    int size = 1;
    cudaMemcpy(  gpu_var, cpu_var, size * sizeof(TYPE), cudaMemcpyHostToDevice);
}
template<class TYPE>
void copy_to_cpu(TYPE* cpu_var, TYPE* gpu_var)
{
    int size = 1;
    cudaMemcpy( cpu_var, gpu_var, size * sizeof(TYPE), cudaMemcpyDeviceToHost);
}
int main()
{
    int *gpu_i;
    int cpu_i[1];
    cpu_i[0] = 5;
    gpu_load(gpu_i);
    copy_to_gpu(cpu_i, gpu_i);
    add_one<<<1, 1>>>(gpu_i);
    int res[1];
    copy_to_cpu(res, gpu_i);
    std::cout << res[0];
}

cudaMemcpy的第一个参数始终是目的地,但在copy_to_cpu中,您首先传递gpu_var