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大模型。
目录
相关文章
|
物联网 Java Linux
Linux安装与配置Eclipse Paho库:实现MQTT通信
Eclipse Paho是一个开源的MQTT(Message Queuing Telemetry Transport)实现,提供了多种编程语言的客户端库,包括C、C++、Java、Python等。在Linux系统中,通过安装和配置Eclipse Paho库,我们可以方便地实现MQTT通信功能。本文将详细介绍在Linux系统中安装和配置Eclipse Paho库的步骤,以便于开发者在物联网项目中使用MQTT协议进行通信。
3000 0
|
编解码 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 规范提供一套完整的指标观测方案,帮助开发者构建稳定、高效的推理应用。
3003 169
监控vLLM等大模型推理性能
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
2656 0
|
机器学习/深度学习 负载均衡 网络架构
Mixture of Experts架构的简要解析
Mixture of Experts(MoE)架构起源于1991年,其核心思想是通过多个专门化的“专家”网络处理输入的不同部分,并由门控网络动态组合输出。这种架构实现了稀疏激活,仅激活部分专家,从而在模型规模与计算成本之间取得平衡。MoE的关键在于门控机制的设计,如线性门控、噪声Top-K门控等,确保模型能根据输入特征自适应选择专家。
1867 8
基于springboot的大学生创新能力比赛系统
本研究聚焦大学生能力培养系统,结合AI、大数据、区块链及VR/AR等前沿技术,构建个性化、全过程的能力发展框架。通过Java、Spring Boot、MySQL与Vue技术实现系统开发,旨在提升学生综合素质与社会竞争力,推动高等教育改革与创新发展。
|
网络协议 算法 网络架构
动态路由协议的分类
动态路由协议分为内部网关协议(IGP)和外部网关协议(EGP)。IGP用于自治系统(AS)内部,如RIP、OSPF、EIGRP、IS-IS,负责快速发现和计算最优路径;EGP如BGP用于不同AS之间,传递路由信息并避免环路。IGP关注收敛速度与路径计算,EGP侧重策略与大规模路由支持。两者共同构建互联网路由体系。
1814 0
|
并行计算 Linux
export OMP_NUM_THREADS=(nproc--all)
export OMP_NUM_THREADS=(nproc--all) 是一条 Linux 命令,用于设置 OpenMP(一个用于并行编程的应用程序接口)使用的线程数。
1861 7
|
存储 物联网 数据安全/隐私保护
Docker安装Mosquitto
这篇文章详细介绍了如何在Docker中安装和配置Mosquitto消息代理服务,包括拉取镜像、创建容器以及配置持久化存储等步骤。
3267 0
Docker安装Mosquitto
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
2453 1