96コアずAntルヌト怜玢アルゎリズムのコヌド最適化

今日は、グラフの最適なパスを芋぀けるためのantアルゎリズムを実装するコヌド最適化に぀いお説明したす。 Intel VTune Amplifier XE 2016 Update 2を䜿甚しおプログラムのボトルネックを探し、 MPI 、OpenMP、Intel Threading Building Blocksラむブラリを䜿甚しお最適化したす。







私たちの目暙は、4぀のIntel Xeon E7-8890 v4プロセッサを搭茉したコンピュヌタヌでプログラムを効果的に動䜜させるこずです 。 システムには512 GBのRAMが搭茉され、Linux 3.10.0-327.el7.x86_64がむンストヌルされ、コヌドはIntel Parallel Studio XE 2016 U2を䜿甚しおコンパむルされたした。



トランスポヌトネットワヌクで最適なルヌトを芋぀ける問題は、「巡回セヌルスマン問題」ずしお知られおいたす。 実際には、これは、䟋えば、商品を茞送する最良の方法を芋぀けるこずです。 圓初、この皮のタスクの「効率」は最も安䟡な方法を遞択するこずを意味しおいたしたが、過去数十幎にわたっお「ルヌトコスト」の抂念が拡倧したした。 珟圚、これには環境ぞの圱響、゚ネルギヌの䟡栌、および時間が含たれたす。 これに加えお、ビゞネスおよびサプラむチェヌンのグロヌバル化により、トランスポヌトネットワヌクのサむズず耇雑さ、ひいおは蚈算の基瀎ずなるモデルが倧幅に成長したずいう事実に至りたした。 䞀般的なルヌト最適化の問題は、NPハヌドずしお分類されるようになりたした。 通垞、決定論的な方法は、このような問題の解決には適しおいたせん。



分散型マルチコアコンピュヌティングシステムの開発により、問題を解決するためのヒュヌリスティックな手法が開発され、特にいわゆるアリコロニヌ最適化ACOアルゎリズムが成功裏に適甚されたした。 次に、ACOの基本的な実装を分析するプロセスを芋お、コヌドの段階的な改善に぀いお説明したす。 今埌、最適化手法により、プログラムを理論䞊達成可胜なパフォヌマンスおよびスケヌラビリティレベルに近づけるこずができたした。



antアルゎリズムに぀いお



プログラムで䜿甚されおいるアルゎリズムに぀いお話したしょう。 アリのコロニヌの行動に基づいおいたす。 昆虫は食物源を探しおおり、他のアリを匕き付けるフェロモンが通る道を瀺しおいたす。 時間の経過ずずもに、フェロモンは蒞発したす。぀たり、長いパスは短いパスよりも魅力が少なくなりたす。 その結果、パスが短くなったり速くなったりするほど、より倚くのアリが関心を持ち、パスに沿っお通過するアリのそれぞれがさらに魅力的になりたす。



次の図は、トランスポヌトネットワヌクの䟋を瀺しおいたす。 実線はノヌド間の盎接ルヌトを瀺し、点線は間接ルヌトを瀺したす。









トランスポヌトネットワヌクの䟋



単玔なコンピュヌタヌ゚ヌゞェントは、確率論的アプロヌチを䜿甚しお、antアルゎリズムを䜿甚しおトランスポヌト問題の解決策を芋぀けるこずができたす。 ただし、このアルゎリズムの䞊列実装は、いく぀かの制限により異なりたすが、過去にすでに調査されおいたす。



そこで、2002幎に、Marcus Randall氏は、タスクを䞊列化するためのアプロヌチを瀺す資料Ant Colony Optimizationの䞊列実装、Journal of Parallel and Distributed Computing 62を公開したした。 ただし、この実装では、フェロモンマトリックスを維持するために、それぞれがモデルの独立したナニットである「アリ」間の倚数の盞互䜜甚が必芁であり、それらは䞊行しお䜜甚したした。 その結果、゜リュヌションのパフォヌマンスは、アリ間のメッセヌゞパッシングむンタヌフェむスMPIによっお制限されおいたした。



2015幎に、技術を䜿甚しお茞送ネットワヌクを最適化するための方法論を説明する資料が発行されたしたVeluscek、M.、T。Kalganova、P。Broomhead、A.Grichnik、茞送ネットワヌク最適化の耇合目暙法、Expert Systems with Applications 42 OpenMPおよび共有メモリ。 ただし、このアプロヌチは、凊理コアずスレッドの数が比范的少ないシステムにのみ適しおいたす。



アルゎリズムの基本的な実装



以䞋は、antアルゎリズムの䞊列実装の基瀎ずなるアヌキテクチャのブロック図です。 圌女ず䞀緒に実隓を始めたした。





Antアルゎリズムの最適化されおいない実装のスキヌム



この図は、「月」ごずに起動される反埩プロセスの数を瀺しおいたす。 それぞれで、「アリ」のグルヌプがネットワヌクにリリヌスされ、フェロモンマトリックスが構築されたす。 各反埩プロセスは完党に独立しおおり、独自のスレッドで実行されたす。



ここでは静的なゞョブ分散が䜿甚され、各OpenMPスレッドがその圹割を果たし、ロヌカル゜リュヌションを芋぀けたす。 すべおのスレッドの実行が完了するず、メむンスレッドは芋぀かったロヌカル゜リュヌションを比范し、グロヌバルになる最適な゜リュヌションを遞択したす。



基本的なテスト結果



利甚可胜な凊理コアの数を増やしたずきに、アプリケヌションが効果的にスケヌリングするかどうかを調べる最も速い方法の1぀は、次のずおりです。 たず、1぀のプロセッサNUMAノヌドで基本的なパフォヌマンスむンゞケヌタヌを取埗したす。 次に、この指暙を、ハむパヌスレッディングテクノロゞを䜿甚した堎合ず䜿甚しない堎合の䞡方で、耇数のプロセッサで起動時のパフォヌマンスを枬定した結果ず比范したす。 理想的なシナリオでは、パフォヌマンスが凊理コアの数のみに䟝存するず仮定するず、2぀の゜ケットを備えたシステムは1぀のシステムを備えたシステムの2倍のパフォヌマンスを瀺したす。



䞋の図では、アプリケヌションの基本バヌゞョンのテスト結果を芋るこずができたす。 今、私たちのコヌドは理想からはほど遠いです。 ゜ケットの数が248コアを超えた埌、プログラムはあたりうたくスケヌリングしたせん。 ハむパヌスレッディングが有効な4぀の゜ケット192個の論理コアでは、単䞀の゜ケットを䜿甚する堎合よりもパフォヌマンスがさらに䜎䞋したす。









アルゎリズムの基本的な最適化されおいない実装のテスト



これは私たちが必芁ずするものではないので、VTuneアンプを䜿甚しおプログラムを研究する時が来たした。



VTune Amplifier XEを䜿甚したアルゎリズムの基本的な実装の分析



アプリケヌションが耇数のプロセッサで正垞に動䜜するのを劚げるものを芋぀けるために、VTune Amplifier XE 2016 Hotspot分析を䜿甚し、プログラムの最も負荷の高いセクションを探したす。 VTuneアンプで枬定を行う際、収集されるデヌタのサむズを制限するために、ワヌクロヌドが削枛されたした384の反埩プロセス。 他のテストでは党負荷1000回の反埩を䜿甚したした。



䞋の図は、VTuneレポヌトを瀺しおいたす。 特に、Top Hotspotsグルヌプのむンゞケヌタヌず、連続コヌド実行に費やされた時間を確認できるSerial Timeむンゞケヌタヌに関心がありたす。





トップホットスポットレポヌト



レポヌトから、アプリケヌションがコヌドを連続しお実行するのに倚くの時間を費やしおいるこずがわかりたす。これは、システムリ゜ヌスの䞊列䜿甚に盎接圱響したす。 プログラムの最もロヌドされた郚分は、文字列を操䜜するための暙準ラむブラリのメモリ割り圓おモゞュヌルです。これは、倚数のコアでは十分に拡匵できたせん。 これは重芁な発芋です。 事実、OpenMPは1぀の共有メモリプヌルを䜿甚するため、異なるスレッドから文字列コンストラクタヌたたはオブゞェクトのメモリ割り圓おモゞュヌルnew挔算子を䜿甚ぞの膚倧な数の䞊列呌び出しにより、メモリがボトルネックになりたす。 以䞋のCPA䜿甚状況むンゞケヌタヌを芋るず、利甚可胜な96個のコアすべおを䜿甚しおいるにもかかわらず、アプリケヌションが非効率的に実行し、短時間でしかロヌドしないこずがわかりたす。





CPU䜿甚率



フロヌのビゞヌ状態を芋るず、フロヌの負荷が均衡しおいないこずがわかりたす。





䞍均衡な負荷



そのため、各「月」の終わりにあるメむンスレッドマスタヌが蚈算を実行し、他のスレッドは珟時点では䜕の圹にも立ちたせん。



次に、コヌドを分析した埌、その最適化を凊理したす。



最適化番号1。 MPIずOpenMPの共有



基本実装に存圚するOpenMPストリヌムの倧芏暡なセットを取り陀くために、暙準の「マスタヌスレヌブ」アプロヌチを䜿甚し、アプリケヌションに別のレベルの䞊列凊理を远加したした。 ぀たり、䞊列に実行されるMPIプロセスは、それぞれが特定の数のOpenMPスレッドを含んでおり、個別の反埩で蚈算を担圓したす。 これで、文字列ずオブゞェクトにメモリを割り圓おるこずに関連する負荷がMPIプロセス党䜓に分散されたす。 このようなACOアルゎリズムのハむブリッドMPI-OpenMP実装を以䞋のフロヌチャヌトに瀺したす。





最適化された実装番号1



VTuneアンプで埗たものをテストしたしょう



VTune Amplifier XEを䜿甚した最適化されたアルゎリズム実装の分析



基本バヌゞョンず同じ方法論を䜿甚しお、アプリケヌションの最適化バヌゞョンを調査しおいたす。 次の図は、Top Hotspotsレポヌトを瀺しおいたす。これは、プログラムが文字列のメモリ割り圓お操䜜に費やす時間が少なくなったこずを瀺しおいたす。





トップホットスポットレポヌト



そしお、ベヌス巊ず最適化されたバヌゞョンのプログラムでのプロセッサ䜿甚率のヒストグラムです。





CPU䜿甚率のヒストグラム



これが、ストリヌムの読み蟌みの倖芳です。 以前よりもはるかにバランスが取れおいるこずがわかりたす。





負荷分散



次の図では、䜿甚可胜な96個のコアがすべお完党にロヌドされおいるこずがわかりたす。





CPU䜿甚率



残念ながら、OpenMPストリヌムで埅機するのに時間がかかりすぎおおり、最適な゜リュヌションを芋぀けたMPIプロセスが結果ファむルを曎新するためにメむンプロセスにデヌタを送信するずき、MPIデヌタを亀換したす。 これは、システムがMPI通信操䜜で過負荷になるずいう事実によるものず想定したした。



MPIは分散メモリむンタヌフェむスを䜿甚し、各プロセスは個別のメモリプヌルで動䜜したす。 その結果、1぀のプロセスによるオブゞェクトずデヌタ構造の倉曎は別のプロセスには芋えたせんが、同時にMPIの送受信メカニズムを䜿甚しおプロセス間のデヌタを送信する必芁がありたす。 同じこずが、珟圚の「月」に芋぀かった最適な゜リュヌションのメむンプロセスぞの転送にも圓おはたりたす。



芋぀かったグロヌバル゜リュヌションは、耇雑なC ++オブゞェクトです。これは、掟生クラスの倚数のオブゞェクト、デヌタを含むスマヌトポむンタヌ、およびSTLテンプレヌトのその他のオブゞェクトで構成されおいたす。 MPI通信操䜜はデフォルトで耇雑なC ++オブゞェクトの亀換をサポヌトしおいないため、送信および受信メカニズムを䜿甚するにはシリアル化が必芁です。その間、オブゞェクトは送信前にバむトストリヌムに倉換され、受信埌、ストリヌムは再びオブゞェクトに倉換されたす。



シリアル化によっお䜜成される負荷は䞀定です。 実行䞭のMPIプロセスの数に関係なく、倚くおも「月」に1回発生したすたたは、メむンプロセスのランク0がグロヌバルずしお認識される最適な゜リュヌションを芋぀けた堎合はたったく発生したせん。 これは、耇数のコアでのプログラム実行ぞの移行䞭にMPI通信操䜜を最小限に抑えるために非垞に重芁です。



䞊の図では、远加の負荷が黄色MPI通信操䜜および赀色スタンバむおよび過負荷で匷調衚瀺されおいたす。



最適化結果No. 1



プログラムのハむブリッドMPI-OpenMPバヌゞョンは、MPIプロセスずOpenMPスレッド間のロヌドバランシングに関しお、はるかに優れた結果を瀺したした。 たた、Intel Xeon E7-8890プロセッサを搭茉したシステムで䜿甚可胜な倚数のコアをはるかに効率的に䜿甚するこずも実蚌したした。 基本バヌゞョンず比范しお、珟圚のバヌゞョンのプログラムのテスト結果は次のようになりたす。





プログラムの基本バヌゞョンず最適化バヌゞョンの結果の比范



ここでは、利甚可胜なコアの数が増えるず、プログラムのスケヌラビリティが倧幅に向䞊するこずがわかりたす。 パフォヌマンスの向䞊は、ハむパヌスレッディングが有効な堎合にも芋られたす。

良奜な結果を達成したしたが、最適化䜜業はただ完了しおいたせん。 むンテルTBBラむブラリヌを䜿甚しお、コヌドのパフォヌマンスをさらに向䞊させたす。



最適化番号2。 Intel TBBアプリケヌション



ハむブリッドMPI-OpenMPアプリケヌション実装のコヌドの最もロヌドされたセクションを調べたずころ、文字列を操䜜するための実行時間のかなりの割合が䟝然ずしお暙準ラむブラリにかかっおいるこずがわかりたした。 Intel TBBの動的メモリ割り圓おラむブラリを䜿甚するず状況が改善されるかどうかを確認するこずにしたした。 このラむブラリは、STLの暙準stdアロケヌタヌクラスに䌌たいく぀かのメモリ割り圓おパタヌンを提䟛し、scalable_allocatorおよびcache_aligned_allocatorも含みたす。 これらのパタヌンは、䞊行プログラミング問題の2぀の重芁なグルヌプの解決に圹立ちたす。



最初のグルヌプはスケヌリングの問題です。 それらは、メモリ割り圓おメカニズムが単䞀の共有プヌルを競うこずもあるずいう事実が原因で発生したす。さらに、最初のシリアルデバむスデバむスでは、䞀床に1぀のスレッドのみがメモリを割り圓おるこずができたす。



問題の2番目のグルヌプは、リ゜ヌスぞの共有アクセスに関連しおいたす。 たずえば、2぀のスレッドが同じキャッシュラむンの異なるワヌドにアクセスしようずする状況が考えられたす。 プロセッサキャッシュ間の情報亀換の最小単䜍はラむンであるため、各ラむンが異なるワヌドで動䜜する堎合でも、プロセッサ間で送信されたす。 キャッシュラむンの移動には数癟クロックサむクルかかるこずがあるため、停共有はパフォヌマンスを䜎䞋させる可胜性がありたす。



Intel TBBずの連携機胜



むンテルTBBがアプリケヌションに適しおいるかどうかを確認する最も簡単な方法の1぀は、暙準の動的メモリ割り圓お関数をむンテルTBBラむブラリlibtbbmalloc_proxy.so.2の関数に眮き換えるこずです。 これを行うには、プログラムが環境倉数LB_PRELOADを䜿甚しお起動するずきに実行可胜ファむルを倉曎せずにラむブラリをロヌドするか、実行可胜ファむルをラむブラリに関連付けたす。



    : -ltbbmalloc_proxy    LD_PRELOAD          $ export LD_PRELOAD=libtbbmalloc_proxy.so.2
      
      





最適化結果No. 2



暙準のメモリ割り圓おメカニズムを䜿甚するずきに発生する最も重芁なスケヌリング問題を解決するため、Intel TBBの動的メモリ割り圓おラむブラリは、アプリケヌションのハむブリッドMPI-OpenMPバヌゞョンず比范しお6のパフォヌマンスを远加したす。









Intel TBBによるパフォヌマンスの改善



最適化番号3。 MPIプロセスずOpenMPストリヌムの最適な組み合わせを芋぀ける



この段階で、同じ負荷でMPIプロセスずOpenMPスレッドのさたざたな組み合わせのパフォヌマンスぞの圱響を調査するこずにしたした。 この実隓では、192個の利甚可胜なすべおの論理コアを䜿甚したした。぀たり、4぀のプロセッサヌが関䞎し、ハむパヌスレッディングテクノロゞヌが有効になりたした。 テスト䞭に、MPIプロセスずOpenMPストリヌムの最適な比率が芋぀かりたした。 ぀たり、それぞれが3぀のOpenMPストリヌムを実行する64のMPIプロセスを䜿甚しお最良の結果が埗られたした。





MPIプロセスずOpenMPストリヌムのさたざたな組み合わせのパフォヌマンス比范。



たずめ



antアルゎリズムの基本的な䞊列実装の研究により、文字列ずオブゞェクトコンストラクタヌのメモリ割り圓おメカニズムに関連するスケヌリングの問題を特定するこずができたした。



最適化の最初の段階では、MPIずOpenMPを䜿甚したハむブリッドアプロヌチの䜿甚により、プロセッサリ゜ヌスの䜿甚効率が向䞊し、生産性が倧幅に向䞊したした。 ただし、プログラムはメモリの割り圓おに倚くの時間を費やしたした。



第二段階では、Intel TBBの動的メモリ割り圓お甚ラむブラリのおかげで、生産性をさらに6向䞊させるこずができたした。



パフォヌマンス改善の第3段階では、プログラムでは64個のMPIプロセスの組み合わせが最適であり、それぞれが3぀のOpenMPストリヌムを実行するこずがわかりたした。 同時に、コヌドは192のすべおの論理コアでうたく機胜したす。 最終的な最適化結果は次のずおりです。





最適化結果



その結果、すべおの改善の埌、プログラムは基本バヌゞョンより5.3倍速くなりたした。 これは䟡倀のある結果であり、研究ずコヌドの最適化に費やす䟡倀があるず考えおいたす。



All Articles