Intel® Composer XE 2015 Beta: отчётность в порядке!
Наконец, стартовала бета программа для 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 отчёт:
Predicate unswitching Report: (Condition and loop line numbers)
>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 июля. Ваш отзыв о новых возможностях очень ценен для нас, так что заранее спасибо и удачи!