cuda编程入门-HelloWorld

为了提高并行运算速度,开始接触cuda编程,cuda 在安装的时候提供了很多示例,一般位于Home目录下,可以作为学习的参考,同时官网提供的入门教程,就是很好的学习资料。

cuda编程首先要转换与cpu 下编程的思想,在cpu 下,我们一般都是按照顺序进行执行,或者开几个线程处理几个任务,而在gpu 下,是分block 和 thread的,gpu由多个block(x,y ,z )组成,每个block 下由多了thread组成,都是根据ID进行区分操作,这样可以把一个任务拆分成很多个线程去执行。

作为学习,我新建了cuda 文件项目,cmake 进行文件管理,目录结构如下:在这里插入图片描述
入门的项目为helloWorld,主程序在main.cu中

本例子对两个整数求和。

最外层的CMakeLists.txt 管理用到的包和头文件

project("cuda")
cmake_minimum_required(VERSION 2.8)

# 查找cuda 文件
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})


#add_subdirectory(addVector)
add_subdirectory(helloWorld)

helloWorld 文件中的CMakeLists.txt

project(helloWorld)


cuda_add_executable(helloWorld main.cu)

main.cu 中的代码:


#include <stdio.h>
// CUDA runtime
#include <cuda_runtime.h>

// __global__ 声明 gpu 线程调用

__global__ void sum(int *a, int *b, int *c ){
    
    c[0] = a[0] + b[0];
}


int main(int argc, char **argv)
{

    
    // 声明 Host 变量
    int a[1]={1},b[1] ={2},c[1]={0};
    
    // 声明 device 变量
    int *gpu_a, *gpu_b, *gpu_c;
    
    // 开辟空间
    cudaMalloc((void **)&gpu_a, sizeof(int));
    cudaMalloc((void **)&gpu_b, sizeof(int));
    cudaMalloc((void **)&gpu_c, sizeof(int));
    
    // 讲Host 数据上载到gpu上
    cudaMemcpy(gpu_a, a, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(gpu_b, b, sizeof(int), cudaMemcpyHostToDevice);
    
    // 执行
    sum<<<1, 1>>>(gpu_a, gpu_b, gpu_c);
    
    // 将执行结果 下载到Host 变量 c中
    cudaMemcpy(c, gpu_c, sizeof(int), cudaMemcpyDeviceToHost);
    
    // 释放空间
    cudaFree(gpu_a);
    cudaFree(gpu_b);
    cudaFree(gpu_c);
    
    // 打印
    printf(" %d + %d = %d \n", a[0], b[0], c[0]);
    

    return 0;
}

最后 CMake Make 运行结果:
在这里插入图片描述

发布了24 篇原创文章 · 获赞 4 · 访问量 8294

猜你喜欢

转载自blog.csdn.net/zhaitianyong/article/details/103012476