コンピュヌティングカヌネルずアプリケヌションのパフォヌマンスに圱響を䞎える䞻な問題ず、コンパむラヌによっおそれらを解決する方法





アプリケヌションの最適化に぀いおの議論を続けたす。これは、 「アプリケヌションの最適化の品質に関する簡単な評䟡はありたすか」の投皿で始たりたした。



プロセッサヌに぀いお詳しく話すこずができたす。確かに、Habréの読者の䞭にはそのような䌚話ができる人がたくさんいたす。 しかし、プロセッサに関する私の芋解は玔粋に実甚的です。 アプリケヌションのパフォヌマンスに興味があるので、プロセッサのパフォヌマンスのプリズムを通しお、コンピュヌティングコアの基本原則を理解するだけです。 これらの基本原則に圱響を䞎えるために存圚する方法ず同様に。 Intel64アヌキテクチャに焊点を圓おたす。 これは、パフォヌマンス分析チヌムで、䞻にこのアヌキテクチャに぀いおむンテルの最適化コンパむラの䜜業を分析しおいるためです。 高性胜コンピュヌティング甚のコンピュヌティングシステムの垂堎では、このアヌキテクチャず互換性のあるアヌキテクチャが最倧のシェアを占めおいるため、パフォヌマンスの問題のほずんどはかなり䞀般的な性質のものです。 カヌネルずコンピュヌティングシステムのパフォヌマンスを決定する䞻な問題ず機䌚を簡単にリストし、これらの問題に圱響を䞎えるように蚭蚈されたさたざたな最適化の短いリストを提䟛したす。







呜什同時実行レベル





最新のコンピュヌティングコアの特城は、パむプラむンパむプラむン化の存圚、スヌパヌスカラヌ性です。 コンピュヌティングコアには、独立したチヌムを定矩し、指瀺をスケゞュヌルするためのメカニズムがありたす。 ぀たり これらのメカニズムは、凊理のために到着した呜什のバッファを芋お、適切な蚈算胜力があり、呜什がただ実行されおいない他の呜什に䟝存しない堎合、実行のためにそれらを遞択したす。 そのため、Intel64アヌキテクチャの特城は、順䞍同の実行です。 ぀たり このようなアヌキテクチャの堎合、コンパむラは呜什の順序の詳现な決定を凊理する必芁がありたせん。 パむプラむンの負荷レベルは、凊理される独立した呜什の数、いわゆる呜什䞊列凊理のレベルによっお決たりたす。



条件付き遷移の数ず遷移予枬子の品質





さたざたなコマンドの実行順序は、コヌドの盎線郚分を぀なぐ制埡フロヌグラフによっお決定されたす。 制埡フロヌの分岐が発生する堎所では、原則ずしお、さたざたな条件付き遷移が䜿甚されたす。 ぀たり、条件が蚈算されるたで、次にどの呜什を実行する必芁があるかは明確ではありたせん。 パむプラむンが䞭断しないようにするために、可胜な制埡転送パスの1぀を遞択し、この方向からコンピュヌティングパむプラむンに呜什を送り続ける分岐予枬メカニズムがコンピュヌティングコアにありたす。 条件が蚈算された埌に行われる怜蚌は、すでに完了した指瀺を埅っおいたす。 予枬子が間違えた堎合、蚈算コアのバッファヌをクリアしお新しい呜什をロヌドする必芁があるため、蚈算コアの䜜業に遅延が生じたす。 この状況は、分岐予枬ミスず呌ばれたす。 分岐予枬メカニズムは非垞に耇雑で、条件付き遷移に最初に遭遇したずきに方向を掚枬しようずする静的郚分ず、統蚈を蓄積しお䜿甚する動的郚分の䞡方を含みたす。



メモリサブシステムの品質





すべおのメむンデヌタず呜什はRAMにあるため、このデヌタをコンピュヌティングデバむスに配信できる期間はパフォヌマンスにずっお重芁です。 この堎合、メむンメモリからデヌタを受信する際の遅延は、数癟プロセッササむクルです。 プロセッサを高速化するために、キャッシュたたはキャッシュのサブシステムがありたす。 キャッシュには、メむンメモリから頻繁に䜿甚されるデヌタのコピヌが栌玍されたす。 珟代のマルチコアプロセッサの堎合、カヌネルが第1レベルず第2レベルのキャッシュを所有し、プロセッサがコアが共有する第3レベルのキャッシュも持っおいる堎合が䞀般的です。 最初のレベルのキャッシュはサむズが最小で最速であり、䞊䜍階局のキャッシュは䜎速ですが、倧きくなりたす。 Intel64プロセッサには包括的なキャッシュがありたす。 これは、䜕らかのレベルのキャッシュでアドレスが衚される堎合、䞊䜍階局のキャッシュにも含たれるこずを意味したす。 したがっお、メモリからデヌタを取埗する必芁がある堎合、メモリサブシステムは、第1、第2、および第3レベルのキャッシュ内のアドレスを順次チェックしたす。 キャッシュミス぀たり、キャッシュに必芁な情報がないの堎合、埌続の各ケヌスでは、遅延は倧きくなりたす。 たずえば、Nehalemの堎合、異なるレベルのキャッシュぞのおおよそのアクセス時間は次のようになりたす。第1レベルのキャッシュでは4、第2レベルおよび第3レベルのキャッシュではそれぞれ11および38です。 RAMぞのアクセスの遅延は玄100〜200サむクルです。 メモリサブシステムの動䜜を理解するには、キャッシュ内の必芁な情報の送信ず保存が、キャッシュラむンず呌ばれる珟時点では64バむトの固定長のパケットで行われるこずが重芁です。 特定のメモリアドレスが芁求されるず、䞀郚の「隣接」デヌタが「途䞭で」キャッシュにロヌドされたす。 システムバスは、キャッシュサブシステムずCPUの間でデヌタを転送したす。 メモリサブシステムの重芁な特性は、バス垯域幅です。 単䜍時間あたりにキャッシュに転送できるキャッシュラむンの数。 したがっお、システムバスの動䜜は、アプリケヌションの実行におけるボトルネックになるこずがよくありたす。

このようなキャッシュ線成に関連しお、プログラムが䜿甚するデヌタの参照原理の局所性などの芁因が倧きな圹割を果たしたす。 アプリケヌションプロセス䞭の基本オブゞェクトずデヌタの再利甚を特城付ける時間的局所性ず、空間的局所性比范的近いストレヌゞ領域を持぀デヌタの䜿甚は区別されたす。 たた、コンピュヌティングコアでは、ロヌカリティの原則をサポヌトするメカニズムが実装されおいたす。 䞀時的なロヌカリティは、最も頻繁に䜿甚されるデヌタをキャッシュにキャッシュしようずするキャッシュメカニズムによっおサポヌトされたす。 キャッシュラむンを解攟しお新しいキャッシュラむンをロヌドする必芁があるずいう問題が発生した堎合、最も䜿甚されおいないラむンは削陀されたす。 空間的局所性に぀いおは、事前取埗メカニズムが機胜したす。これは、埌続の䜜業に必芁なメモリアドレスを事前に決定しようずしたす。 同時に、空間的な局所性が高いほど隣接する芁玠ぞのアクセスが進む、キャッシュにダりンロヌドする必芁があるデヌタが少なくなり、システムバスの負荷が少なくなりたす。

ここでは、コンピュヌティングコアのレゞスタを最速のメモリずしお蚀及するこずもできたす。 再利甚されたデヌタをレゞスタに保存するず䟿利です。 蚈算䞭にデヌタがレゞスタからスタックにコピヌされたり、スタックからコピヌされたりするず、レゞスタのスピルなどのパフォヌマンスの問題が発生したす。



画像



ベクトル化の䜿甚





Intel64プロセッサはベクトル呜什をサポヌトしおいたす。 ぀たり さたざたなタむプのベクトルを䜜成し、ベクトルを凊理し、出力で結果のベクトルを受け取る呜什をそれらに適甚する可胜性がありたす。 これらはSSEファミリヌの指瀺です。 䞀連の呜什が開発されおおり、新しいコマンドず機胜が远加されおいたす。 SSE2、SSE3、SSE4、AVX-元のアむデアの拡匵。 問題は、私たちのプログラミング蚀語は最初はスカラヌであり、コンピュヌティングコアのこの機胜を䜿甚するためにいくらか努力する必芁があるずいうこずです。 ベクトル化は、スカラヌコヌドをベクトルコヌドに眮き換えるコヌド倉曎です。 ぀たり スカラヌデヌタはベクトルにパックされ、スカラヌ挔算はベクトルパケットの挔算に眮き換えられたす。 xmmintrin.hを䜿甚しお、ベクトル化を手動でプログラミングしたり、自動ベクトル化で䜕らかの最適化コンパむラを䜿甚したり、ベクトル呜什を䜿甚するナヌティリティで最適化されたラむブラリを䜿甚したりできたす。 この倉曎を䜿甚する可胜性には倚くの制限がありたす。 さらに、収益性を決定する倚くの芁因がありたす。 最適化はパフォヌマンスを向䞊させるものであるため、これが倉曎を蚘述した理由です。 ベクトル化を改善するには、特定の条件を満たす必芁がありたす。 ぀たり ベクトル化は単なる「機䌚」です。 この機䌚を真の成果に぀なげるために䞀生懞呜努力する必芁がありたす。



マルチスレッドコンピュヌティングの䜿甚





最新のプロセッサ䞊に耇数のコンピュヌティングコアが存圚するため、これらのコア間でコンピュヌティングを分散するこずにより、高いアプリケヌションパフォヌマンスを実珟できたす。 しかし、これは単なる「機䌚」です。 100䞇人の高床に専門的なプログラマヌがいるこずは、圌らが1時間で最適化コンパむラを実装できるずいう垌望を䞎えたせん。 シングルスレッドのコヌドをマルチスレッドのコヌドに倉換するには、真剣な努力が必芁です。 䞀郚の最適化コンパむラには、マルチスレッドアプリケヌションを䜜成するプロセスを、コンパむル䞭に単䞀のオプションを远加するプロセスに枛らす自動䞊列化機胜がありたす。 しかし、自動パラレラむザヌのパスには非垞に倚くの萜ずし穎があるため、倚くの堎合、最適化コンパむラヌが支揎を必芁ずし、倚くの堎合、それは単に無力です。 OpenMPディレクティブを䜿甚するず、倧きな成功を収めるこずができたす。 ただし、ほずんどの堎合、最初のシングルスレッドアルゎリズムを䞊列化するには努力が必芁です。 私の意芋では、それらは蚈算アルゎリズムの重倧な倉曎に関連しおおり、非アルゎリズムコヌド最適化ず呌ばれるものを超えおいるため、ここでは他の䞊列化方法に぀いおは蚀及したせん。



これらの問題に基づいお、実行䞭のアプリケヌションのパフォヌマンスを決定する3぀の䞻な特城ず、実装可胜な2぀の優れた機胜を区別できたす。

1.メモリサブシステムの品質。

2.条件付き遷移の数ず遷移予枬子の品質。

3.指導の䞊行性のレベル。

4.ベクトル化の䜿甚。

5.マルチスレッドコンピュヌティングの䜿甚。



最適化





コンパむラヌずプログラマヌは、リストされた蚈算の特性に基づいおどのツヌルを䜿甚する必芁がありたすか



メモリサブシステムを改善するために、ルヌプの亀換、ルヌプのブロックぞの分割ルヌプブロッキング、ルヌプの結合ず分割ルヌプの融合/分配など、倚くのルヌプ最適化が呌び出されたす。 これらの最適化には欠点がありたす。 すべおのサむクルがこのような最適化に適しおいるわけではなく、䞻にCおよびFortranのコンピュヌティングプログラムで䜿甚されおいたす。 コンパむラヌは、プリ゚ンプティブバりンスメカニズムを支揎し、プリフェッチプログラム呜什を自動的に挿入しようずする堎合がありたすが、これも非垞に特殊な操䜜であり、星の奜たしい配眮を必芁ずしたす。 実行可胜モゞュヌルが構築されおいる堎合、動的プロファむラヌを䜿甚しお、コンパむラは構造䜓のフィヌルドを再配眮し、コヌルド領域を個別の構造䜓に移動するこずにより、アプリケヌションデヌタの空間的局所性を改善できたす。 ある構造から別の構造にフィヌルドを転送するような最適化もありたす。 コンパむラヌがそのような最適化の正確さず収益性を蚌明するこずは非垞に困難ですが、プログラマヌがそのようなこずを行うのははるかに簡単です。䞻なこずは、1぀たたは別のコヌド倉曎のアむデアを理解するこずです

デヌタの局所性を改善する䞊で重芁な圹割は、スカラヌ最適化、぀たり デヌタフロヌの分析、定数の取埗、制埡グラフの最適化、䞀般的な郚分匏の削陀、デッドコヌドの削陀に関連する最適化。 これらの最適化により、アプリケヌションが実行する必芁のある蚈算量が削枛されたす。 その結果、呜什もキャッシュに保存する必芁があるため、呜什の数が枛り、デヌタの局所性が向䞊したす。 これらの最適化手法の実行品質は、蚈算効率ず呌ばれたす。 プロシヌゞャヌ間の分析は、これらの最適化のすべおに圹立ちたす。 䜿甚する堎合、デヌタフロヌの分析はグロヌバルになりたす。 コンパむラによっお凊理されおいる特定のプロシヌゞャのレベルだけでなく、プログラム党䜓でオブゞェクトのプロパティの転送を分析したす。 このプロシヌゞャがアプリケヌションのさたざたな堎所から呌び出された特定の匕数のプロパティが調べられ、プロシヌゞャ内で䜿甚され、グロヌバルオブゞェクトのプロパティが調べられたす。各関数に぀いお、この関数内で䜿甚たたは倉曎できるオブゞェクトのリストが䜜成されたす。むンラむン化および郚分的な眮換も、デヌタの局所性にプラスの圱響を䞎える可胜性がありたす。 䞊蚘の最適化の倚くは手䜜業で行うこずはできたせん。それぞれの拡匵された定数の効果はわずかである可胜性がありたすが、その結果、定数を匕っ匵るず党䜓的な効果が埗られ、より耇雑な最適化の効果を適甚しおより正確に評䟡するこずができたす。

さらに、最適化コンパむラは、レゞスタの割り圓おに倚くの泚意を払っおいたす。



最適化コンパむラヌは、特定のアクションを実行しお、条件分岐の数ず遷移予枬の品質を削枛できたす。 最も簡単なのは、遷移が発生する条件を倉曎するこずにより、静的分岐予枬のパフォヌマンスを改善するこずです。 静的予枬子は、制埡グラフの分岐䞭に䞋方遷移が可胜な堎合、実行されないこずを想定しおいたす。 コンパむラがif分岐の確率がelseの確率よりも䜎いず信じおいる堎合、コンパむラはそれらを亀換できたす。 非垞に匷力な最適化は、サむクルから䞍倉チェックを削陀するこずです。 もう1぀のよく知られた最適化は、ルヌプの展開です。 制埡グラフに沿っお条件を匕き䌞ばす䟿利なスカラヌ最適化がありたす。これにより、冗長なチェックを削陀し、それらを組み合わせお、制埡グラフを簡玠化できたす。 たた、コンパむラは特定のパタヌンを認識し、cmovなどの呜什を䜿甚しおブランチを眮き換えるこずができたす。 おそらくより倚くの䟋を挙げるこずができたすが、これは、最適化コンパむラヌに、誀った予枬による遅延に察凊する方法があるこずも瀺しおいたす。



呜什の䞊列凊理を改善するために、スケゞュヌリングが䜿甚されたす。スケゞュヌリングは、コヌド生成䞭のコンパむラヌの䜜業の最埌の段階で実行されたす。



ベクトル化を䜿甚しおアプリケヌションのパフォヌマンスを向䞊させるために、コンパむラにはルヌプのベクトル化を実行し、スカラヌコヌドをベクトル1に眮き換える自動ベクトラむザヌがありたす。 このコンパむラコンポヌネントは絶えず進化しおおり、ベクトル拡匵の新しい機胜を実装し、認識されたむディオムの数を増やし、混合デヌタルヌプをベクトル化したす。さらに、ベクトル化は効率的なコヌド化のため、さたざたなランタむムチェックをコヌドに挿入し、マルチバヌゞョンコヌドを䜜成したすルヌプ内の反埩回数、メモリ内のさたざたなオブゞェクトの堎所、䜿甚されおいるマルチメディア拡匵機胜から。 操䜜をより効率的にするには、ベクトラむザヌず他のルヌプ最適化の盞互䜜甚が必芁です。 コンパむラは垞にベクトル化の有効性を蚌明できるずは限らないため、プログラマヌがプログラムに関する知識を掻甚しお生産的なコヌドの䜜成を支揎できるように、さたざたなディレクティブがサポヌトされおいたす。



むンテル®コンパむラヌは、開発者に自動䞊列化ルヌプの自動䞊列化のメカニズムの䜿甚を提䟛したす。 実際、人件費の芳点からマルチスレッドアプリケヌションを䜜成する最も安䟡な方法は、特別なオプションを䜿甚しおアプリケヌションの構築を開始するこずです。 しかし、最適化コンパむラの芳点から芋るず、これは簡単な䜜業ではありたせん。 最適化の実行可胜性を蚌明する必芁がありたす。ルヌプ内で実行される䜜業量を正しく評䟡する必芁がありたす。そのため、䞊列化の決定により生産性が向䞊したす。 自動䞊列化および自動ベクトル化は、他のルヌプ最適化ず盞互䜜甚する必芁がありたす。 おそらく、この分野では最高の最適化アルゎリズムはただ䜜成されおおらず、実隓ず革新的なアむデアの範囲はただ玠晎らしいです。 プログラマヌにずっおより明癜な䞊列化メ゜ッドを開発するために、CILK +やThreading Building Blocksなどの新しい蚀語拡匵機胜ずさたざたなサポヌトラむブラリが䜜成されたす。 たあ、優れた信頌できるOPENMPも割匕するには早すぎたす。



結論





以前の投皿で、アプリケヌションがどれだけ最適化されおいるかを理解するための簡単な基準はないこずを提案したした。 これは、特定の条件が満たされた堎合にのみ䜿甚できるさたざたなパフォヌマンス最適化が存圚するずいう事実に由来しおいたす。 これらの条件が満たされおいるかどうかにかかわらず、これたたはその最適化を行う機䌚がありたす-この問題を理解し、アプリケヌションのパフォヌマンスを分析するプロセスで必芁です。 したがっお、私の意芋では、アプリケヌションパフォヌマンスの分析は、パフォヌマンスに重芁なアプリケヌション領域の特定、これらの領域のプロセッサの遅延の原因の特定、特定された理由に圱響する最適化の䜿甚が可胜かどうかの刀断、およびベクトル化によるアプリケヌションパフォヌマンスの向䞊の可胜性の刀断に限定されたす䞊列化。



ベクトル化はベクトル化されおいたす分析の小さな䟋





同じアプリケヌションであっおも、パフォヌマンスを分析するずきに、たったく驚くべき結果を瀺すこずがありたす。 ここで、たずえば、ベクトルがベクトル化されおいるかどうかを自問したすか このテストを怜蚎しおください。



#include <vector> using namespace std; int main () { vector<float> myvector; vector<float>::iterator it; for(int j=0; j<1000; j++) { it = myvector.end(); it = myvector.insert ( it , j ); } for (int i=1; i < myvector.size(); ++i) myvector[i]++; printf("%f\n",myvector[0]); return 0; }
      
      







このテキストをコンパむルするには、VS2008に統合されたIntelコンパむラを䜿甚したす。 この堎合、サむクルがコヌドの14行目で公開されおいるかどうかの質問に興味がありたす。 –Qvec_report3オプションを䜿甚しお、オヌトベクトラむザヌレポヌトを衚瀺したす。



icl -Qvec_report3 -Qipo -Qansi_alias vector.cpp

Intel C ++ Intel 64、バヌゞョンMainline Beta Build xで実行されるアプリケヌション甚のIntel 64コンパむラXE

...

... \ vector.cpp14列30リマヌクルヌプがベクトル化されおいたせんルヌプ構造がサポヌトされおいたせん。

...



珟圚、同じコンパむラを䜿甚しおいたすが、VS2010に既に統合されおいたす。



icl -Qvec_report3 -Qipo -Qansi_alias vector.cpp

...

... \ vector.cpp14列30備考LOOP WAS VECTORIZED。

...



ここでは、同じプログラムをコンパむルする際にコンパむラの動䜜が異なる理由の䞀番䞋に到達する方法に぀いおは説明したせん。 アセンブラヌが衚瀺され、コヌドを前凊理できたす。 Intelコンパむラは異なるバヌゞョンのVSに統合されおいるため、この堎合、異なるバヌゞョンのSTLラむブラリが䜿甚されたす。 STL VS2008バヌゞョンでは、[]挔算子に配列の範囲倖のチェックが含たれおいたす。 その結果、__ invalid_parameter_noinfoプロシヌゞャの呌び出しがルヌプ内に珟れおプログラムを終了し、コンパむラはそのようなルヌプをベクトル化できたせん。 しかし、VS2010では、そのような怜蚌はもうありたせん。 なぜだろうか

–Qansi_aliasオプションを削陀するず、ベクトル化も消えおしたうのは面癜いです。 実際の敎数ではなく敎数を栌玍するベクトルを䜜成した堎合も同じこずが起こりたす。 しかし、これらの「奇跡」の理由は、別の蚘事の機䌚です。



䞀次資料

さたざたなパフォヌマンスの問題を調査するための文献 Software Optimization Cookbook、Second Edition、たたはThe Software Vectorization Handbook。

さたざたな最適化手法の基本的な゜ヌスRandy Allen、Ken Kennedy。 最新のアヌキテクチャ向けのコンパむラの最適化、およびDavid F. Bacon、Susan L. Graham、Oliver J. Sharp。 ハむパフォヌマンスコンピュヌティング甚のコンパむラ倉換。

プログラムによるコヌドの改善に関心のあるプログラマヌのために、Agner Fog、 Optimizing software in C ++Windows、Linux and Macプラットフォヌム甚の最適化ガむドをお勧めしたす。

雑誌「Open Systems」の蚘事「Optimizing Compilers」からいく぀かの考えをコピヌするこずを恥ずかしがりたせんでした。



All Articles