CUDA动态并行

一、简介

1. 综述

动态并行是 CUDA 编程模型的扩展,使 CUDA 内核能够直接在 GPU 上创建新工作并与其同步。 在程序中任何需要的地方动态创建并行性都提供了令人兴奋的功能。

直接从 GPU 创建工作的能力可以减少在主机和设备之间传输执行控制和数据的需要,因为现在可以由在设备上执行的线程在运行时做出启动配置决策。 此外,可以在运行时在内核内内联生成依赖于数据的并行工作,动态利用 GPU 的硬件调度程序和负载平衡器,并根据数据驱动的决策或工作负载进行调整。 以前需要修改以消除递归、不规则循环结构或其他不适合平面、单级并行性的构造的算法和编程模式可以更透明地表达。

本文档描述了支持动态并行性的 CUDA 扩展功能,包括利用这些功能所需的对 CUDA 编程模型的修改和添加,以及利用这种附加功能的指南和最佳实践。

动态并行仅受计算能力 3.5 及更高版本的设备支持。

2. 术语

网格

网格是线程的集合,网格中的线程执行内核函数并被划分为线程块。

线程块

线程块是在同一多处理器 (SM) 上执行的一组线程,线程块中的线程可以访问共享内存并且可以显式同步。

内核函数

内核函数是一个隐式并行子例程,它在 CUDA 执行和内存模型下为网格中的每个线程执行。

主机

主机是指最初调用CUDA的执行环境,通常是在系统的 CPU 处理器上运行的线程。

父线程、线程块或网格是启动新网格(子网格)的线程。 在所有启动的子网格也完成之前,父网格才被视为完成。

子线程、块或网格是由父网格启动的线程、块或网格。 子网格必须在父线程、线程块或网格被视为完成之前完成。

线程块作用域

具有线程块作用域的对象具有单个线程块的生命周期。 它们仅在由创建对象的线程块中的线程操作时具有定义的行为,并在创建它们的线程块完成时被销毁。

设备运行时

设备运行时是指可用于使内核函数使用动态并行性的运行时系统和 API。

二、执行环境和内存模型

1. 执行环境

CUDA 执行模型基于线程、线程块和网格的原语,其中内核函数定义由线程块和网格内的各个线程执行的程序。 当调用内核函数时,网格的属性由执行配置描述,该执行配置在 CUDA 中具有特殊语法。 CUDA 中对动态并行性的支持扩展了在新网格上配置、启动和隐式同步到设备上运行的线程的能力。

(1)父网格和子网格

配置和启动新网格的设备线程属于父网格,被调用创建的网格是子网格。

父网格在其线程创建的所有子网格全部都完成之后才被视为完成,并且运行时保证父网格和子网格之间的隐式同步。

(2)CUDA原语范围

在主机和设备上,CUDA 运行时都提供了一个 API,用于启动内核并通过流和事件跟踪启动之间的依赖关系。 在主机系统上,启动状态以及引用流和事件的 CUDA 原语由进程内的所有线程共享; 然而进程独立执行并且不能共享 CUDA 对象。

在设备上,启动的内核和 CUDA 对象对网格中的所有线程都是可见的。 例如,这意味着流可以由一个线程创建并由网格中的任何其他线程使用。

(3)同步

CUDA 11.6 中已弃用与父块中的子内核显式同步(即在设备代码中使用 cudaDeviceSynchronize()),并在compute_90+ 编译中删除。 对于计算能力 < 9.0,需要通过指定 -DCUDA_FORCE_CDP1_IF_SUPPORTED 进行编译时选择,才能继续在设备代码中使用 cudaDeviceSynchronize()。 请注意,这预计会在未来的 CUDA 版本中完全删除。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍&#xff0c;想为自己的照片添加一个酷炫的火星飞舞的效果&#xff0c;素材库中正好有一张火焰的照片&#xff0c;如果想去除图中的火焰&#xff0c;只保留火星效果&#xff0c;可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

C++第四天

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

算法训练day02Leetcode977有序数组平方209长度最小的字数组59螺旋问题

今日学习的文章链接和视频链接 https://www.bilibili.com/video/BV1QB4y1D7ep/?vd_source8272bd48fee17396a4a1746c256ab0ae https://www.bilibili.com/video/BV1tZ4y1q7XE/?vd_source8272bd48fee17396a4a1746c256ab0ae https://programmercarl.com/0059.%E8%9E%BA%E6%97%…

HttpRunner自动化之响应中文乱码处理

响应中文乱码&#xff1a; 当调用接口&#xff0c;响应正文返回的中文是乱码时&#xff0c;一般是响应正文的编码格式不为 utf-8 导致&#xff0c;此时需要根据实际的编码格式处理 示例&#xff1a; 图1中 extract 提取title标题&#xff0c;output 输出 title 变量值&#x…

Proxy 与 defineProperty 的理解、区别、优势、劣势

一、Object.defineProperty() 文档&#xff1a;Object.defineProperty() - JavaScript | MDN 作用&#xff1a;对一个对象进行操作的方法。可以为一个对象增加一个属性&#xff0c;同时也可以对一个属性进行修改和删除。 它是在 ES5 中引入的&#xff0c;使用了 getter 和 s…

OV8856 帧同步功能说明分享

OV8856支持帧同步功能&#xff0c;用于同步两个传感器的输出时序。同步是通过配置OV8856的一个(从设备)FSIN作为输入引脚来接受另一个主传感器设备(也可能是另一个OV8856) VSYNC作为触发信号来实现的。 1.OV8856有专用的GPIO引脚(FSIN)用于帧同步功能。 该引脚可配置为接收外…

[计算机提升] Windows系统软件:管理类

3.6 系统软件&#xff1a;管理类 3.6.1 运行 通过运行程序&#xff0c;在打开输入框中输入名称&#xff0c;按下回车后可以打开相应的程序、文件夹、文档或Internet资源&#xff1a; 3.6.2 命令提示符&#xff1a;cmd 在Windows系统中&#xff0c;cmd是指"命令提示符…

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…

SpringBoot全局Controller返回值格式统一处理

一、Controller返回值格式统一 1、WebResult类 在 Controller对外提供服务的时候&#xff0c;我们都需要统一返回值格式。一般定义一个 WebResult类。 统一返回值&#xff08;WebResult类&#xff09;格式如下&#xff1a; {"success": true,"code": 2…

【计算机算法设计与分析】n皇后问题(C++_回溯法)

文章目录 题目描述测试样例算法原理算法实现参考资料 题目描述 在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后&#xff0c;任何2个皇后不放在同…

jmeter关联依赖---三种

1.正则表达式提取器 2.xpath取样器 3.json提取器

java练习题之String方法运用

应用知识点&#xff1a;​​​​​​String类 1&#xff1a;(String 类)仔细阅读以下代码段&#xff1a; String s "hello"; String t"hello"; char[] c {h,e,l,l,o}; 2&#xff1a;下列选项输出结果为false 的语句是() System.out.println( s.euqals( t…