Intel® Composer XE 2015 Beta: отчётность в порядке!

5bde4a579d4a06a81d94e9c76a3f6b42.pngНаконец, стартовала бета программа для Intel® Software Development Tools. На подходе новые версии всех средств, которые предлагает Intel для разработчиков. Давайте разберёмся, что интересного принесёт нам следующий релиз компилятора.Итак, в 2015 бету-версию Composer«а вошли С++ и Fortran компиляторы v. 15.0 beta, библиотеки Math Kernel Library 11.2 beta, Integrated Performance Primitives 8.1 и Threading Building Blocks 4.2 Update 3. Как обычно, поддерживаются все платформы — Windows, Linux и OS X. Обратите внимание на то, что версии компилятора 14.1 нет и не будет (предыдущая версия — 14.0).В бета-версии опять появилась возможность выполнять вычисления с помощью интегрированной графики — Intel® Graphics Technology. Говорю опять, потому что эта функциональность уже была опробована в предыдущей бета-версии, но в официальном релизе так и не появлялась. Будем надеяться что в этот раз она увидит свет. Возможность интересная и, безусловно, заслуживает особого внимания и отдельного разговора. В IPP добавилась поддержка Intel® Xeon Phi™ — тут без неожиданностей. Кроме того, появились новые компиляторы «icl» и «icl++» на OS X для лучшей совместимости с clang/LLVM. Интересно, что для С++ компилятора опция -ansi-alias теперь включена по умолчанию, чего раньше не было, да и стандарт C++11 теперь поддерживается полностью.

Пожалуй, больше всего изменения коснулись отчётов компилятора об оптимизации, таких как opt-report, vec-report, openmp-report и par-report. О них и поговорим подробнее.

Напомню, что все они выдавали различную информацию о том, какие оптимизации выполнил компилятор с исходным кодом. На протяжении долгих лет мы слышали просьбы улучшить эти отчеты — сделать их более читаемыми, удобными и понятными. Больше всего беспокоил отчет о векторизации, который крайне важен для оптимизации циклов. Давайте посмотрим, что поменялось на деле на примере простенького кода с двумя функциями и циклами:

void foo0(int n, int *a) { for (int i = 0; i < n; ++i) { if (n & 1) { a[i] = a[i+1]; } } }

void foo1(int n, int *a) { // will not be vectorized due to data dependency. for (int i = 1; i < n; ++i) { if (n & 1) { a[i] = a[i-1]; } } } Собрав код с предыдущей версией компилятора, я, честно говоря, немного запутался в его выводе. >icl -Qopt-report -c test.cpp Сначала мы получили целый набор информации, очень похожей на какую-то внутреннюю, отладочную и абсолютно бесполезную: <;-1:-1;IPO ROUTINE ATTRIBUTES PROPAGATION;;0> ROUTINE ATTRIBUTE PROPAGATION TOTALS: RDECL: NSE (0→0), AR (0→0) ENTRY: SE (0→0), DSE (0→0), AR (0→0)

<;-1:-1;IPO MODREF;;0> CI-MOD: TOTAL (2): OTHER (2) CI-REF: TOTAL (2): OTHER (2)

<;-1:-1;IPO;;0> Согласитесь, здесь практически ничего не понять без кода самого компилятора, но речь идёт про IPO оптимизацию, факт. Поэтому чуть ниже мы видим значения некоторых параметров для инлайнинга и соответствующий отчёт: INLINING OPTION VALUES: -Qinline-factor: 100 -Qinline-min-size: 30 -Qinline-max-size: 230 -Qinline-max-total-size: 2000 -Qinline-max-per-routine: 10000 -Qinline-max-per-compile: 500000

< test.cpp;2:8;IPO INLINING;?foo0@@YAXHPEAH@Z;0> INLINING REPORT: (? foo0@@YAXHPEAH@Z) [½=50.0%] Далее следует отчет по векторизации для функции foo: HPO VECTORIZER REPORT (? foo0@@YAXHPEAH@Z) LOG OPENED ON Wed May 14 14:38:33 2014 < test.cpp;-1:-1;hpo_vectorization;?foo0@@YAXHPEAH@Z;0> HPO Vectorizer Report (? foo0@@YAXHPEAH@Z)

test.cpp (3:5–3:5): VEC:? foo0@@YAXHPEAH@Z: vectorization support: unroll factor set to 2 LOOP WAS VECTORIZED loop was not vectorized: nonstandard loop is not a vectorization candidate HLO REPORT LOG OPENED ON Wed May 14 14:38:33 2014 И HLO отчёт: High Level Optimizer Report (? foo0@@YAXHPEAH@Z)

Predicate unswitching Report: (Condition and loop line numbers)

Condition at line 4 hoisted from loop at line 3 Продолжать разбор данного вывода не буду, потому что очевидно то, что всё это крайне неудобно. Требуется постоянно из кучи ненужной информации высматривать то, что интересует нас. Тем не менее, пользоваться таким средством было всё-таки возможно — я получил нужную мне информацию о векторизации циклов, и ещё кое-что о преобразованиях самих циклов компилятором, например в функции foo вынесли условие из цикла. Но, очевидно, что подобный отчёт больше смахивает на первобытность.Итак, легким движением руки я открыл консоль с новой версией компилятора и попытался проделать то же самое:

>icl -Qopt-report -c test.cpp Результат меня несколько удивил. Я не увидел ничего в консоли, потому что сейчас компилятор по дефолту направляет отчёт в файл с расширение .optrpt для каждого объектника, и говорит об этом: icl: remark #10398: optimization reports are generated in *.optrpt files in the output directory Неожиданно, и к этому нужно быть готовым. В нашем случае, появился файлик test.optrpt. Это поведение можно поменять и вернуться к прежнему отображению в STDERR с помощью ключика -opt-report-file: stderr.Хорошо, посмотрим что же есть в этом файлике. Сразу обращает на себя внимание тот факт, что всю ненужную информацию в виде и прочее убрали. Отчёт хорошо структурирован и гораздо более понятен. Начинается он, как и раньше, с отчета о IPO оптимизации, но теперь это явно прописали: Report from: Interprocedural optimizations [ipo] IPO OPTIMIZATION REPORT: INLINING OPTION VALUES: -Qinline-factor: 100 -Qinline-min-size: 30 -Qinline-max-size: 230 -Qinline-max-total-size: 2000 -Qinline-max-per-routine: 10000 -Qinline-max-per-compile: 500000 Вообще, в отчет добавили много слов о том, где какой отчёт начинается, что облегчает понимание. Скажем, вот так: Begin optimization report for: foo0 Report from: Interprocedural optimizations [ipo] INLINE REPORT: (foo0) [1]

Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par] … =========================================================================== Begin optimization report for: foo1 Report from: Interprocedural optimizations [ipo] INLINE REPORT: (foo1) [2] Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par] … Но больше всего меня порадовала информация от векторизатора следующего вида: LOOP BEGIN at C:\Users\ivorobts\Desktop\opt-report\test.cpp (13,5) Predicate Optimized v1 remark #25426: Invariant Condition at line 14 hoisted out of this loop remark #15046: loop was not vectorized: existence of vector dependence remark #25443: unrolled with remainder by 2 remark #25014: Number of Array Refs Scalar Replaced In Loop: 2 LOOP END Для каждого цикла теперь имеются «маячки» вида LOOP BEGIN…LOOP END, поэтому их легко различить. Кстати, заменив опцию opt-report на vec-report7, раньше можно было получить информацию только по векторизации, причем с максимально возможной детализацией.С этой версии компилятора vec-report всё ещё поддерживается, но скоро совсем уйдёт «в века», передав все полномочия opt-report-phase: vec. Да и максимальный уровень, установленный для отчета, уже не 7, а 5. Напомню, что в версии 14.0 установка 7 уровня (максимального) требовала использования специального скриптика, для того, чтобы парсить вывод и приводить его в нормальный, читаемый вид. Сейчас это организовали без всяких скриптов, а максимальный уровень теперь 5, как в школе.Итак, пробуем:

icl -Qopt-report: vec5 -c test.cpp Упс… всё равно в отчете видим наличие информации про IPO. Ошибка, которая, видимо, скоро будет исправлена. А вот старый добрый vec-report сработал как нужно, и в файле из отчетов ничего, кроме отчета векторизатора: >icl -Qvec-report5 -c test.cpp Но не стоит увлекаться использованием отдельный опций на каждую оптимизацию — скоро их совсем «выкинут».С уровнем 5 мы получили достаточно много информации про цикл в функции foo: LOOP BEGIN at C:\Users\ivorobts\Desktop\opt-report\test.cpp (3,5) remark #15134: vectorization support: reference a has aligned access remark #15135: vectorization support: reference a has unaligned access remark #15127: vectorization support: unaligned access used inside loop body remark #15002: LOOP WAS VECTORIZED remark #36058: entire loop may be executed in remainder remark #36065: unmasked aligned unit stride stores: 1 remark #36066: unmasked unaligned unit stride loads: 1 remark #36091: --- begin vector loop cost summary --- remark #36092: scalar loop cost: 8 remark #36093: vector loop cost: 1.250 remark #36094: estimated potential speedup: 5.820 remark #36095: lightweight vector operations: 3 remark #36104: --- end vector loop cost summary --- LOOP END Кстати, есть приятная новость — скоро Visual Studio должна научиться отображать эти отчеты в красивой и удобной форме, и не нужно будет лезть ручками и открывать файлы. Обещают добавить такую возможность, уже описанную в документации к бета-версии (ключик Qopt-report-format: vs), в следующем обновлении. Что ж, подождём. А пока каждый может попробовать новые возможности средств от Intel, в том числе и компилятора, поучаствовав в бета программе, которая продлится до 11 июля. Ваш отзыв о новых возможностях очень ценен для нас, так что заранее спасибо и удачи!

© Habrahabr.ru