CUDA学习笔记(1)- Hello CUDA

原创

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;
}
不会飞的纸飞机
扫一扫二维码,了解我的更多动态。

下一篇文章:CUDA学习笔记(2)- 线程并行和块并行