性能优化,以及如何做错它

主要观点:作者尝试用 SIMD 指令优化卷积,过程艰难,历经诸多问题。通过逐步减少和优化代码,发现分支过多和寄存器溢出是性能问题的关键,还探讨了编译器内联函数的限制及解决方法等,最终实现了较好的卷积性能优化。
关键信息:

  • 在 burn-ndarray CPU 后端优化直接卷积,初始实现比未向量化的慢。
  • 各种 profilers 效果不佳,最终发现问题在于寄存器溢出和分支过多。
  • 采用双循环处理剩余像素,添加编译时单态化处理填充等变量,解决性能问题。
  • 编译器内联函数存在大小限制,导致函数使用默认特征集,影响性能。
  • 对于有填充的卷积,采用分循环处理边界像素的方法提高性能。
    重要细节:
  • 初始卷积代码使用多种优化技术,但性能不佳。
  • 尝试多种 profilers 无果,后发现问题根源。
  • 双循环优化比每次迭代检查边界更高效。
  • 编译时单态化处理特定情况以实现自动向量化。
  • 编译器内联函数限制导致使用默认特征集及性能问题。
  • 分循环处理边界像素提高有填充卷积的性能。最终优化后的代码性能较好。
阅读 7
0 条评论