我正在努力学习如何为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?
我尽力让它发挥作用......似乎没有任何反应......?
答案 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];
}