CUDA实践指南(二十八)

简介:

控制流:
分支和分歧:
高优先级:避免同一个warp内的不同执行路径。
流控制指令(如果,切换,做,为,while)可以通过使同一个warp的线程发散来显着影响指令吞吐量; 即遵循不同的执行路径。 如果发生这种情况,不同的执行路径必须单独执行; 这会增加为这个warp执行的指令总数。
为了在控制流程取决于线程ID的情况下获得最佳性能,应该编写控制条件以尽量减少发散warps的数量。
这是可能的,因为在CUDA C编程指南的SIMT体系结构中提到了整个块上的warp分布是确定性的。 一个简单的例子是控制条件仅依赖于(threadIdx / WSIZE),其中WSIZE是warp大小。
在这种情况下,由于控制条件与warp完美对齐,所以没有warp发散。
对于只包括几条指令的分支,翘曲散度通常会导致性能损失的边际。 例如,编译器可能使用预测来避免实际的分支。 相反,所有指令都是预定的,但每个线程条件代码或谓词控制哪些线程执行指令。 带有假谓词的线程不会写结果,也不会计算地址或读操作数。
从Volta体系结构开始,独立线程调度允许warp在数据相关条件块之外保持分离。 明确的__syncwarp()可以用来保证warp已经为后续指令重新收敛。
分支预测:
低优先级:使编译器易于使用分支预测来代替循环或控制语句。
有时,编译器可能会展开循环,或者通过使用分支预测来优化if或switch语句。 在这些情况下,没有任何扭曲可以分歧。 程序员也可以使用控制循环展开:

#pragma unroll

当使用分支预测时,跳过执行取决于控制条件的指令。 相反,每个这样的指令都与根据控制条件设置为真或假的每线程条件代码或谓词相关联。 虽然这些指令中的每一条都被安排执行,但实际上只执行带有真谓词的指令。 带有假谓词的指令不写结果,它们也不评估地址或读操作数。
只有当由分支条件控制的指令数小于或等于某个阈值时,编译器才会用预测指令替换分支指令:如果编译器确定该条件可能会产生很多发散warps,则此阈值为7; 否则是4。
Loop Counters Signed vs. Unsigned:
低中优先级:使用带符号整数而不是无符号整数作为循环计数器。
在C语言标准中,无符号整数溢出语义被很好地定义,而带符号整数溢出会导致未定义的结果。 因此,编译器可以比使用无符号算术更积极地进行有符号算术优化。 在循环计数器中这一点特别值得注意:因为循环计数器的值始终为正,所以将计数器声明为未签名可能是诱人的。 但是,对于稍微好一点的性能,它们应该被声明为已签名。
例如,请考虑以下代码:

for (i = 0; i < n; i++) {
    out[i] = in[offset + stride*i];
}

这里,子表达式stride *我可以溢出一个32位整数,所以如果我声明为unsigned,那么溢出语义会阻止编译器使用某些可能已应用的优化,例如强度降低。 如果相反,我被声明为有符号的,那么溢出语义未定义,编译器有更多的余地来使用这些优化。

目录
相关文章
|
并行计算 异构计算
CUDA stream利用CUDA流重叠计
CUDA stream利用CUDA流重叠计
896 0
CUDA stream利用CUDA流重叠计
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
1907 0
|
并行计算 TensorFlow 调度
推荐场景GPU优化的探索与实践:CUDA Graph与多流并行的比较与分析
RTP 系统(即 Rank Service),是一个面向搜索和推荐的 ranking 需求,支持多种模型的在线 inference 服务,是阿里智能引擎团队沉淀多年的技术产品。今年,团队在推荐场景的GPU性能优化上又做了新尝试——在RTP上集成了Multi Stream,改变了TensorFlow的单流机制,让多流的执行并行,作为增加GPU并行度的另一种选择。本文详细介绍与比较了CUDA Graph与多流并行这两个方案,以及团队的实践成果与心得。
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
1767 2
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
SiLU函数
SiLU(Sigmoid Linear Unit)函数,也称为 Swish 函数,是一种常用于深度学习中的激活函数。它是由 Google 的研究人员提出的,旨在解决 ReLU(Rectified Linear Unit)函数的一些缺点,尤其是在深度网络的训练过程中。
392 0
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
215 0
|
8月前
|
机器学习/深度学习 数据处理
大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
本文分析了大规模Transformer架构(如LLama)中归一化技术的关键作用,重点探讨了LayerNorm被RMSNorm替代的原因。归一化通过调整数据量纲保持分布形态不变,提升计算稳定性和收敛速度。LayerNorm通过均值和方差归一化确保数值稳定,适用于序列模型;而RMSNorm仅使用均方根归一化,省略均值计算,降低计算成本并缓解梯度消失问题。RMSNorm在深层网络中表现出更高的训练稳定性和效率,为复杂模型性能提升做出重要贡献。
1813 14
大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
|
4月前
|
机器学习/深度学习 数据可视化 PyTorch
Flow Matching生成模型:从理论基础到Pytorch代码实现
本文将系统阐述Flow Matching的完整实现过程,包括数学理论推导、模型架构设计、训练流程构建以及速度场学习等关键组件。通过本文的学习,读者将掌握Flow Matching的核心原理,获得一个完整的PyTorch实现,并对生成模型在噪声调度和分数函数之外的发展方向有更深入的理解。
1887 0
Flow Matching生成模型:从理论基础到Pytorch代码实现
|
11月前
|
存储 安全 算法
陪玩系统功能 陪玩平台 陪玩系统用户体验 陪玩系统安全性 陪玩系统开发
陪玩系统旨在为用户寻找合适的陪玩者,提供注册登录、资料展示、搜索匹配、预约支付、实时沟通及评价反馈等功能。平台拥有丰富的陪玩资源,便捷的预约流程,安全的支付环境和良好的用户体验。系统通过优化算法、提升沟通效率、丰富服务内容和建立社区互动来提升用户体验。安全性方面,系统采用数据加密、防火墙、支付安全和实名认证等措施。开发过程包括需求分析、系统设计、前后端开发、测试优化和上线推广。
964 2
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
1611 3