CUDA C只是C语言的扩展,多了一些包,只要安装好CUDA工具箱(编译GPU代码的编译器)就可以在VS等IDE下就能编译和运行。
下载GPU驱动程序 www.nvidia.com/cuda(可能你的机器已经装好)
下载CUDA工具箱 http://developer.nvidia.com/object/gpucomputing.html
还可以下载GPU Computing SDK代码集,也是一个很好的学习资源。
CUDA程序可以分为两部分:GPU执行的代码和CPU执行的代码,两者可以互不干扰,可以通过cudaMemcpy()函数把GPU的相应内存块复制到主存的相应位置,或者相反过程,实现GPU和CPU的数据交互。CPU的内存叫做主存,GPU的里面也有内存,可以叫他设备内存。
由于GPU是为图形设计的,具有强大的3维渲染等技术,所以对于多维数组的计算是有强大的能力的。
GPU可以像CPU一样进行计算工作,同样具备多线程,并且线程还是多维线程,计算能力超强,而且可以与CPU的计算一起相互协作,从而实现多核CPU计算的效果。
一个简单的传递参数给GPU计算的代码:
#include
#include "../common/book.h"
__global__ void add(int a,int b,int *c)//__global__声明的函数,告诉编译器这段代码交由GPU执行
{
*c=a+b;
}
int main(void)
{
int c;
int *dev_c;
HANDLE_ERROR(cudaMalloc( (void**)&dev_c,sizeof(int) ) );//cudaMalloc()函数让GPU分配内存给某个指针
add<<<1,1>>>(2, 7, dev_c);//让GPU启动一个线程来运行add()函数,函数的变量必须是保持在GPU上的
HANDLE_ERROR(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost) );//将GPU的某块内存复制回CPU
printf("2 + 7 = %d\n",c);
cudaFree(dev_c);//释放GPU内存
return 0 ;
};
HANDLE_ERROR()是我们定义的宏。判断是否返回了一个错误值。
一定不能在主机代码中对设备指针进行解引用,主机代码可以将这个指针作为参数传递,对其执行算术运算,甚至可以将其转换为另外一种不同的类型,但是绝对不能使用这个指针来读取或者写入内存。
设备指针的使用限制:
1,可以将cudaMalloc()分配的指针传递给在设备上执行的函数。
2,可以将设备代码中使用cudaMalloc()分配的指针进行内存读、写操作。
3,可以将cudaMalloc()分配的指针传递给在主机上执行的函数。
4,不能在主机代码中使用cudaMalloc()分配的指针进行内存读、写操作。