笔记02:CUDA编程模型

news2024/9/21 10:52:30

CUDA是一种通用的并行计算平台和编程模型,是在C语言基础上扩展的。

一、CUDA编程模型概述

1. CUDA编程结构

在一个异构环境中包含多个CPU和GPU,每个GPU和CPU的内存都由一条PCI-e总线分隔开,需要注意区分

(1)主机:CPU及其内存(主机内存)

(2)设备:GPU及其内存(设备内存)

从CUDA6.0开始,NVIDIA提出了名为“统一寻址”的编程模型的改进,连接了主机内存和设备内存空间,可使用单个指针访问CPU和GPU内存,无须彼此之间手动拷贝数据。重要的是如何为主机和设备分配内存空间以及如何在CPU和GPU之间拷贝共享数据。

内核(kernel)是CUDA编程模型的一个重要组成部分,其代码在GPU上运行。

多数情况下,主机可以独立地对设备进行操作。内核一旦被启动,管理权立刻返回给主机,释放CPU来执行由设备上运行的并行代码实现的额外的任务。

CUDA编程模型主要是异步的,因此在GPU上进行的运算可以与主机-设备通信重叠。一个典型的CUDA程序包括由并行代码互补的串行代码。串行代码在主机CPU上执行,而并行代码在GPU上执行。主机代码按照ANSI C标准进行编写,而设备代码使用CUDA C进行编程。可以将所有的代码统一放在一个源文件中,也可以使用多个源文件来构建应用程序和库。NVIDIA的C编译器(nvcc)为主机和设备生成可执行代码。

 一个典型的CUDA程序实现流程遵循以下模式:

(1)把数据从CPU内存拷贝到GPU内存

(2)调用核函数对存储在GPU内存中的数据进行操作

(3)将数据从GPU内存传送回到CPU内存

2. 内存管理

CUDA编程模型假设系统是由一个主机和一个设备组成的,并且各自拥有独立的内存。核函数是在设备上运行的。为了拥有充分的控制权并使系统达到最佳性能,CUDA运行时负责分配与释放设备内存,并且在主机内存和设备内存之间传输数据。

cudaError_t cudaMalloc(void** devPtr, size_t size)

 该函数负责向设备分配一定字节的线性内存,并以devPtr的形式返回指向所分配内存的指针。cudaMalloc与标准C语言中的malloc函数几乎一样,只是此函数在GPU的内存里分配内存。

cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)

 此函数负责主机和设备之间的数据传输,从src指向的源存储区复制一定数量的字节到dst指向的目标存储区。复制方向由kind指定。

3. 线程管理

 当核函数在主机端启动时,它的执行会移动到设备上,此时设备中会产生大量的线程并且每个线程都执行由核函数指定的语句。了解如何组织线程是CUDA编程的一个关键部分。

由一个内核启动所产生的所有线程统称为一个网格。同一个网格中的所有线程共享相同的全局内存空间。一个网格由多个线程块构成,一个线程块包含一组线程,同一线程块内的线程协作可以通过以下方式来实现:(1)同步;(2)共享内存。不同块内的线程不能协作。

线程依靠以下两个坐标变量来区分彼此:

blockIdx(线程块在线程格内的索引)

threadIdx(块内的线程索引)

以上变量是核函数中需要初始化的内置变量。当执行一个核函数时,CUDA运行时为每个线程分配坐标变量blockIdx和threadIdx。基于这些坐标,可以将部分数据分配给不同的线程。

CUDA可以组织三维的网格和块,网格和块的维度由下列两个内置变量指定:

(1)blockDim(线程块的维度,用每个线程块中的线程数来表示)

(2)gridDim(线程格的维度,用每个线程格中的线程数来表示)

它们是dim3类型的变量,是基于uint3定义的整数型向量,用来表示维度。

当定义一个dim3类型的变量时,所有未指定的元素都被初始化为1。

dim3类型变量中的每个组件可以通过它的x、y、z字段获得。

 

#include <stdio.h>


__global__ void checkIndex(void)
{
        printf("threadIdx: (%d, %d, %d); "
                "blockIdx:  (%d, %d, %d); "
                "blockDim:  (%d, %d, %d); "
                "gridDim:   (%d, %d, %d)\n",
                threadIdx.x, threadIdx.y, threadIdx.z,
                blockIdx.x, blockIdx.y, blockIdx.z,
                blockDim.x, blockDim.y, blockDim.z,
                gridDim.x, gridDim.y, gridDim.z);
}


int main(void)
{
        int nElem = 6;
        dim3 block(3);
        dim3 grid((nElem+block.x-1)/block.x);

        printf("block: %d, %d, %d\n", block.x, block.y, block.z);
        printf("grid: %d, %d, %d\n", grid.x, grid.y, grid.z);

        checkIndex<<<grid, block>>>();

        cudaDeviceReset();

        return 0;
}

 

 对于一个给定的数据大小,确定网格和块尺寸的一般步骤为:

(1)确定块的大小

(2)在已知数据大小和块大小的基础上计算网格维度

要确定块尺寸,通常需要考虑:(1)内核性能特性;(2)GPU资源的限制

4. CUDA内核函数 

kernel_name <<<grid, block>>> (argument list);

 

核函数的调用与主机线程是异步的。核函数调用结束后,控制权立刻返回给主机端。可以调用以下函数强制主机端程序等待所有的核函数执行结束。

cudaError_t cudaDeviceSynchronize(void);

 

核函数的相关限制:

(1)只能访问设备内存

(2)必须具有void返回类型

(3)不支持可变数量的参数

(4)不支持静态变量

(5)显示异步行为

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湖仓一体概念快问快答

概念篇 问题一 “湖仓一体”是什么&#xff1f; “湖仓一体”是一种新的架构模式&#xff0c;湖仓一体是将数据湖的灵活性和数仓的易用性、规范性、高性能结合起来的融合架构&#xff0c;无数据孤岛。湖仓一体数据存储在数据湖低成本的存储架构之上&am…

蓝桥云课ROS机器人旧版实验报告-07外设

项目名称 实验七 ROS[Kinetic/Melodic/Noetic]外设 成绩 内容&#xff1a;使用游戏手柄、使用RGBD传感器&#xff0c;ROS[Kinetic/Melodic/Noetic]摄像头驱动、ROS[Kinetic/Melodic/Noetic]与OpenCV库、标定摄像头、视觉里程计&#xff0c;点云库、可视化点云、滤波和缩…

嵌入式系统工程师怎样才能不落伍

不断增加的复杂性和异质化正在衍生出一些新的方法&#xff0c;能够避免在设计周期结束时出现意外。 在一个系统中&#xff0c;硬件的表现是否优秀取决于运行在其上的软件。随着系统复杂性的增加&#xff0c;总是软件在拖后腿。 缩小硬件和软件差距的方法是不断改进软件开发的方…

【Java】多医院、多诊所、多机构SaaS模式云HIS信息管理系统源码

云HIS&#xff0c;一款基于云计算和大数据技术的智慧医院云平台&#xff0c;为医疗机构提供了一种全新的信息化解决方案&#xff0c;旨在实现数据安全、用户满意度和成本效益的最佳平衡。 基于云计算技术的B/S架构的HIS系统&#xff0c;为基层医疗机构提供标准化的、信息化的、…

攻击数亿个账户,黑客利用OAuth2.0疯狂作恶

一、OAuth协议介绍 OAuth是一种标准授权协议&#xff0c;它允许用户在不需要向第三方网站或应用提供密码的情况下向第三方网站或应用授予对存储于其他网站或应用上的信息的 委托访问 权限。OAuth通过访问令牌来实现这一功能。 1.发展历史 OAuth协议始于2006年Twitter公司Ope…

Python爬虫遇到URL错误解决办法大全

在进行Python爬虫任务时&#xff0c;遇到URL错误是常见的问题之一。一个错误的URL链接可能导致爬虫无法访问所需的网页或资源。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决方法&#xff0c;并给出相关代码示例&#xff0c;希望对您的爬虫任务有所帮助。 一、…

mysql进阶-触发器

在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如 商品信息 和 库存信息 分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时 在库存表中…

牛客网Verilog刷题——VL41

牛客网Verilog刷题——VL41 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器&#xff0c;比如说8.7分频的时钟信号&#xff0c;注意rst为低电平复位。提示&#xff1a;其实本质上是一个简单的数学问题&#xff0c;即如何使用最小公倍数得到时钟周期的分别频比。设小…

23种设计模式详解与示例代码(详解附DEMO)

设计模式在Java中的应用与实现 &#x1f680;&#x1f680;&#x1f680;1.创建型模式1. 工厂方法模式&#xff08;Factory Pattern&#xff09;2.抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;3. 单例模式&#xff08;Singleton Pattern&#xff09;4.原型模…

Bug解决:ModuleNotFoundError: No module named ‘taming‘

from taming.modules.vqvae.quantize import VectorQuantizer2 as VectorQuantizer ModuleNotFoundError: No module named taming 在安装 taming-transformers时&#xff0c;出现了以下两个报错&#xff1a; 报错一&#xff1a; from taming.modules.vqvae.quantize import V…

使用langchain与你自己的数据对话(四):问答(question answering)

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客&#xff0c;还没有阅读这三篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入使用langc…

2023CRM如何选型?有哪些特点需要注意?

企业管理中客户关系管理系统被认为是至关重要的一环。随着市场竞争加剧和科技不断发展&#xff0c;企业面临着各种选择&#xff0c;如何选择适合自己的CRM系统变得非常重要。本文将为您介绍2023CRM选型最新指南。 首先&#xff0c;应该了解CRM系统的分类&#xff0c;根据自己的…

LeetCode每日一题——1331.数组序号转换

题目传送门 题目描述 给你一个整数数组 arr &#xff0c;请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下&#xff1a; 序号从 1 开始编号。一个元素越大&#xff0c;那么序号越大。如果两个元素相等&#xff0c;那么它们的…

【Python机器学习】实验07 K-means无监督聚类

文章目录 聚类K-means 聚类1 准备数据2 给定聚类中心&#xff0c;计算每个点属于哪个聚类&#xff0c;定义函数实现3 根据已有的数据的标记&#xff0c;来重新更新聚类中心&#xff0c;定义相应的函数4 初始化聚类中心&#xff0c;定义相应的函数5 定义K-means算法6 绘制各个聚…

windwos server 2008 更新环境,且vs_redis 安装失败

KB2919442 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 KB2919355 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 安装步骤:先安装442,后安装355

C++ 对象的生存期

对象&#xff08;包括简单变量&#xff09;都有诞生和消失的时刻。对象诞生到结束的这段时间就是它的生存期。在生存期内&#xff0c;对象将保持它的状态&#xff08;即数据成员的值&#xff09;&#xff0c;变量也将保持它的值不变&#xff0c;直到它们被更新为止。对象的生存…

windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本

目录 一、anaconda安装及虚拟环境创建 1.anaconda的下载 2.Anaconda的安装 3.创建虚拟环境 3.1 环境启动 3.2 切换镜像源 3.3环境创建 3.4 激活环境 3.5删除环境 二、pycharm安装 1.pycharm下载 2.pycharm的安装 三、CUDA的安装 1.GPU版本和CUDA版本、cudnn版本、显卡…

布瑞特单圈绝对值旋转编码器串口数据读取

布瑞特单圈绝对值旋转编码器串口数据读取 数据手册&#xff1a;http://briter.net/col.jsp?id109 (2.1版本RS485说明书通信协议 单圈.pdf) 绝对式编码器为布瑞特BRT38-ROM16384-RT1&#xff0c;采用RS485通信。 该绝对式编码器共有5根线&#xff1a;红、黄、黑、绿、白 由…

解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

计算机网络期末复习要点(谢希仁第8版)抱佛脚通用

熬夜苦肝4天&#xff0c;拿下&#xff01; 课本是谢希仁的计算机网络&#xff0c;第8版。 本文原创&#xff01;禁止转载。 复习建议&#xff1a;本博客不一定能涵盖你们考试的重点&#xff0c;所以不是走到穷途末路的同学还是应该多多回归课本&#xff0c;课本每章后面都有…