nVidia CUDA代码不起作用?

时间:2013-12-06 23:12:49

标签: c++ cuda

我正在努力学习如何为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?

我尽力让它发挥作用......似乎没有任何反应......?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果以下代码不适合您,请添加proper cuda error checking。您的系统配置也可能存在问题:

#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];
}