CUDA实践指南(二十二)

简介:

并发内核执行:
正如“计算异步和重叠传输”中所述,CUDA流可用于将内核执行与数据传输重叠。 在能够并发执行内核的设备上,还可以使用流同时执行多个内核,以更充分地利用设备的多处理器。 设备是否具有此功能由cudaDeviceProp结构的并发内核字段指示(或在deviceQuery CUDA示例的输出中列出)。 非默认流(流0以外的流)对于并发执行是必需的,因为使用默认流的内核调用只有在设备上的所有前面的调用(任何流)完成之后才开始,并且设备上没有任何操作 流)开始直到完成。
以下示例说明了基本技巧。 因为kernel1和kernel2在不同的非默认流中执行,所以有能力的设备可以同时执行内核。

cudaStreamCreate(&stream1);
cudaStreamCreate(&stream2);
kernel1<<<grid, block, 0, stream1>>>(data_1);
kernel2<<<grid, block, 0, stream2>>>(data_2);

多个上下文:
CUDA工作发生在称为上下文的特定GPU的进程空间内。 上下文封装了该GPU的内核启动和内存分配以及支持页表等内容。 上下文在CUDA Driver API中是明确的,但在CUDA Runtime API中完全隐含,它自动创建和管理上下文。
借助CUDA驱动程序API,CUDA应用程序进程可能会为给定的GPU创建多个上下文。 如果多个CUDA应用程序进程同时访问同一GPU,则这几乎总是暗含多个上下文,因为上下文与特定主机进程绑定,除非正在使用CUDA多进程服务。
虽然可以在给定的GPU上同时分配多个上下文(及其相关资源,如全局内存分配),但只有其中一个上下文可以在该GPU上的任何给定时刻执行工作; 共享相同GPU的上下文是时间片的。 创建额外的上下文会导致每上下文数据的内存开销和上下文切换的时间开销。 此外,当需要并行执行多个上下文时,对上下文切换的需求可以降低利用率。
因此,最好在相同的CUDA应用程序中避免每个GPU的多个上下文。 为此,CUDA Driver API提供了访问和管理每个GPU上称为主要上下文的特殊上下文的方法。 这些是CUDA运行时隐式使用的相同上下文,当没有线程的当前上下文时。

// When initializing the program/library
CUcontext ctx;
cuDevicePrimaryCtxRetain(&ctx, dev);
// When the program/library launches work
cuCtxPushCurrent(ctx);
kernel<<<...>>>(...);
cuCtxPopCurrent(&ctx);
// When the program/library is finished with the context
cuDevicePrimaryCtxRelease(dev);

NVIDIA®(英伟达™)SMI可用于配置独立处理模式的GPU,从而将每个GPU的上下文数量限制为一个。 在创建过程中,此上下文可以是任意多个线程,如果在设备上已经存在使用CUDA驱动程序API创建的非主要上下文,cuDevicePrimaryCtxRetain将会失败。
隐藏寄存器依赖关系:
中等优先级:为了隐藏由寄存器依赖性引起的延迟,为每个多处理器维护足够数量的活动线程(即足够的占用率)。
当指令使用存储在指令写入的寄存器中的结果之前,会产生寄存器相关性。 当前支持CUDA的GPU的延迟时间大约为24个周期,因此线程在使用算术结果之前必须等待24个周期。 但是,这种延迟可以通过执行其他warp中的线程完全隐藏。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
编解码 C++ Python
成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr
成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr
成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr
|
人工智能 Prometheus 监控
监控vLLM等大模型推理性能
本文将深入探讨 AI 推理应用的可观测方案,并基于 Prometheus 规范提供一套完整的指标观测方案,帮助开发者构建稳定、高效的推理应用。
2980 169
监控vLLM等大模型推理性能
|
11月前
|
前端开发 算法 大数据
ECharts 深度进阶:自定义渲染器与百万级数据性能优化
深入解析ECharts架构,详解自定义WebGL渲染器开发与百万级数据性能优化方案,涵盖数据采样、LOD、增量渲染等核心技术,显著提升大数据可视化性能与交互体验。
804 1
|
机器学习/深度学习 负载均衡 网络架构
Mixture of Experts架构的简要解析
Mixture of Experts(MoE)架构起源于1991年,其核心思想是通过多个专门化的“专家”网络处理输入的不同部分,并由门控网络动态组合输出。这种架构实现了稀疏激活,仅激活部分专家,从而在模型规模与计算成本之间取得平衡。MoE的关键在于门控机制的设计,如线性门控、噪声Top-K门控等,确保模型能根据输入特征自适应选择专家。
1820 8
|
人工智能 弹性计算 监控
【云故事探索】NO.16:阿里云弹性计算加速精准学 AI 教育普惠落地
全球首个K12教育超级智能体“寒雪老师”依托阿里云弹性计算,实现“超拟人”教学与教育普惠。智能精准学通过AI技术提供个性化学习方案,借助学习机等产品实现语音交互、答疑解惑,助力每个孩子拥有终身学习能力。面对实时交互与流量潮汐挑战,阿里云ECS与GPU算力保障低延迟、高并发服务稳定运行,实现30秒内弹性扩容,确保业务连续性。从实验室到千万课堂,算力支撑寒雪老师从城市到山区,推动AI教育公平发展。
|
网络协议 算法 网络架构
动态路由协议的分类
动态路由协议分为内部网关协议(IGP)和外部网关协议(EGP)。IGP用于自治系统(AS)内部,如RIP、OSPF、EIGRP、IS-IS,负责快速发现和计算最优路径;EGP如BGP用于不同AS之间,传递路由信息并避免环路。IGP关注收敛速度与路径计算,EGP侧重策略与大规模路由支持。两者共同构建互联网路由体系。
1765 0
|
并行计算 Linux
export OMP_NUM_THREADS=(nproc--all)
export OMP_NUM_THREADS=(nproc--all) 是一条 Linux 命令,用于设置 OpenMP(一个用于并行编程的应用程序接口)使用的线程数。
1851 7
|
算法 Java 数据库
理解CAS算法原理
CAS(Compare and Swap,比较并交换)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相同来决定是否进行更新。JDK 5引入了基于CAS的乐观锁机制,替代了传统的synchronized独占锁,提升了并发性能。然而,CAS存在ABA问题、循环时间长开销大和只能保证单个共享变量原子性等缺点。为解决这些问题,可以使用版本号机制、合并多个变量或引入pause指令优化CPU执行效率。CAS广泛应用于JDK的原子类中,如AtomicInteger.incrementAndGet(),利用底层Unsafe库实现高效的无锁自增操作。
837 0
理解CAS算法原理
|
存储 物联网 数据安全/隐私保护
Docker安装Mosquitto
这篇文章详细介绍了如何在Docker中安装和配置Mosquitto消息代理服务,包括拉取镜像、创建容器以及配置持久化存储等步骤。
3240 0
Docker安装Mosquitto
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
2432 1

热门文章

最新文章