1. Hello CUDA
CUDA的安装网上的教程有很多,这里就不做介绍了。CUDA使用C语言的语法,扩展了一些关键字,下面我们使用CUDA编写第一个程序Hello CUDA。
这里使用VS 2015新建一个CUDA的项目,在新建项目中,选择CUDA,如下图显示:
程序代码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void test(void)
{
printf("Hello CUDA!\n");
}
int main()
{
test <<<1, 1 >>> ();
cudaThreadSynchronize();
return 0;
}
- __global__: 是CUDA的关键字,表示代码代码在设备端(GPU端)执行,可以在CPU端被调用。
- test <<<1, 1 >>> (); 为函数调用,<<<>>>中的第一个参数1表示块的个数,第二个参数1表示每个线程块中线程的个数。这里是使用一个线程块,这个线程块中只有一个线程执行这个函数。
- cudaThreadSynchronize(): 这个函数会等待设备端的线程执行完成。
- 一个线程块中可以有多个线程,GPU中的线程是GPU的最小操作单元。
2. CUDA的内存操作
CUDA中有类似C语言的内存操作的相关函数:
- cudaMalloc(void **devPtr, size_t size) ,在GPU中申请一块内存,devPtr是这块内存的指针,size是内存的大小。
- cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind) ,内存拷贝,dst表示目标内存的地址,src为源内存的地址,count为拷贝的内存的大小,kind 为内存拷贝的方向,可以为设备到主机、主机到设备等。
- cudaFree(void *devPtr) 释放使用cudaMalloc申请的内存。
使用CUDA编写GPU上的函数时,一定要先申请GPU内存然后才能操作,下面是一个使用GPU进行简单计算的例子,计算两个数的和:
__global__ void add(int a, int b, int* c)
{
*c = a + b;
}
int main()
{
int *pData = nullptr;
// 申请GPU可操作的内存
cudaMalloc(&pData, sizeof(int));
// 调用计算函数
add <<<1, 1 >>> (20, 20, pData);
cudaThreadSynchronize();
// 获取GPU计算的结果
int result = 0;
cudaMemcpy(&result, pData, sizeof(int), cudaMemcpyDeviceToHost);
// 打印并释放内存
printf("The Result is : %d\n", result);
cudaFree(pData);
return 0;
}