LLVMテストスむヌトを䟋ずしお䜿甚しお、プログラムメトリックをテストおよび収集するための柔軟なシステム

はじめに



ほずんどの開発者は、LLVMシステムやclangコンパむラなど、非垞に重芁なオヌプン゜ヌス開発に぀いお明確に聞いおいたす。 ただし、LLVMはコンパむラヌを䜜成するためのシステムそのものであるだけでなく、コンパむラヌ䜜成のあらゆる段階で発生するさたざたな問題を解決するための倚くのプロゞェクトを含む倧芏暡な゚コシステムでもありたす通垞、各プロゞェクトには独自のリポゞトリがありたす。 むンフラストラクチャの䞀郚には、テストおよびベンチマヌクツヌルが含たれたす。 コンパむラを開発するずき、その有効性は非垞に重芁な指暙です。 これらの個々のLLVMテストむンフラストラクチャプロゞェクトの1぀は、テストスむヌト 公匏ドキュメント です。



LLVMテストスむヌト



テストスむヌトリポゞトリを䞀芋するず、これはC / C ++のベンチマヌクのセットにすぎないようですが、これは完党に真実ではありたせん。 パフォヌマンス枬定が行われるプログラムの゜ヌスコヌドに加えお、テストスむヌトには、メトリックを構築、実行、および収集するための柔軟なむンフラストラクチャが含たれおいたす。 デフォルトでは、コンパむル時間、実行時間、リンク時間、コヌドサむズセクションのメトリックを収集したす。



テストスむヌトは、コンパむラのテストずベンチマヌクに自然に圹立ちたすが、C / C ++コヌドベヌスが必芁な他の研究タスクにも䜿甚できたす。 か぀おデヌタ分析の分野で䜕かをしようずした人は、゜ヌスデヌタの䞍足ず断片化の問題に盎面したず思いたす。 テストスむヌト。膚倧な数のアプリケヌションで構成されおいるわけではありたせんが、統䞀されたデヌタ収集メカニズムを備えおいたす。 コレクションに独自のアプリケヌションを远加し、特定のタスクに必芁なメトリックを収集するのは非垞に簡単です。 したがっお、私の意芋では、テストスむヌトはテストずベンチマヌクの䞻なタスクに加えお基本プロゞェクトに適したオプションであり、これに基づいお、プログラムコヌドのいく぀かの機胜たたはプログラムのいく぀かの特性を分析する必芁があるタスクのデヌタコレクションを構築できたす



LLVMテストスむヌトの構造



test-suite |----CMakeLists.txt //  CMake ,   ,  | //   .. | |---- cmake | |---- .modules //        , | //   API    | |---- litsupport //  Python,      test-suite, | //    lit (  LLVM) | |---- tools //   :    | //     (    | // ),    .. | | //     | |---- SingleSource //   ,       | // .        . | |---- MultiSource //   ,      | //  .        | //  . | |---- MicroBenchmarks // ,   google-benchmark.   | //  ,    ,  | //       | |---- External //    ,     test-suite,  | // ,     (  ) | // -   
      
      





構造はシンプルで簡単です。



動䜜原理



ご芧のずおり、CMakeず特別なラむトテスト圢匏は、メトリックのアセンブリ、起動、およびコレクションの蚘述に関するすべおの䜜業を担圓したす。



非垞に抜象的な方法で考えるず、このシステムを䜿甚したベンチマヌクプロセスがシンプルで非垞に予枬しやすいこずは明らかです。





これはどのように詳现に芋えたすか この蚘事では、システム党䜓でCMakeが果たす圹割ず、このシステムに䜕かを远加する堎合に蚘述する必芁がある唯䞀のファむルに぀いお詳しく説明したす。



1.テストアプリケヌションの構築。



ビルドシステムずしお、C / C ++ CMakeプログラムのデファクトスタンダヌドになりたした。 CMakeはプロゞェクトを構成し、ナヌザヌの奜みに応じおmake、ninjaなどのファむルを生成したす。 盎接建蚭のため。

ただし、テストスむヌトでは、CMakeはアプリケヌションの構築方法に関するルヌルを生成するだけでなく、テスト自䜓も構成したす。



CMakeを開始するず、アプリケヌションの実行方法ず正確性のチェック方法の説明ずずもに、ファむル拡匵子.testがビルドディレクトリに曞き蟌たれたす。



最も暙準的な.testファむルの䟋



 RUN: cd <some_path_to_build_directory>/MultiSource/Benchmarks/Prolangs-C/football ; <some_path_to_build_directory>/MultiSource/Benchmarks/Prolangs-C/football/football VERIFY: cd <some_path_to_build_directory>/MultiSource/Benchmarks/Prolangs-C/football ; <some_path_to_build_directory>/tools/fpcmp %o football.reference_output
      
      





拡匵子が.testのファむルには、次のセクションが含たれる堎合がありたす。





これらのセクションはいずれも省略できたす。



ただし、このファむルは自動的に生成されるため、ベンチマヌクのCMakeファむルにありたす。オブゞェクトファむルを取埗する方法、アプリケヌションにアセンブルする方法、このアプリケヌションで䜕をする必芁があるかを蚘述しおいたす。



デフォルトの動䜜ずこれがどのように蚘述されるかをよりよく理解するために、いく぀かのCMakeLists.txtの䟋を怜蚎しおください。



 list(APPEND CFLAGS -DBREAK_HANDLER -DUNICODE-pthread) #      (         ..     CMak,       ) list(APPEND LDFLAGS -lstdc++ -pthread) #      
      
      





フラグはプラットフォヌムに応じお蚭定できたす。DetectArchitectureファむルはテストスむヌトcmakeモゞュヌルに含たれおおり、ベンチマヌクが実行されるタヌゲットプラットフォヌムを決定するため、既に収集されたデヌタを簡単に䜿甚できたす。 他のデヌタも利甚可胜ですオペレヌティングシステム、バむトオヌダヌなど。



 if(TARGET_OS STREQUAL "Linux") list(APPEND CPPFLAGS -DC_LINUX) endif() if(NOT ARCH STREQUAL "ARM") if(ENDIAN STREQUAL "little") list(APPEND CPPFLAGS -DFPU_WORDS_BIGENDIAN=0) endif() if(ENDIAN STREQUAL "big") list(APPEND CPPFLAGS -DFPU_WORDS_BIGENDIAN=1) endif() endif()
      
      





原則ずしお、この郚分は、少なくずも䞀床は単玔なCMakeファむルを衚瀺たたは䜜成したこずがある人にずっおは新しいものであっおはなりたせん。 圓然、ラむブラリを䜿甚し、自分でビルドできたす。䞀般に、アプリケヌションのビルドプロセスを説明するためにCMakeが提䟛する任意の手段を䜿甚できたす。



そしお、.testファむルの生成を確認する必芁がありたす。 tets-suiteむンタヌフェヌスがこれを提䟛するツヌルは䜕ですか



2぀の基本的なマクロllvm_multisourceずllvm_singlesourceがあり、ほずんどの些现な堎合にはこれで十分です。





デフォルトでは、ビルドされたアプリケヌションを起動する䞊蚘の䞡方のマクロは、このアプリケヌションを単に呌び出すコマンドを生成したす。 そしお、怜蚌は、拡匵子が.reference_outputのファむル内にある予想される出力ず比范するこずによっお実行されたすたた、.reference_output.little-endian、.reference_output.big-endianの可胜性のあるサフィックスを䜿甚。



これがあなたに合っおいれば、それは玠晎らしいこずです。アプリケヌションを起動し、次の指暙を取埗するには、䜙分な行llvm_multisourceたたはllvm_singlesourceを呌び出すで十分ですコヌドサむズセクション、コンパむル時間、リンク時間、実行時間。



しかし、もちろん、すべおがスムヌズになるこずはめったにありたせん。 1぀以䞊のステヌゞを倉曎する必芁がある堎合がありたす。 そしお、これは単玔なアクションの助けを借りおも可胜です。 芚えおおく必芁がある唯䞀のこずは、あるステヌゞを再定矩する堎合、他のすべおのステヌゞを蚘述する必芁があるずいうこずですもちろん、それらの䜜業のデフォルトアルゎリズムが満たされおいおも、それは少し動揺したす。



APIには、各段階でのアクションを蚘述するマクロがありたす。



準備フェヌズのllvm_test_prepareマクロに぀いお曞くこずはあたりありたせん。実行する必芁があるコマンドは、単にパラメヌタヌずしお枡されたす。



起動セクションには䜕が必芁ですか 最も予枬可胜なケヌスは、アプリケヌションがいく぀かの匕数、入力ファむルを受け入れるこずです。 これを行うには、 llvm_test_runマクロがありたす。これは、アプリケヌションの起動匕数実行可胜ファむルの名前なしのみをパラメヌタヌずしお受け入れたす。



 llvm_test_run(--fixed 400 --cpu 1 --num 200000 --seed 1158818515 run.hmm)
      
      





怜蚌の段階でアクションを倉曎するには、 llvm_test_verifyマクロを䜿甚したす。これは、コマンドをパラメヌタヌずしお受け入れたす。 もちろん、正しいこずを確認するには、toolsフォルダヌに含たれおいるツヌルを䜿甚するこずをお勧めしたす。 これらは、生成された出力を予想された出力ず比范する良い機䌚を提䟛したす実数ず゚ラヌを比范するための別の凊理などがありたす。 ただし、どこかで、アプリケヌションが正垞に完了したこずなどを確認するだけです。



 llvm_test_verify("cat %o | grep -q 'exit 0'") # %o -   placeholder   ,   lit.          lit,    ,    .    lit (  ,   LLVM)      (   <a href="https://llvm.org/docs/CommandGuide/lit.html"> </a>)
      
      





しかし、远加のメトリックを収集する必芁がある堎合はどうでしょうか このためのllvm_test_metricマクロがありたす。



 llvm_test_metric(METRIC < > <,   >)
      
      





たずえば、dhrystoneの堎合、それに固有のメトリックを取埗できたす。



 llvm_test_metric(METRIC dhry_score grep 'Dhrystones per Second' %o | awk '{print $4}')
      
      





もちろん、すべおのテストに぀いお远加のメトリックを収集する必芁がある堎合、この方法はやや䞍䟿です。 llvm_test_metric呌び出しをむンタヌフェヌスが提䟛する䞊䜍レベルのマクロに远加する必芁があるか、TEST_SUITE_RUN_UNDERCMake倉数ず特定のスクリプトを䜿甚しおメトリックを収集できたす。 TEST_SUITE_RUN_UNDER倉数は非垞に䟿利で、たずえばシミュレヌタヌなどで実行するために䜿甚できたす。 実際、コマンドを蚘述しお、入力ずしおアプリケヌションを匕数ずしお受け取りたす。



その結果、次の圢匏のCMakeLists.txtを取埗したす。



 #       llvm_test_run(--fixed 400 --cpu 1 --num 200000 --seed 1158818515 run.hmm) llvm_test_verify("cat %o | grep -q 'exit 0'") llvm_test_metric(METRIC score grep 'Score' %o | awk '{print $4}') llvm_multisource() # llvm_multisource(my_application)   
      
      





CMakeを䜿甚しおアプリケヌションが既にビルドされおいる堎合、統合に远加の劎力は必芁ありたせん。テストスむヌトのCMakeList.txtに、既存のCMakeをアセンブリに含めお、簡単なマクロ呌び出しを远加できたす。



2.テストの実行



その結果、CMakeは指定された説明に埓っお特別なテストファむルを生成したした。 しかし、このファむルはどのように実行されたすか



litは垞にlit.cfg構成ファむルを䜿甚したす。これは、テストスむヌトに存圚したす。 この構成ファむルには、実行可胜なテストの圢匏など、テストを実行するためのさたざたな蚭定が瀺されおいたす。 テストスむヌトは、litsupportフォルダヌにある独自の圢匏を䜿甚したす。



 config.test_format = litsupport.test.TestSuiteTest()
      
      





この圢匏は、暙準照明テストから継承され、実行むンタヌフェむスのメむンメ゜ッドをオヌバヌラむドするテストクラスずしお蚘述されたす。 たた、litsupportの重芁なコンポヌネントは、TestPlanテスト実行蚈画の説明を持぀クラスです。このクラスには、さたざたな段階で実行する必芁があり、段階の順序を知る必芁があるすべおのコマンドが栌玍されたす。 必芁な柔軟性を提䟛するために、mutatePlanメ゜ッドを提䟛する必芁のあるアヌキテクチャにもモゞュヌルが導入されたした。その䞭で、テスト蚈画を倉曎し、必芁なメトリックのコレクションの説明を導入するだけでなく、アプリケヌションを起動するための時間を枬定するためのコマンドを远加したす この゜リュヌションにより、アヌキテクチャはうたく拡匵されおいたす。







テストスむヌトテストのおおよそのスキヌムTestContextクラス、さたざたな点灯構成、テスト自䜓などの圢匏の詳现を陀くを以䞋に瀺したす。







点灯するず、構成ファむルで指定されたテストタむプが実行されたす。 TestSuiteTestは、生成されたCMakeテストファむルを解析し、メむンステヌゞの説明を受け取りたす。 次に、芋぀かったすべおのモゞュヌルが呌び出されお珟圚のテスト蚈画が倉曎され、起動がむンスツルメントされたす。 次に、受信したテスト蚈画が実行されたす。準備、起動、および怜蚌の段階で実行されたす。 必芁に応じお、プロファむリングを実行できたす構成䞭にプロファむリングの必芁性を瀺す倉数が蚭定された堎合、モゞュヌルの1぀によっお远加されたす。 次の手順では、メトリックを収集し、TestPlanのmetric_collectorsフィヌルドに暙準モゞュヌルによっお远加された収集機胜を収集したす。その埌、CMakeでナヌザヌが蚘述した远加のメトリックを収集したす。



3.テストスむヌトの実行



test-suiteを実行するには2぀の方法がありたす。





各テストの結果は次のように衚瀺されたす



 PASS: test-suite :: MultiSource/Benchmarks/Prolangs-C/football/football.test (m of n) ********** TEST 'test-suite :: MultiSource/Benchmarks/Prolangs-C/football/football.test' RESULTS ********** compile_time: 1.1120 exec_time: 0.0014 hash: "38254c7947642d1adb9d2f1200dbddf7" link_time: 0.0240 size: 59784 size..bss: 99800 
 size..text: 37778 **********
      
      





テストスむヌトに含たれるスクリプトを䜿甚しお、LNTを䜿甚せずにさたざたな起動の結果を比范できたすただし、このフレヌムワヌクはさたざたなツヌルを䜿甚しお情報を分析する玠晎らしい機䌚を提䟛したすが、個別のレビュヌが必芁です



 test-suite/utils/compare.py results_a.json results_b.json
      
      





2぀の起動からの同じベンチマヌクのコヌドサむズを比范する䟋-O3および-Osフラグを䜿甚



 test-suite/utils/compare.py -m size SANDBOX1/build/O3.json SANDBOX/build/Os.json Tests: 1 Metric: size Program O3 Os diff test-suite...langs-C/football/football.test 59784 47496 -20.6%
      
      





おわりに



テストスむヌトに実装されたベンチマヌクを蚘述および実行するためのむンフラストラクチャは、䜿いやすく、サポヌトが容易であり、拡匵性が高く、原則ずしお、アヌキテクチャではかなり゚レガントな゜リュヌションを䜿甚しおいるため、テストスむヌトは開発者にずっお非垞に䟿利なツヌルになりたすコンパむラ、およびこのシステムは、䞀郚のデヌタ分析タスクで䜿甚するために倉曎できたす。



All Articles