在计算加速时使用编译器优化

Posted

技术标签:

【中文标题】在计算加速时使用编译器优化【英文标题】:Using Compiler Optimization in Calculating Speed-up 【发布时间】:2013-07-20 13:06:32 【问题描述】:

当我们谈论在 GPU 上的 Cuda 中的并行程序比 CPU 上类似的顺序程序更快时,顺序程序是否应该由编译器优化器 (gcc -O2) 编译?

我在 GPU 上并行了一个程序。与没有编译器优化器的 CPU 实现相比,它的速度提高了 18 倍。但是当我在 nvcc 编译器中添加选项 -O2 时,加速率降低到 8。

【问题讨论】:

CUDA 编译器默认使用完整的编译器优化。您可能通过选择 O2降低编译优化程度。 @talonmies 您应该将此评论转换为答案。也许这会给其他有类似问题的用户提供更直接的帮助。从这个评论中,我会说应该使用完整的优化选项编译顺序代码以进行公平比较,对吗?因此,如果用户当前没有对顺序代码应用任何编译器优化,则加速可能小于18 除了编译器选项之外,在 CPU 中使用 OpenMP 的并行版本将是一个更有价值的比较。大多数新计算机都具有多线程,并且大多数适用于 CUDA 的代码都可以通过一些 OpenMP 指令轻松并行化。因此,您会将您的 CUDA 程序与 CPU 中的最佳版本进行比较。 通过编译器启用最大可能优化来比较加速。一般来说,-O3 应该足够了。有时仅通过传递 -O3 无法实现高度优化的代码,您必须传递其他标志(以启用默认禁用的优化)。 【参考方案1】:

当然,在比较性能时,GPU 和 CPU 程序都应该使用优化器。

如果您专注于 GPU 与CPU,比较应该不受软件代码质量的影响。我们经常假设代码应该在其硬件上具有最佳性能。

【讨论】:

以上是关于在计算加速时使用编译器优化的主要内容,如果未能解决你的问题,请参考以下文章

PHP服务缓存加速优化实战

GCC编译器中的性能优化

PHP WEB 引擎缓存加速优化

基于端到端可迁移深度强化学习的图优化

使用优化编译时,多线程程序块

优化编译器如何决定何时展开循环以及展开循环的程度?