We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
OP性能是飞桨框架重要功能之一,通过 OP benchmark,我们发现有些OP性能不够好,没有充分利用硬件算力。石墨表格《PFCC-Roadmap》之【飞桨 OP 性能优化】为当前在Paddle中部分性能需要优化的案例,我们内部在不断地进行优化。你如果对这方面有兴趣,欢迎参加此项活动。
目前主要以CUDA编程为主,若对手写Kernel的概念了解不多,请详细阅读CUDA 编程模型概述。我们通常使用以下方法对GPU算子进行性能优化:
数据向量化读写:GPU kernel 的性能瓶颈常被划分为计算瓶颈compute-bound和访存瓶颈memory-bound,当前硬件架构不断更新,算力不断提高,算力与带宽的差距越来越大,导致越来越多的 kernel 性能受制于访存瓶颈。用户可采用常见的int4,float4等向量化类型实现数据的向量化读写操作,详见CUDA相关文档。当然,鼓励采用通用化的数据类型表示方法 AlignedVector ,以适应不同的向量化读写规则,具体使用案例见gelu_funcs.h.
int4,float4
快速计算方法:针对前面提到的计算瓶颈问题,我们提供一些基础的优化策略供参考:
int index = a/b/c
__hadd2
_expf,_fdivide
#pragma unroll
合理的线程配置策略:GPU Kernel通常需要设置线程配置参数,以确定执行kernel时可分配的计算资源,选择合理的配置参数,能够优化计算Kernel的性能,影响线程配置的因素主要有以下几个方面:
推荐采用gpu_launch_config.h中的线程配置方法选择较为合理的配置参数,若有更好的线程设置策略,欢迎补充。
高性能计算库:飞桨内置了一套模块化的高性能计算组件库kps,可以模块化、高性能地完成GPU Kernel实现及优化。此外,若采用如cublas等高性能计算库能获得显著的性能收益,也欢迎使用,cublas库使用示例见matmul_kernel_impl.h, cudnn库的使用示例见conv_kernel.cu,thrust库使用示例见coalesced_kernel.cu.
cublas
cudnn
thrust
The text was updated successfully, but these errors were encountered:
【方向说明】
【参与指南】:
飞桨成立了 PFCC(Paddle Framework Contributor Club),是一个有兴趣、正在、或者已经为飞桨开源框架做开源贡献的贡献者而成立的虚拟组织,在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。欢迎你持续关注并加入(我们会定向邀请 Paddle repo 提交PR的开发者加入)。
如果你对算子性能优化方向感兴趣,可以在石墨表格《PFCC-Roadmap》之【报名页】(可复制链接后用石墨文档 App 或小程序打开,持续更新)填入你的 GitHub ID,之后一起讨论后续规划和分工。
【提交流程】
【提交内容】
【合入标准】
【技术要求】
【参考内容】
Sorry, something went wrong.
No branches or pull requests
Roadmap
OP性能是飞桨框架重要功能之一,通过 OP benchmark,我们发现有些OP性能不够好,没有充分利用硬件算力。石墨表格《PFCC-Roadmap》之【飞桨 OP 性能优化】为当前在Paddle中部分性能需要优化的案例,我们内部在不断地进行优化。你如果对这方面有兴趣,欢迎参加此项活动。
目前主要以CUDA编程为主,若对手写Kernel的概念了解不多,请详细阅读CUDA 编程模型概述。我们通常使用以下方法对GPU算子进行性能优化:
数据向量化读写:GPU kernel 的性能瓶颈常被划分为计算瓶颈compute-bound和访存瓶颈memory-bound,当前硬件架构不断更新,算力不断提高,算力与带宽的差距越来越大,导致越来越多的 kernel 性能受制于访存瓶颈。用户可采用常见的
int4,float4
等向量化类型实现数据的向量化读写操作,详见CUDA相关文档。当然,鼓励采用通用化的数据类型表示方法 AlignedVector ,以适应不同的向量化读写规则,具体使用案例见gelu_funcs.h.快速计算方法:针对前面提到的计算瓶颈问题,我们提供一些基础的优化策略供参考:
int index = a/b/c
,计算性能难免受到影响。出现此类时,推荐采用FastDivmod 方法完成计算索引计算,使用方法详见pooling.cu.__hadd2
(详见CUDA相关文档),灵活运用这类计算可以解决这类case的性能不足问题。除此之外,建议谨慎使用_expf,_fdivide
等intrinsic,这类计算通过牺牲精度以提升性能,但是Paddle作为核心训练框架,OP精度对最终的模型收敛性会有影响.#pragma unroll
指令,编译器会展开具有已知循环次数的小循环加速循环的执行效率.合理的线程配置策略:GPU Kernel通常需要设置线程配置参数,以确定执行kernel时可分配的计算资源,选择合理的配置参数,能够优化计算Kernel的性能,影响线程配置的因素主要有以下几个方面:
推荐采用gpu_launch_config.h中的线程配置方法选择较为合理的配置参数,若有更好的线程设置策略,欢迎补充。
高性能计算库:飞桨内置了一套模块化的高性能计算组件库kps,可以模块化、高性能地完成GPU Kernel实现及优化。此外,若采用如
cublas
等高性能计算库能获得显著的性能收益,也欢迎使用,cublas
库使用示例见matmul_kernel_impl.h,cudnn
库的使用示例见conv_kernel.cu,thrust
库使用示例见coalesced_kernel.cu.The text was updated successfully, but these errors were encountered: