linux - 用于分析目的的编译选项

标签 linux performance gcc profiling icc

为了提高分析实验的准确性,可以打开/关闭哪些好的编译器选项?

我对这些编译器最感兴趣:gcc/g++/icc 以及这些分析工具:Intel Vtune、Linux Perf 和 Oprofile。 Linux 操作系统。

众所周知,启用优化(函数内联、循环转换等)可能会改变指令的顺序,这可能会导致分析器/调试器中显示令人困惑的信息(如果不是不正确的话)。但是,如果我禁用这些优化,我将分析(并稍后优化)“优化不足”的代码...那么,编译分析时的最佳实践是什么?

最佳答案

所有分析工具都依赖于编译器在构建过程中生成的调试信息。只要调试信息捕获了这些优化(尤其是内联),分析工具就能够将其映射到正确的源位置。对于 ICC,当您在打开优化的情况下构建代码时,请使用编译器选项“-debug inline-debug-info”。因此,如果您的函数是内联的,它将确保它将在调用站点和被调用站点(定义函数的位置)调用优化。下面是一个简单的示例,说明了相同的内容:

#include <iostream>
#include <tbb/tbb.h>
#include <tbb/parallel_for.h>
#include <cstdlib>
using namespace std;
using namespace tbb;
long len = 0;
float *__restrict__ a;
float *__restrict__ b;
float *__restrict__ c;
class Test {
public:
    void operator()( const blocked_range<size_t>& x ) const {
        for (long i=x.begin(); i!=x.end(); ++i ) {
            c[i] = (a[i] * b[i]) + b[i];
        }
    }
};
int main(int argc, char* argv[]) {
    cout << atol(argv[1]) << endl;
   len = atol(argv[1]);
    a = new float[len];
    b = new float[len];
    c = new float[len];
    parallel_for(blocked_range<size_t>(0,len, 100), Test() );
    return 0;
}

使用以下编译器选项构建上述代码会发出矢量化报告,但该报告不会将矢量化报告映射到正确的源代码行:

$ icpc testdebug.cc -c -vec-report2 -O3
tbb/parallel_for.h(127): (col. 22) remark: loop was not vectorized: unsupported loop structure
tbb/parallel_for.h(127): (col. 22) remark: LOOP WAS VECTORIZED
tbb/parallel_for.h(127): (col. 22) remark: loop was not vectorized: unsupported loop structure
tbb/parallel_for.h(127): (col. 22) remark: LOOP WAS VECTORIZED
tbb/parallel_for.h(127): (col. 22) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate
tbb/parallel_for.h(127): (col. 22) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate
tbb/partitioner.h(164): (col. 9) remark: loop was not vectorized: existence of vector dependence

从上面的报告中,我们看到两条“LOOP WAS VECTORIZED”消息,但映射到parallel_for.h TBB header 。没有与我们程序中的仿函数相对应的报告。由于仿函数是在parallel_for block 内调用的,因此函数定义内联在parallel_for.h

为了捕获该信息,请在构建期间使用 -debug inline-debug-info 编译器选项,生成的矢量化报告将如下所示:

$ icpc testdebug.cc -c -vec-report2 -O3 -debug inline-debug-info
tbb/partitioner.h(171): (col. 9) remark: loop was not vectorized: unsupported loop structure
testdebug.cc(14): (col. 37) remark: LOOP WAS VECTORIZED
tbb/partitioner.h(164): (col. 9) remark: loop was not vectorized: unsupported loop structure
testdebug.cc(14): (col. 37) remark: LOOP WAS VECTORIZED
tbb/partitioner.h(245): (col. 33) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate
tbb/partitioner.h(265): (col. 52) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate
tbb/partitioner.h(164): (col. 9) remark: loop was not vectorized: existence of vector dependence

从上面的报告可以清楚地看出,testdebug.cc(14) 中的“循环已矢量化”。

关于linux - 用于分析目的的编译选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536589/

相关文章:

linux - 在 ubuntu 上升级 qt 版本以使用 QopenGLWidget

database - SQLAlchemy、UUID、Sharding 和 AUTO_INCREMENT 主键……如何让它们协同工作?

linux - 比较日志中的纪元时间戳并检查列表中的前一个时间戳和当前时间戳之间是否经过了 x 时间

c# - 关于缓存的线程安全 IEnumerable<T> 实现的性能

c - 通过ARM(使用GCC)获取C中汇编标签的地址

linux - 在 docker 容器内运行的 bash 文件中没有这样的文件或目录 sed 命令

php - 使用 PHP 填充 Sh 脚本值

c++ - 来自 EPEL 的 Amazon Linux 上的 Clang 无法找到 C++ header 或库

c++ - 使用 GCC 或/和 IAR 编译时如何禁用 double 学?

c - main函数和其他函数局部变量的区别