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,那么溢出语义会阻止编译器使用某些可能已应用的优化,例如强度降低。 如果相反,我被声明为有符号的,那么溢出语义未定义,编译器有更多的余地来使用这些优化。

目录
相关文章
|
机器学习/深度学习 存储 并行计算
一篇就够:高性能推理引擎理论与实践 (TensorRT)
本文分享了关于 NVIDIA 推出的高性能的深度学习推理引擎 TensorRT 的背后理论知识和实践操作指南。
13617 9
一篇就够:高性能推理引擎理论与实践 (TensorRT)
|
并行计算 异构计算
CUDA stream利用CUDA流重叠计
CUDA stream利用CUDA流重叠计
782 0
CUDA stream利用CUDA流重叠计
|
9月前
|
存储 安全 算法
陪玩系统功能 陪玩平台 陪玩系统用户体验 陪玩系统安全性 陪玩系统开发
陪玩系统旨在为用户寻找合适的陪玩者,提供注册登录、资料展示、搜索匹配、预约支付、实时沟通及评价反馈等功能。平台拥有丰富的陪玩资源,便捷的预约流程,安全的支付环境和良好的用户体验。系统通过优化算法、提升沟通效率、丰富服务内容和建立社区互动来提升用户体验。安全性方面,系统采用数据加密、防火墙、支付安全和实名认证等措施。开发过程包括需求分析、系统设计、前后端开发、测试优化和上线推广。
827 2
|
10月前
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
1189 3
|
并行计算 计算机视觉 异构计算
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
331 0
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
|
C++ 安全
提高安全性,优雅实现拷贝与交换:C++中的Copy-and-Swap惯用法
拷贝并交换(Copy-and-Swap)是C++中实现赋值操作符和异常安全拷贝构造函数的技巧,涉及使用拷贝构造函数创建临时对象,然后交换数据以确保安全。C++11之前的通用方法,在C++11后可利用移动语义和右值引用优化。示例代码展示了如何运用此方法。
128 0
|
Python
python实现股票策略回测案例
此Python代码演示了一个简单的股票策略回测,使用yfinance库获取AAPL股票2020年至2022年的数据。它计算每日收益率,并基于前一日收益率决定买卖:正则买入,负则卖出。通过模拟交易更新现金和股票余额,最终计算总收益。请注意,此示例未涵盖交易费用、滑点、风险管理等实际交易因素。
465 0
|
缓存 前端开发 安全
华为社招三面面经分享,现已拿到offer,定级D4对标17级
一面:(面试均是华为的开发,每轮面试完都有反问你想了解的) 修饰符和可见性 抽象类抽象方法 synchronized,volatile 一些java类型相关的基础知识,比如springbuilder和springbuffer哪个线程安全 为什么要使用spring(就是问优点吧) spring的依赖注入 spring加载顺序
|
程序员
一键解密Matlab p文件,先进的解密神器来了!
Matlab解密是程序员和科研人员经常会遇到的问题。
1593 0
|
测试技术 API C++
[Eigen中文文档] 扩展/自定义Eigen(一)
在本节中,将介绍如何向MatrixBase添加自定义方法。由于所有表达式和矩阵类型都继承自MatrixBase,因此将方法添加到MatrixBase会立即使其对所有表达式可用!一个典型的用例是,使Eigen与另一个API兼容。
541 0