嘉峪关建设局公告网站,建高级网站,国际国内时事,九江市建筑公司1. 引言
前序博客#xff1a;
CUDA简介——基本概念
CPU是用于控制的。即#xff0c;host控制整个程序流程#xff1a;
1#xff09;程序以Host代码main函数开始#xff0c;然后顺序执行。 Host代码是顺序执行的#xff0c;并执行在CPU之上。Host代码会负责Launch ke…1. 引言
前序博客
CUDA简介——基本概念
CPU是用于控制的。即host控制整个程序流程
1程序以Host代码main函数开始然后顺序执行。 Host代码是顺序执行的并执行在CPU之上。Host代码会负责Launch kernel。 2对于想转移给CPU执行的代码称为Device代码通过Launch kernel来实现 Device代码是并行执行的并执行在GPU之上。kernel做为a grid运行在Device端。Device端程序会立即返回给Host。即除非明确要求Host并不会等待Device执行完成后才再执行后续Host代码。【因此如需收集特定kernel launch Device程序的执行结果需在host代码中创建明确的barrier让main c函数等待kernel执行完成再继续执行后续代码。】 launch kernel时的语法规则为
与常规C函数调用类似需指定配置参数grid_size和block_size二者均为dim3 CUDA数据结构默认均为(1,1,1)。
launch kernel示例如
从Host角度来看实际更详细的程序流为
1程序以Host代码main函数开始然后顺序执行。 Host代码是顺序执行的并执行在CPU之上。为kernel launch做准备【Host和Device内存是独立的】Host与Device之间的数据拷贝至关重要且是程序性能主要限制因素。 分配Device内存cudaMalloc(...)。将Host上数据拷贝到Device上cudaMemcpy(...)即将数据由CPU拷贝到GPU之上。 Host代码会负责Launch kernel在GPU上并行执行Threads。为获取kernel执行结果需将Device数据拷贝到Host上cudaMemcpy(...)。 其中Device内存管理 与C中内存管理类似C中内存分配用malloc(...)内存释放用free(...)。 CUDA Device内存管理为 内存分配用cudaMalloc(LOCATION, SIZE) LOCATIONDevice上分配内存的内存位置为某GPU内存地址。size为分配的字节数。 内存释放用cudaFree()。
Device和Host之间数据拷贝
使用cudaMemcpy(dst, src, numBytes, direction) dst拷贝目标地址src拷贝源地址numBytes拷贝字节数。numBytes N*sizeof(type)direction拷贝方向。 cudaMemcpyHostToDevice由Host拷贝数据到Device。cudaMemcpyDeviceToHost由Device拷贝数据到Host。
总体的完整流程为
1以main()函数起始2定义变量通常以h_来表示Host端变量以d_来表示Device端变量。若在Host端引用了device变量则程序将崩溃反之亦然。 3分配device内存使用cudaMalloc(...)。 4将host数据拷贝到device使用cudaMemcpy(...)。【此时假设h_c为已做数据初始化】 5设置kernel launch配置参数grid_size和block_size。【下图中均为默认值(1,1,1)】 6Launch kernel 7将device执行结果拷贝回host使用cudaMemcpy(...)。 8释放device和host内存分别使用cudaFree(...)和free(...)。 9结束main()函数执行。
参考资料
[1] 2019年5月视频 Intro to CUDA (part 2): Programming Model