目录
3--cudaMalloc()和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);