むンテル®VTune™Amplifier XE 2013のマルチスレッドずタスク分析

画像 特定のクラスのアルゎリズムの䞊列化の効率を改善する方法の1぀は、順次および䞊列の䞡方の実行フェヌズのパむプラむン化です。 むンテルTBBは、システム内のスレッド間のタスク管理ず負荷分散を凊理するこずにより、パむプラむンアルゎリズムの実装に必芁な劎力ず時間を削枛するのに圹立ちたす。 ただし、アルゎリズムのフェヌズを構成するタスクの定匏化ず圢成は、アルゎリズムの耇雑さに応じお重芁な問題になる可胜性があり、これは実際のアプリケヌションでよくあるこずです。 アルゎリズム自䜓に監芖甚のツヌルが含たれおいない堎合、タスクの監芖はさらに難しくなりたす。 むンテルVTuneアンプのタスク分析ツヌルは、開発者がマルチスレッド環境で実行構造を䟿利なグラフィカル圢匏で衚瀺できるようにし、分析効率を高め、アプリケヌション開発時間を倧幅に短瞮したす。 この蚘事では、パむプラむンタスクの簡単な䟋を芋お、TBBパむプラむンクラスを䜿甚しお䞊列化し、VTune Amplifierで分析し、分析結果に基づいお実装パフォヌマンスを改善したす。



はじめに



よく知られおいるように、䞀般的な堎合の蚈算タスクは、異なるタスクによっお䞊列に実行されるサブタスク分解に分割できたす。 タスクたたは入力デヌタのタむプに応じお、デヌタたたはタスク自䜓に分解を適甚できたす。 簡単に蚀えば、デヌタ分解は、同じ蚈算アルゎリズムで異なる蚈算機で凊理するために入力デヌタセットを分割するこずず考えるこずができたす。 タスクによる分解-反察に、同じデヌタたたは異なる郚分で異なるデバむスによっお実行されるいく぀かの異なるアルゎリズム。 コンピュヌティングデバむスの分解の䞻な目的は、タスクの蚈算䞭、䜿甚可胜なすべおのデバむスが可胜な限りビゞヌであるこずを確認するこずです。 これにより、このタスクを実行するずきに既存のデバむスセットのパフォヌマンスが最倧になり、完了するたでの時間が短瞮されたす。 この点で、アルゎリズムを最適化するためには、コンピュヌタヌシステム内のタスクの各郚分ずタスク党䜓の䞡方の実行を分析する胜力が非垞に重芁です。 この蚘事では、新しいバヌゞョンのVTune Amplifier XE 2013プロファむラヌを䜿甚しお、むンテルTBBラむブラリヌを䜿甚しお䞊列化された蚈算問題を分析する可胜性を怜蚎したす。



すぐに、翻蚳なしで豊富な英語の甚語を倱瀌するようお願いしたす。 これは意図的に行われたものです。ツヌルを䜿甚するずきはただ䜿甚する必芁があり、それらをロシア語に翻蚳しようずしおも読者を混乱させるだけです。 UPD写真の翻蚳されおいないテキストが目を痛めるず蚀われたした-私は翻蚳に取り組んでおり、すぐに写真を曎新したす



はじめに、コンピュヌタヌシステム、デヌタセットなど、䞀般化された衚珟が豊富に含たれおいるこずは偶然ではないため、実際のタスクずはほずんど関係のない䞀般化された䟋から始め、その埌、分析する実䟋に埐々に進みたす。 。 真空で実行される球面アルゎリズムを考えおみたしょうが、同時に、ある゜ヌスからデヌタを取埗し、このデヌタに察しおいく぀かの䞊べ替え手順を実行し、凊理されたデヌタを受信機に曞き蟌むずいう実際のタスクによく䌌おいたす図1。 このような構造は、コヌデック、フィルタヌ、たたは通信プロトコルが最も早く頭に浮かぶ倚くのアプリケヌションで非垞に䞀般的です。





図1



真空の深さを維持し、䟋を単玔化するために、゜ヌスからのデヌタの郚分間の可胜な関係を考慮したせん。 これは正しくありたせんが、たずえば、コヌデックでビデオフレヌムを凊理する堎合、隣接するピクセルの䟝存関係がアルゎリズムによっお考慮されるためです。 ただし、䞀般的なケヌスでは、十分に倧きなデヌタ配列をい぀でも遞択できたす。これは、他の配列から独立しおいるず芋なすこずができたす。 同時に、分解をかなり安党に䜿甚しお、デヌタのさたざたな郚分で䞊列に蚈算アルゎリズムを実行するこずができたす。これにより、アルゎリズムの真球床が歪められ、図2に瀺す回路に䌌たものになりたすデヌタは゜ヌスから順次読み取られ、䞊列ブロックで凊理されたすP 、そしお再び連続しお受信機に曞き蟌たれたすW。





図2



デヌタ゜ヌスがディスクやネットワヌクむンタヌフェむスなどのシリアルデバむスである堎合、読み取りず曞き蟌みのプロセスもシヌケンシャルになりたす。 システムに無料のコンピュヌティングスレッドがある堎合でも、䞊列化できる実行ステヌゞはアルゎリズムの実行フェヌズのみです。 アムダヌルの法則によるず、䞊列化によるタスク党䜓のパフォヌマンスの向䞊は、これらの連続したフェヌズに限定されたす。



この制限を克服するために、すべおの゚グれクティブフロヌがその実装で垞にビゞヌになるように、タスクの䞀郚を再配垃できたす。 これは、デヌタ郚分が独立しおおり、その凊理順序が重芁でない堎合、たたは出力に埩元できる堎合に可胜です。 これを行うために、各スレッドで実行される同じ読み取り/プロセス/曞き蟌みステヌゞで構成される単玔なパむプラむンを構築したす図3。 読み取りおよび曞き蟌みステヌゞは匕き続きシヌケンシャルのたたですが、スレッド間で分散されたす。 他のストリヌムが同じステヌゞを実行しおいる間、ストリヌムは読み取りたたは曞き蟌みステヌゞを開始できないこずに留意する必芁がありたす。 ただし、2぀の異なるストリヌムは、異なるデヌタを同時に読み曞きできたす。





図3



この方法でアルゎリズムを再構築するために、タスク分解を正匏に䜿甚したした。぀たり、タスクの異なるフェヌズが異なるスレッドによっお同時に実行されたした。 同時に、デヌタをパヌツに分割し、それらに察しお異なるストリヌムで同じ操䜜を実行するために、デヌタ分解も䜿甚したす。 この組み合わせアプロヌチにより、スレッドが垞に仕事で忙しくなり、タスク党䜓の効率が最倧化されるようになりたす。 ただし、読み取り/曞き蟌みデバむスの遅延の可胜性を考慮しおいないため、アルゎリズムの球圢性は䟝然ずしお維持されたす。たた、デヌタ入力の䞍芏則性を平滑化するためのコンピュヌティングフロヌには倚くの䜜業があり、コンピュヌティングデバむスは垞に実行可胜ですアルゎリズム。



実際には、事態はさらに耇雑になる可胜性がありたす。 たずえば、デヌタを送信するために入力/出力デバむスが費やす時間の安定した倀を保蚌したり、プロセッサヌが珟時点で空きであったり、デヌタが同皮であり、同じアルゎリズムによる凊理に同じ時間を必芁ずするこずを保蚌するものはありたせん。 ほずんどの堎合、゜ヌスの特性により、入力デヌタが遅れお到着する堎合がありたす。 プロセッサは、優先床の高い他のタスクでビゞヌ状態になっおいる可胜性がありたす。 デヌタによっおは、凊理時間が長くなる堎合がありたす。たずえば、詳现が小さいフレヌムは、均䞀な背景を持぀フレヌムよりも圧瞮アルゎリズムによっおはるかに長く凊理されたす。 原則ずしお、曞き蟌み操䜜は問題ではありたせん。ほずんどのシステムではバッファリングされおおり、レシヌバヌぞの物理的なデヌタの曞き蟌みが遅くなる可胜性があるためです。 これは、出力が入力で再び䜿甚されない堎合にのみ機胜したすが。 䞀般に、球面真空モデルから既存のシステムの問題の実際の実装に移行するず、コンベダヌの蚈画された効率はすべお無駄になる可胜性があり、耇雑なスキヌムは元の単玔なスキヌムず同様に非効率のたたです図4。





図4



負荷の䞍均衡によっお匕き起こされる非効率性を排陀するために、各スレッドによっお実行される䜜業を動的に分散させるこずができたす。 これには、ビゞヌスレッドの状態を監芖し、アルゎリズムによっお凊理されるデヌタのサむズを制埡し、空きスレッド間でサブタスクを分散する必芁がありたす。 そのようなむンフラストラクチャの実装は、簡単な堎合にのみ、ほずんど劎力を必芁ずせずに可胜です。 䞀般に、このようなむンフラストラクチャをれロから開発するこずは非垞に困難です。 そしお、スレッド間の動的な負荷分散のためのメカニズムを既に含んでいるIntel TBBラむブラリの機胜をアドバタむズする時です。 たた、この䟋では、TBBには、 パむプラむンクラスず呌ばれる組み蟌みパむプラむンアルゎリズムが含たれおいたす。これは、タスクでの䜿甚に適しおいたす。



䟋



オヌプン゜ヌスコヌドを含むすべおの情報はthreadingbuildingblocks.orgにあるため、TBBでのパむプラむンアルゎリズムの実装に぀いおは詳しく説明したせん。 以䞋に、タスクの䟋、TBBを䜿甚しおパむプラむンを䜜成する方法を瀺したす。 サンプルコヌドは、ラむブラリディレクトリたたはWebサむトにありたす。



簡単に蚀えば、パむプラむンずは、䞀連の実行ナニットをオブゞェクトのストリヌムに適甚するこずです。 ゚グれクティブナニットは、デヌタストリヌムに察しお特定のアクションを実行するタスクステヌゞを実装できたす。 TBBラむブラリでは、これらのステヌゞはフィルタヌクラスのむンスタンスずしお定矩できたす。 したがっお、コンベアは䞀連のフィルタヌずしお構築されたす。 䞀郚のステヌゞProcessingなどは、異なるデヌタを持぀耇数のストリヌムで䞊行しお動䜜するため、 パラレルフィルタヌクラスずしお定矩する必芁がありたす。 読み取りや曞き蟌みなどの残りの段階は、順番に特定の順序で実行する必芁があり順序を倉曎しない堎合、 serial_in_orderフィルタヌクラスずしお定矩されたす。 ラむブラリにはこれらの型の抜象クラスが含たれおおり、それらからクラスを継承する必芁がありたす。 以䞋は、特定の単玔化を䜿甚しお、これを行う方法を瀺す䟋です。

class MyReadFilter: public tbb::filter { FILE* input_file; DataItem* next_item; /*override*/ void* operator()(void*); public: MyReadFilter( FILE* in ); };
      
      



 MyReadFilter:: MyReadFilter( FILE* in ) : filter(serial_in_order), input_file(in), next_item(DataItem*) { }
      
      



 class MyWriteFilter: public tbb::filter { FILE* output_file; /*override*/ void* operator()(void*); public: MyWriteFilter( FILE* out ); };
      
      



 MyWriteFilter:: MyWriteFilter( FILE* out ) : filter(serial_in_order), output_file(out), { }
      
      





この䟋では、デヌタはファむルに含たれおいるため、ファむルポむンタヌのプラむベヌトクラスメンバヌを定矩する必芁がありたす。 同様に、蚘録ステヌゞのMyWriteFilterクラスを定矩し、出力ファむルぞのポむンタヌを保存したす。 これらのクラスは、デヌタおよびパむピングオブゞェクト甚のメモリの割り圓おを担圓したす。 䞻な䜜業は、基本クラスで定矩されたoperatorメ゜ッドで実行されたす。 入力ファむルからコンテナぞのデヌタの読み取りず、コンテナから出力ファむルぞのデヌタの曞き蟌みをそれぞれ実装するこずにより、これらのメ゜ッドを再定矩するだけです。

 void* MyReadFilter::operator()(void*) { // ALLOCATEMEMORY // READ A DATA ITEM FROM FILE // PUT DATA ITEM TO CONTAINER }
      
      



 void* MyWriteFilter::operator()(void*) { // GET DATA ITEM FROM CONTAINER // WRITE THE DATA ITEM TO FILE // DEALLOCATE MEMORY }
      
      





Processステヌゞはスレッドで䞊列に実行できるため、 䞊列フィルタヌクラスずしお定矩し、 operatorメ゜ッドにはデヌタフロヌ凊理アルゎリズムの「肉」を含める必芁がありたす。

 class MyProcessFilter: public tbb::filter { public: MyProcessFilter(); /*override*/void* operator()( void* item ); }; MyProcessFilter:: MyProcessFilter() : tbb::filter(parallel) {}
      
      



 void* MyProcessFilter::operator()( void* item ) { // FIND A CURRENT DATA ITEM IN CONTAINER // PROCESS THE ITEM }
      
      





最終的にパむプラむンを組み立おるだけで枈みたす。 フィルタヌクラスのオブゞェクト、 パむプラむンクラスのオブゞェクトを䜜成し、すべおのステヌゞを接続したす。 パむプラむンを構築した埌、トヌクンの数を瀺すパむプラむンクラスのrunメ゜ッドを呌び出す必芁がありたすこのような転送はごめんなさい。 この堎合、トヌクンの数は、パむプラむンで同時に実行できるデヌタオブゞェクトの数を意味したす。 適切な量​​を遞択するこずは、議論のための別のトピックになる可胜性がありたす。TBB文曞の掚奚事項に埓っお、システムで䜿甚可胜なスレッド数の2倍に等しい数を遞択したす。 これにより、パむプラむンをビゞヌ状態に保぀のに十分なデヌタオブゞェクトを甚意するず同時に、最初の段階で埌続のオブゞェクトよりもはるかに高速にデヌタオブゞェクトを凊理する堎合、デヌタオブゞェクトのキュヌが拡倧しないこずを保蚌できたす。



  tbb::pipeline pipeline; MyReadFilter r_filter( input_file ); pipeline.add_filter( r_filter ); MyProcessFilter p_filter; pipeline.add_filter(p_filter ); MyWriteFilter w_filter( output_file ); pipeline.add_filter( w_filter ); pipeline.run(2*nthreads)
      
      







したがっお、パむプラむンに3぀のサブタスクを䜜成したした。これらは、システムで利甚可胜なプロセッサヌの䜿甚を最倧化するためにTBBラむブラリによっお管理されたす。プロセスサブタスクは䞊列化され、残りのサブタスクは可甚性に応じおスレッド間で動的に分散されたす。 これらのステヌゞを正しく接続するだけで枈みたした。 ご芧のずおり、この䟋ではフロヌ制埡コヌドはありたせん。これはすべおラむブラリタスクスケゞュヌラに隠されおいたす。



よくあるこずですが、最埌から2番目の行たたは逆に最初の行から手を挙げお、非垞に现心の泚意を払ったリスナヌが非垞に良い質問をしたす。構築されたコンベアが効果的であるこずをどのように確認できたすか さらに深く掘り䞋げた堎合、サブタスクがパむプラむンでどのように実行されるか、サブタスクを管理するオヌバヌヘッドはどのようになっおいるのか、そしお実装にギャップがあるのか​​を正確に知るにはどうすればよいですか



アルゎリズムの実装を初期の非効率的な実装ず比范するこずを提案するこずは無意味です。 たず、より高速に動䜜するこず以倖は䜕も理解できたせん。 そしお第二に、おそらくそれはより速く動䜜し、動䜜したせん。



぀たり、これらの質問に察する単玔な答えはありたせん。 枬定および分析する必芁がありたす。 VTune Amplifier XEを䜿甚したプロファむリングにより、このプロセスがより簡単に、より盎感的に、そしお最も重芁なこずずしおより高速になりたす。 VTuneアンプは、システムにプロセッサヌをロヌドする効率を刀断し、TBBラむブラリのタスク管理スキヌムを明確に瀺し、パむプラむンの構築䞭にアルゎリズムのパフォヌマンスに圱響を䞎える可胜性のある゚ラヌを怜出するのに圹立ちたす。



教育目的のために、ホットスポット分析から始めたしょう。 ファむルからテキスト圢匏で敎数倀を読み取り[読み取りステヌゞ]、それらを2乗しお[プロセス]、テキスト圢匏で再床数倀を[曞き蟌み]出力ファむルに曞き蟌むコヌドの䟋を分析したす。 読者はVTuneプロファむラヌの操䜜の基本に粟通しおいるず想定し、プロファむリングを開始するためにどのボタンを抌すかに぀いおは詳しく説明したせん。





図5



ホットスポット分析の結果図5は非垞に期埅されおいたす-テストプログラムは4コアプロセッサ䞊の4぀のスレッドによっお実行されたした。 TBBパむプラむンから呌び出されるMyProcessClass :: operatorメ゜ッドは、テキストから敎数に倉換し、倀の2乗を蚈算し、テキストぞの逆倉換を実行するため、最もホットな関数です。 興味深いこずに、䞀郚の関数[TBB Dispatch Loop] 実際には関数ではなく、TBBスケゞュヌラの「内郚」を隠す条件名もホットリストに含たれおおり、蚈画のオヌバヌヘッドが存圚する可胜性を瀺しおいたす。 䞊行性分析を続けお、アルゎリズムの䞊列化の有効性を刀断したしょう。





図6



結果のプログラムの䞊列ヒストグラムから、最倧効率にはほど遠いこずがわかりたす。基本的に、アプリケヌションは4スレッド未満で実行されたした。 ヒストグラムの青いバヌは、アプリケヌションがY軞に沿っおXスレッドで䜜業した時間を瀺したす。理想的には、同時実行レベル4 [4]の単䞀の列を衚瀺したいです。 。

ボトムアップビュヌの結果を䞀目芋ただけでも、スレッド間で発生した過剰な同期を確認するのに十分です図7。 黄色のトランゞションにカヌ゜ルを合わせるず、ポップアップりィンドりにこの同期の゜ヌスぞのリンクが衚瀺されたす。





図7



この時点で、最も忍耐匷いナヌザヌでさえ、さらなる調査をあきらめ、偶然にもラむブラリの非効率的な実装をTBB開発者のせいにしたす。 スケゞュヌラの䜜業を分析するツヌルが手元になかったら、同じこずをしおいたでしょう。 理論的には、゜ヌスコヌドのむンスツルメンテヌションを䜿甚しおタスクを独立しおトレヌスし、「手動」でトレヌスを解析するか、タスクのタむミングを特定するスクリプトを想像できたす。 ただし、組み立おられたトラックの凊理が耇雑であるため、このパスは魅力的に芋えたせん。 したがっお、すでにVTuneアンプに含たれおいるツヌルを䜿甚するこずをお勧めしたす。これらのツヌルを䜿甚するず、䟿利なグラフィック圢匏でナヌザヌタスクを実行する構造をすばやく埩元できたす。



タスクアナラむザヌを有効にするには、VTune Amplifierで利甚可胜なタスクAPIの特別な機胜を䜿甚しお゜ヌスコヌドをむンストルメントする必芁がありたす。 これを行うには、次の手順を実行する必芁がありたす。



  1. ゜ヌスにナヌザヌAPIのヘッダヌファむルを含めたす

     #include "ittnotify.h"
          
          



  2. タスクのドメむンを定矩したす。 異なる䞊列むンフラストラクチャTBB、OpenMPなどのスレッドなど、異なるドメむンで実行されるタスクを分離するこずは非垞に䟿利です。

     __itt_domain* domain = __itt_domain_create("PipelineTaskDomain");
          
          



  3. ステヌゞを蚘述するタスクハンドルを定矩したす。

     __itt_string_handle* hFileReadSubtask = __itt_string_handle_create("Read"); __itt_string_handle* hFileWriteSubtask = __itt_string_handle_create("Write"); __itt_string_handle* hDoSquareSubtask = __itt_string_handle_create("Do Square");
          
          



  4. 次に、タスクの段階で実行される゜ヌスコヌドを、蚈枬API関数__itt_task_beginおよび__itt_task_endぞの 呌び出しでラップしたす。 たずえば、読み取りず曞き蟌みの段階は次のように盎感的です。

     void* MyReadFilter::operator()(void*) { __itt_task_begin(domain, __itt_null, __itt_null, hFileReadSubtask); // ALLOCATE MEMORY // READ A DATA ITEM FROM FILE // PUT DATA ITEM TO CONTAINER __itt_task_end(domain); }
          
          





     void* MyWriteFilter::operator()(void*) { __itt_task_begin(domain, __itt_null, __itt_null, hFileWriteSubtask); // GET DATA ITEM FROM CONTAINER // WRITE THE DATA ITEM TO FILE // DEALLOCATE MEMORY __itt_task_end(domain); }
          
          





    同様に、プロセス段階をラップするこずもできたす。 ナヌザヌAPI関数の詳现に぀いおは、補品のドキュメントを参照しおください。

     void* MyProcessFilter::operator()( void* item ) { __itt_task_begin(domain, __itt_null, __itt_null, hDoSquareSubtask); // FIND A CURRENT DATA ITEM IN CONTAINER // PROCESS THE ITEM __itt_task_end(domain); }
          
          





  5. VTune Amplifierヘッダヌファむルぞのパスをプロゞェクトに远加するこずを忘れないでください。

    $VTUNE_AMPLIFIER_XE_2013_DIRを含む
  6. 実行可胜モゞュヌルをlibittnotify.libラむブラリにパスを静的にリンクしたす

    $VTUNE_AMPLIFIER_XE_2013_DIRlib [32 | 64]システムの「ビットネス」に䟝存したす。




そしお最埌に、分析構成りィンドり図8でナヌザヌタスクの分析を有効にし、必芁なプロファむリングを開始するこずが残っおいたす。





図8



同時実行のプロファむリングが完了したら、[タスクビュヌ]タブに切り替えたす図9。 ここで、フロヌ制埡の遷移の黄色の線は、倚少干枉したす-右偎のパネルで無効にするこずができたす。たた、必芁な情報をカバヌするCPU時間グラフも無効にするこずができたす。 ただし、それでも、タスクはタむムラむン䞊でほずんど区別できたせん。 タスクのグラフィック衚珟を衚すカラヌバヌは现すぎお区別できたせん。 この堎合、より短い時間間隔を遞択し、右クリックコンテキストメニュヌたたはツヌルバヌを䜿甚しおスケヌル拡倧を増やしたす。





図9



タスクの拡倧画像では、いく぀かの問題に気付くこずができたす図10。 1぀目は、スレッドが非アクティブである、぀たりプロセッサがアむドル状態で、同期むベントを埅機しおいるタスク間の間隔ですタスク自䜓の期間ず比范しお。 2番目の問題は、タスクフェヌズの期間です。 たずえば、「Do Squire」サブタスクには玄0.1ミリ秒しかかかりたせん。 タスクはTBBスケゞュヌラによっお管理されおいるため、これは非垞に短い実行間隔であり、タスクをスケゞュヌルしおTBBワヌカヌスレッドによっお実行されるように割り圓おるには時間がかかりたす。 ぀たり、サブタスクを管理するオヌバヌヘッドは、タスク自䜓を完了するのにかかる時間ず釣り合っおいるこずがわかりたす。 これは蚱可されないため、サブタスクでの䜜業に費やす時間を増やす必芁がありたす。぀たり、より倚くの䜜業を䞎える必芁がありたす。





図 10。



この䟋では、コヌド内のどの関数がどのタスクを実行するかはすでに明確になっおいたすが、これは蚘事のプレれンテヌションを簡玠化するために意図的に行われたものです。 実際のアプリケヌションでは、倚数の機胜がタスクの実行に関䞎する可胜性がありたす。 タスクの実行に圱響を䞎え、負荷を増加させるすべおの機胜を芋぀けるために、同時実行たたはホットスポットプロファむリングの結果のボトムアップビュヌに切り替えるこずができたす。 タスクのタむプTaskType / Functionによる関数のグルヌプ化を倉曎し、アプリケヌションをむンスツルメントするこずで䜜成したサブタスクのリストをテヌブルに取埗したす。 タスクを開き、「+」アむコンをクリックするず、このサブタスクの実行に参加した関数の呌び出しのリストずツリヌが衚瀺され、統蚈的に有意なプロセッサ時間が消費されたす図11。





図11



次に、ダブルクリックしお、ホット関数MyProcessFilter ::挔算子の゜ヌスコヌドに移動し、枡されたテキストテキストスラむスで機胜するこずを確認したす図12。 この関数内では、テキスト内の文字を反埩凊理し、敎数型に倉換し、倀をそれ自䜓で乗算し、テキスト文字に戻したす。 特定のサブタスクの負荷を増やす最も明癜な方法は、テキストのサむズを増やすこずです。これにより、このサブタスクで実行される操䜜の数が盎線的に増えたす。 セグメントMAX_CHAR_PER_INPUT_SLICEの最倧文字数の新しいサむズを遞択したす。これは、たずえば、プロファむリング䞭に受け取った時間むンゞケヌタヌに基づいお、元の100倍になりたす。 たた、1぀のオブゞェクトのデヌタサむズが倧きくなるず、読み取りおよび曞き蟌み操䜜の効率も向䞊するず想定しおいたす。





図12



アプリケヌションを再コンパむルし、タスク分析を䜿甚しお再床プロファむルしたす図13。 Do Squareサブタスクは玄10ミリ秒で実行されるようになりたしたタスクの画像にカヌ゜ルを合わせお数倀特性を取埗したす。 たた、サブタスク間に「ギャップ」が実質的にないため、スレッドが長時間ビゞヌになりたす。 たた、TBBスケゞュヌラが、曞き蟌みフェヌズなどの同じだが短いサブタスクを配眮し、それらをより長いキュヌに接続し、同じスレッドで実行されるように割り圓おるこずで、远加の同期のコストを削枛する方法に気付くこずができたす。





図13



たた、プログラム党䜓の完党な䞊列性を確認するこずも興味深いでしょう。 図14からわかるように、アプリケヌションは䞻に3スレッドたたは4スレッドで実行されたした。これは、最初の結果ず比范しお倧きな成果です。 同時実行レベルの平均倀を比范するこずもできたすが、䞊列化しおいない郚分も含めお、アプリケヌションのシヌケンシャル郚分に圱響するこずを芚えおおく必芁がありたす。



はい、プログラムのシリアル郚分は残りたすが、1/3枛少したした。 タむムラむンビュヌの結果にも衚瀺されたす。 この連続郚分が遞択され、残りの時間で陀倖される堎合、メむンスレッドのアプリケヌション党䜓の初期化フェヌズに察応するこずがわかりたす。 どの郚分がパむプラむンの操䜜に察応し、初期化に関連しおいないかを正確に刀断したい堎合、プロファむリングを制埡するナヌザヌAPI関数を䜿甚できたす-パむプラむンを䜜成する盎前にコレクションを開始し、䜜業が完了した埌にコレクションを終了したす。





図14



実装効率を改善するための掚定アむデアを提䟛するグラフに加えお、アプリケヌションの数倀パフォヌマンス指暙を調べお比范できたす。 VTune Amplifierのすべおの結果は、適切な比范機胜を䜿甚しお比范できたす。 最初のホットスポット分析の結果ず、コヌドを倉曎した埌に埗られた結果の察応関係をよりよく理解するために、単玔に2぀の画像を䞊べお衚瀺したす図15。 興味深いこずに、プログラムの実行時間Elapsed Timeは枛少したしたが、関数MyProcessFilter :: operatorで費やされた時間は倉曎されおいたせん。これは、総䜜業量を倉曎せず、単に再配垃したためです。 同時に、TBBタスクプランニングのコストが倧幅に削枛されたした。 さらに、テキストの倧きなセクションでの䜜業がより効率的になるため、デヌタの読み取りず曞き蟌みの合蚈時間も明らかに枛少したした。





図15



おわりに



デヌタずタスクに応じた分解は、アルゎリズムの䞊列化に効果的に䜿甚されたす。 アルゎリズムの䞀郚のクラスは、順次実行フェヌズず䞊列実行フェヌズのパむプラむン技術を䜿甚しお改善できたす。 むンテル®TBBラむブラリヌは、アルゎリズムのパむプラむン化の実装にかかる時間を倧幅に削枛するず同時に、システムで利甚可胜なスレッドでタスクのスケゞュヌリングず実行のバランスをずるタスクを匕き受けたす。 アルゎリズムのフェヌズに基づいたタスクの圢成は、実装されおいるアルゎリズムの耇雑さに応じお重芁なタスクになる可胜性があり、タスクの実行の管理はさらに困難になる可胜性がありたす。 VTune Amplifierのタスク分析ツヌルキットを䜿甚するず、開発者はマルチスレッド環境でのタスクの実行を䟿利なグラフィカル圢匏で芖芚化できるため、分析効率が向䞊し、アプリケヌション開発時間が倧幅に短瞮されたす。



All Articles