- 环境配置:
安装完cuda之后,查看cuda编译器nvcc能否能够正常工作。
- 第一个Helloworld
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void kernel(void) {
}
int main() {
kernel <<<1, 1>>> ();
// <<<1,1>>>代表一个kernel的grid中只有1个block,每个block中有1个thread。
printf("Hello world!\n");
return 0;
}
<<< >>> 为内核函数的执行参数,用于说明内核函数中的线程数量,以及线程是如何组织的。
将上面的代码保存为一个cu文件,比如hello_world.cu, 然后编译该文件
#编译
nvcc hello_world.cu -o hello_cuda
#运行
hello_cuda
这样看,cuda程序的helloworld还是挺简单的。
- cuda计算程序
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void add(const int a, const int b, int *c)
{
*c = a + b;
}
int main()
{
int c;
int *dev_c; // 定义在设备端的接收数据的指针
cudaError_t cudaStatus;
//为输入参数和输出参数分配内存
cudaStatus = cudaMalloc((void**)&dev_c, sizeof(int));
if (cudaStatus != cudaSuccess) {
printf("cudaMalloc is failed!\n");
}
add<<<1, 1 >>>(2, 7, dev_c);
cudaStatus = cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
printf(" cudaMemcpyDeviceToHost is failed!\n");
}
cudaFree(dev_c);
printf("2+7=%d\n", c);
return 0;
}
add是真正在GPU上run的函数,程序刚开始在GPU memory中分配dev_c,将a+b的计算结果保存在GPU memory中,然后再将dev_c中的值copy到HOST端的c中,这样便可以print出来了。看程序还是很好理解的。
特别要注意的是,不能直接print dev_c,给dev_c分配了GPU memory空间,程序结束时,也要释放对应的GPU memory.