首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于性能分析的编译选项

用于性能分析的编译选项
EN

Stack Overflow用户
提问于 2014-02-04 04:01:33
回答 1查看 425关注 0票数 1

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

我最感兴趣的是这些编译器: gcc/g++/icc和这些评测工具: Intel Vtune、Linux Perf和Oprofile。Linux操作系统。

众所周知,启用优化(函数内联、循环转换等)可能会更改指令的顺序,这可能会导致在分析器/调试器中显示令人困惑的信息(如果不是错误的话)。然而,如果我禁用这些优化,我将分析(并在以后优化)一个“欠优化”的代码……那么,编译性能分析时的最佳实践是什么呢?

EN

回答 1

Stack Overflow用户

发布于 2014-05-07 06:22:40

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

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
$ 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 to“消息,但映射到parallel_for.h TBB标题。没有与我们的程序中的functor相对应的报告。由于函数器是在parallel_for块中调用的,因此函数定义在parallel_for.h中内联

为了捕获这些信息,在构建过程中使用-debug inline-debug-info编译器选项,生成的矢量化报告如下所示:

代码语言:javascript
复制
$ 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)处“循环被矢量化”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21536589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档