インテル®Composer XE 2015ベータ:レポートOK!



最後に、Intel Software Development Toolsのベータプログラムが開始されました。 インテルが開発者向けに提供するすべてのツールの新しいバージョンが準備中です。 コンパイラの次のリリースがもたらす興味深いことを見てみましょう。



そのため、2015年、Composerのベータ版には、C ++およびFortranコンパイラv.15.0ベータ、Math Kernel Library 11.2ベータ、Integrated Performance Primitives 8.1およびThreading Building Blocks 4.2 Update 3が含まれていました。通常、すべてのプラットフォームがサポートされています-Windows、 LinuxおよびOSX。コンパイラバージョン14.1は存在せず、存在しないことに注意してください(以前のバージョンは14.0です)。



ベータ版には、統合グラフィックス(Intel Graphics Technology)を使用して計算を実行する機会が再びあります。 この機能は以前のベータ版で既にテストされていましたが、公式リリースには登場しなかったため、もう一度言います。 今回は彼女が光を見ることを期待しましょう。 この機会は興味深いものであり、もちろん、特別な注意と個別の会話に値します。 Intel Xeon PhiのサポートがIPPに追加されました-ここで驚くことはありません。 さらに、OS Xの新しい「icl」および「icl ++」コンパイラーは、clang / LLVMとの互換性を高めるために登場しました。 興味深いことに、C ++コンパイラーでは、-ansi-aliasオプションがデフォルトで有効になりました(以前はそうではありませんでした)。C++ 11標準が完全にサポートされるようになりました。



おそらく、すべての変更のほとんどが、opt-report、vec-report、openmp-report、par-reportなどのコンパイラの最適化レポートに影響を与えました。 それらについて詳しく説明します。



ソースコードを使用してコンパイラーによって実行される最適化について、それらすべてが異なる情報を提供したことを思い出させてください。 長年にわたり、これらのレポートを改善し、より読みやすく、便利で理解しやすいものにするための要望を聞いてきました。 ループを最適化するために重要なベクトル化に関するレポートを最も心配していました。 2つの関数とループを持つ単純なコードの例で実際に何が変わったのか見てみましょう。



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) [1/2=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レポート:



 <test.cpp;-1:-1;hlo;?foo0@@YAXHPEAH@Z;0> High Level Optimizer Report (?foo0@@YAXHPEAH@Z) Predicate unswitching Report: (Condition and loop line numbers) <test.cpp;3:4;hlo_opt_pred;?foo0@@YAXHPEAH@Z;0> 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が表示されました。 -opt-report-file:stderrスイッチを使用して、この動作を変更し、STDERRの前の表示に戻ることができます。

さて、このファイルの内容を見てみましょう。 <;-1:-1; IPO MODREF ;; 0>などの形式のすべての不要な情報がすぐに注目されました。 レポートは適切に構成されており、はるかに理解しやすいものです。 以前と同様、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レポートは必要に応じて機能し、レポートのファイルにはベクトル化レポートしかありませんでした。



 >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)で既に説明されているこのような機会を追加することを約束します。 待って それまでの間、誰もが7月11日まで実行されるベータプログラムに参加することで、コンパイラを含むIntelツールの新機能を試すことができます。 新機能に関するご意見は非常に貴重です。よろしくお願いいたします。



All Articles