欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CUDA学习笔记(1)- Hello CUDA

程序员文章站 2024-02-27 12:32:09
...


1. Hello CUDA

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