CUDA学习笔记(1)- Hello CUDA

文章目录

  • 1. Hello CUDA
  • 2. CUDA的内存操作


1. Hello CUDA

CUDA的安装网上的教程有很多,这里就不做介绍了。CUDA使用C语言的语法,扩展了一些关键字,下面我们使用CUDA编写第一个程序Hello CUDA
这里使用VS 2015新建一个CUDA的项目,在新建项目中,选择CUDA,如下图显示:
CUDA学习笔记(1)- Hello CUDA_第1张图片

程序代码如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include 

__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;
}

你可能感兴趣的:(CUDA)