当前位置: 首页 > news >正文

CUDA学习第三天:Kernel+grid+block关系

1. 理一理前两天学到的概念之间的关系

  • CUDA && GPU

    CUDA: NIVID的CPUs上的一个通用并行计算平台和编程模型;
    GPU: CPU+GPU的异构计算架构,CPU所在位置为主机端(host), 而GPU所在位置为设备端(device).

  • SP && SM

    SP: 最基本的处理单元,streaming processor,也称为CUDA core。最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。

    SM: 多个SP加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。
    在这里插入图片描述

    SP是线程执行的硬件单位,SM中包含多个SP,一个GPU可以有多个SM(比如16个),最终一个GPU可能包含有上千个SP

  • Host && Device

    Host与Device的内存交互模型:
    在这里插入图片描述

    明确Host与Device分别位于什么位置:
    在这里插入图片描述

2. Kernel与网格(grid)与线程块(block)与线程(Thread)

在实际编写CUDA程序时,我们需要设计block等的大小,也就是合理安排线程的数量。

3. CUDA实例程序二

  • 程序文件结构

    sample_01_plus.cu (cpp文件无法运行)

  • CMakeLists添加执行文件

    cuda_add_executable(sample_01 src/sample_01_plus.cu)

  • 程序源代码

		#include <iostream>
		#include <cuda.h>
		#include <cuda_runtime.h>
		#include <cuda_runtime_api.h>
		#include <device_launch_parameters.h>

		__global__ void addCuda(float* x, float* y, float* z, int n)
		{
			int index = threadIdx.x+blockIdx.x*blockDim.x;
	
			int stride =  blockDim.x*gridDim.x;
	
			for(int i=index; i<n; i+=stride)
			{
				z[i] = x[i] + y[i];
			}
		}

		int main()
		{
			int N =20;
	
			int nBytes = N*sizeof(float);
	
			float *x, *y, *z;
		/**********************************************
		 *  在device上分配内存函数:
		 * 
		 *  cudaError_t cudaMalloc(void** devPtr, size_t size);
		 * 
		 * 	devPtr: 指向所分配内存的指针,
		 * 
		 * *****************************************************************/
	
			x = (float*)malloc(nBytes);
			y = (float*)malloc(nBytes);
			z = (float*)malloc(nBytes);
	
			for(int i=0; i<N; i++)
			{
				x[i] = 10.0;
				y[i] = 20.0;
			}
	
			float *dx, *dy, *dz;
		/**********************************************
		 *  负责host与device之间数据通讯的cudaMemcpy函数:
		 * 
		 *  cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)
		 * 
		 * 	其中src指向数据源,而dst是目标区域,count是复制的字节数,其中kind控制复制的方向:
		 * 
		 * 	cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice.
		 * 	如cudaMemcpyHostToDevice将host上数据拷贝到device上
		 * 
		 * *****************************************************************/
	
			cudaMalloc((void**)&dx, nBytes);
			cudaMalloc((void**)&dy, nBytes);
			cudaMalloc((void**)&dz, nBytes);
	
			// x-y为原始数据, 将其复制到gpu上计算;
	
			cudaMemcpy((void*)dx, (void*)x, nBytes, cudaMemcpyHostToDevice);
			cudaMemcpy((void*)dy, (void*)y, nBytes, cudaMemcpyHostToDevice);
	
			dim3 blockSize(256);
			dim3 gridsize((N + blockSize.x - 1) / blockSize.x);
	
			// 在gpu上计算的结果保存在dz上;
			addCuda<<<gridsize, blockSize>>>(dx, dy, dz, N);
	
			// dz为得到的结果,将其复制出来放到z上, 然后检测z与实际值的差距。
	
			cudaMemcpy((void*)z, (void*)dz, nBytes, cudaMemcpyDeviceToHost);
	
			float maxError = 0.0;
		    for (int i = 0; i < N; i++)
			maxError = fmax(maxError, fabs(z[i] - 30.0));
		    std::cout << "最大误差: " << maxError << std::endl;
	
	
			cudaFree(dx);
			cudaFree(dy);
			cudaFree(dz);
	
			free(x);
			free(y);
			free(z);
	
			return 0;
		}

相关文章:

  • DAVIS第五课: 基于事件相机的一种几何实时3DSLAM算法
  • ubuntu学习技巧1:容易混淆但又重要的命令
  • RGB颜色空间对应的不同颜色列表
  • V-SLAM重读(1): SVO: Fast Semi-Direct Monocular Visual Odometry
  • C++11回顾学习(4): 语法解析之虚函数与继承
  • ROS回顾学习(10): 项目研究中遇到问题记录2
  • ROS深入学习(1): ROS程序简单调试方式
  • C++ 11回顾学习(5): STL中的vector - map - pair对比
  • V-SLAM重读(2): DSO: Direct Sparse Odometry (DSO)
  • VLP-16第一课: Velodyne的工作原理和驱动安装
  • ubuntu技巧学习3: 将视频转换为gif动态图
  • V-SLAM重读(3):SVO代码阅读和调试修改
  • VLP-16第二课: 学习论文LeGo-LOAM: 基于地面优化的轻量级雷达里程计和地图构建
  • 数据结构与算法第一节:数据结构与算法的关系
  • 数据结构与算法第二节:衡量算法的执行效率(时间、空间复杂度分析)
  • ----------
  • [NodeJS] 关于Buffer
  • IDEA 插件开发入门教程
  • Java 多线程编程之:notify 和 wait 用法
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux下的乱码问题
  • Mocha测试初探
  • Mysql数据库的条件查询语句
  • passportjs 源码分析
  • 浮动相关
  • 基于遗传算法的优化问题求解
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 一些css基础学习笔记
  • 正则表达式小结
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ###C语言程序设计-----C语言学习(3)#
  • #define用法
  • %@ page import=%的用法
  • (0)Nginx 功能特性
  • (20050108)又读《平凡的世界》
  • (二)hibernate配置管理
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (篇九)MySQL常用内置函数
  • (一)基于IDEA的JAVA基础1
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)原始图像数据和PDF中的图像数据
  • **CI中自动类加载的用法总结
  • .chm格式文件如何阅读
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net 代码性能 - (1)
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /bin/rm: 参数列表过长"的解决办法
  • /boot 内存空间不够