Все инструменты профилирования полагаются на отладочную информацию, созданную компилятором во время сборки. Пока отладочная информация фиксирует эти оптимизации (особенно встраивание), инструмент профилирования сможет сопоставить ее с правильным исходным местоположением. Для 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», но они отображаются в заголовок TBB parallel_for.h. Нет отчета, соответствующего функтору, который есть в нашей программе. Так как функтор вызывается внутри блока parallel_for, определение функции встроено в 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).
person
Anoop - Intel
schedule
06.05.2014
gcc -pg
и использоватьgprof
. Но профилирование всегда сильно мешает профилированному коду. Прочтите о heisenbugs. Кроме того, какое приложение вы пытаетесь оптимизировать и почему? - person Basile Starynkevitch   schedule 04.02.2014