CUDA By Example笔记--CUDA编程基本概念、cudaMalloc()和cudaMemcpy()的用法

目录

1--基本概念

2--第一个程序

3--cudaMalloc()和cudaMemcpy()的用法

3-1--cudaMalloc()的用法:

3-2--cudaMemcpy()的用法


1--基本概念

① 主机(Host):将 CPU 和系统的内存称为主机(Host);

② 设备(Device):将 GPU 及其内存称为设备(Device);

③ 核函数(Kernel):在 GPU 设备上执行的函数称为核函数(Kernel);

2--第一个程序

        程序参考《CUDA By Example》,需要说明的是:博主基于 linux 系统实现以下程序,"cuda.h" 和 "cuda_runtime.h" 在安装好 CUDA 后即可直接引用,相应的头文件路径为 “/usr/local/cuda-11.3/targets/x86_64-linux/include”;

// file:test.cu

#include <iostream>
#include "cuda.h"
#include "cuda_runtime.h"

// From book.h
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}

__global__ void add(int a, int b, int *c){
    *c = a + b;
}

int main(void){
    int c;
    int *dev_c;
    HANDLE_ERROR(cudaMalloc((void**)&dev_c, sizeof(int)));
    add<<<1,1>>>(2, 7, dev_c);
    HANDLE_ERROR(cudaMemcpy(
        &c,
        dev_c,
        sizeof(int),
        cudaMemcpyDeviceToHost));
    
    printf("2 + 7 = %d\n", c);
    cudaFree(dev_c);
    return 0;
}

        CMakeLists.txt编写:

cmake_minimum_required(VERSION 3.14)

project(Test1 LANGUAGES CUDA) # 添加支持CUDA语言

add_executable(main test.cu)

        编译执行:

mkdir build && cd build

cmake ..

make

./main

        程序分析:

__global__ 修饰符表示该函数应在设备上运行;

<<<1, 1>>> 表示将参数传递给系统,告知该如何运行设备函数;第一个参数表示设备在执行核函数时,使用的并行线程块数量;第二个参数表示每个线程块创建的线程数量;

3--cudaMalloc()和cudaMemcpy()的用法

3-1--cudaMalloc()的用法:

        类似于 C 语言当中的 malloc() 函数,cudaMalloc() 用于在设备中申请内存,其基本用法如下:

cudaMalloc((void**)&dev_c, sizeof(int))

第一个参数表示一个指针,用于指向保存新分配内存地址的变量;

第二个参数表示分配内存的大小;

        注意事项:

① 可以将 cudaMalloc() 分配的指针传递给设备上执行的函数;

② 可以在设备代码中使用 cudaMalloc() 分配的指针进行内存读/写操作;

③ 可以将 cudaMalloc() 分配的指针传递给在主机上执行的函数;

④ 不能在主机代码中使用 cudaMalloc() 分配的指针进行内存读/写操作;

⑤ 需要调用 cudaFree() 释放由 cudaMalloc() 分配的内存;

3-2--cudaMemcpy()的用法

        cudaMemcpy() 用于在主机和设备间传递数据,其基本用法如下:其中,dst_c 表示目的指针,src_c 表示源指针;

// 设备到主机
cudaMemcpy(dst_c, src_c, size, cudaMemcpyDeviceToHost);

// 主机到设备
cudaMemcpy(dst_c, src_c, size, cudaMemcpyHostToDevice);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值