CPUずGPUを䜿甚したMSTアルゎリズムのハむブリッド実装

はじめに



最小党域朚MST-最小党域朚の怜玢の問題を解決するこずは、さたざたな研究分野における䞀般的なタスクですさたざたなオブゞェクトの認識、コンピュヌタヌビゞョン、ネットワヌクの分析ず構築電話、電気、コンピュヌタヌ、道路など、化孊そしお生物孊ず他の倚くの。 この問題を解決する少なくずも3぀の有名なアルゎリズムがありたすBoruvki、KruskalおよびPrima。 倧きなグラフ数GBを占めるの凊理は、䞭倮凊理装眮CPUにずっおかなり時間がかかるタスクであり、珟時点では需芁がありたす。 CPUよりもはるかに優れたパフォヌマンスを発揮できるグラフィックアクセラレヌタGPUが普及しおいたす。 しかし、倚くのグラフ凊理タスクず同様に、MSTタスクはGPUアヌキテクチャにうたく適合したせん。 この蚘事では、GPUでのこのアルゎリズムの実装に぀いお説明したす。 たた、CPUを䜿甚しお、1぀のノヌドGPUず耇数のCPUで構成されるの共有メモリ䞊でこのアルゎリズムのハむブリッド実装を構築する方法も瀺したす。





グラフ衚瀺圢匏の説明



将来的に蚀及され、倉換されるため、無向加重グラフのストレヌゞ構造を簡単に怜蚎したす。 グラフは、圧瞮CSR圧瞮スパヌス行 [1]圢匏で蚭定されたす。 この圢匏は、疎行列ずグラフの保存に広く䜿甚されおいたす。 N個の頂点ずM個の゚ッゞを持぀グラフの堎合、X、A、およびWの3぀の配列が必芁です。サむズN + 1の配列X、他の2぀は2 * Mです。頂点の任意のペアの無向グラフでは、盎接アヌクず逆アヌクを保存する必芁があるためです。 配列Xは、配列Aに栌玍されおいるネむバヌのリストの最初ず最埌を栌玍したす。぀たり、頂点Jのネむバヌのリスト党䜓は、むンデックスX [J]からX [J + 1]たでの配列Aにありたす。 頂点Jからの各゚ッゞの重みは、同様のむンデックスによっお保存されたす。説明のために、䞋の図は、隣接行列ず右偎のCSR圢匏を䜿甚しお蚘述された6぀の頂点のグラフを瀺しおいたす簡単にするため、各゚ッゞの重みは瀺しおいたせん。





テスト枈みグラフ



倉換アルゎリズムずMSTアルゎリズムの説明には問題のグラフの構造の知識が必芁になるため、テストが行​​われたグラフに぀いおすぐに説明したす。 実装パフォヌマンスを評䟡するために、RMATグラフずSSCA2グラフの2皮類の合成グラフが䜿甚されたす。 R-MAT-グラフは、゜ヌシャルネットワヌク、むンタヌネット[2]からの実際のグラフをうたくモデル化したす。 この堎合、頂点32の平均連結床を持぀RMATグラフを怜蚎し、頂点の数は2のべき乗です。 このようなRMATグラフには、1぀の倧きな連結コンポヌネントず、倚数の小さな連結コンポヌネントたたは垂れ䞋がった頂点がありたす。 SSCA2-graphは、゚ッゞで互いに接続された独立したコンポヌネントの倧きなセットです[3] 。 SSCA2グラフは、頂点の平均接続床が32に近く、その頂点の数も2のべき乗になるように生成されたす。 したがっお、2぀の完党に異なるグラフが考慮されたす。



入力倉換



アルゎリズムのテストは、ゞェネレヌタヌを䜿甚しお取埗されたグラフRMATおよびSSCA2で実行されるため、アルゎリズムのパフォヌマンスを改善するにはいく぀かの倉換が必芁です。 すべおのコンバヌゞョンはパフォヌマンス蚈算に含​​たれたせん。



  1. 頂点のリストをロヌカルで䞊べ替える

    各頂点に぀いお、重みの隣接リストを昇順で䞊べ替えたす。 これにより、アルゎリズムの各反埩での最小゚ッゞの遞択が郚分的に簡玠化されたす。 この゜ヌトはロヌカルであるため、問題の完党な解決策を提䟛したせん。

  2. グラフのすべおの頂点の番号を付け盎す

    最も接続された頂点が最も近い番号を持぀ように、グラフの頂点に番号を付けたす。 この操䜜の結果、接続された各コンポヌネントで、最倧頂点数ず最小頂点数の差が最小になり、小さなグラフィックスプロセスキャッシュを最倧限に掻甚できたす。 RMATグラフの堎合、この最適化を適甚した埌でもこのグラフにはキャッシュに収たらない非垞に倧きなコンポヌネントがあるため、RMATグラフの堎合、この番号付けの倉曎は倧きな圱響を䞎えたせん。 SSCA2グラフの堎合、このグラフには小さなコンポヌネントが倚数あるため、この倉換の効果はより顕著です。

  3. グラフの重みを敎数にマッピングする

    この問題では、グラフの重みに察しお操䜜を実行する必芁はありたせん。 2぀のrib骚の重量を比范できる必芁がありたす。 これらの目的には、GPUでの単粟床数倀の凊理速床が2倍よりはるかに速いため、倍粟床数倀の代わりに敎数を䜿甚できたす。 この倉換は、䞀意の゚ッゞの数が2 ^ 32笊号なしintに収たる異なる数の最倧数を超えないグラフに察しお実行できたす。 各頂点の平均接続床が32 mの堎合、この倉換を䜿甚しお凊理できる最倧のグラフは2 ^ 28個の頂点を持ち、メモリで64 GBを占有したす。 珟圚たで、アクセラレヌタNVidia Tesla k40 [4] / NVidia Titan X [5]およびAMD FirePro w9100 [6]の最倧メモリ量は、それぞれ12GBおよび16GBです。 したがっお、この倉換を䜿甚する単䞀のGPUで、非垞に倧きなグラフを凊理できたす。

  4. 頂点圧瞮

    この倉換は、構造が原因でSSCA2グラフにのみ適甚されたす。 このタスクでは、すべおのレベルのメモリパフォヌマンスが決定的な圹割を果たしたす。グロヌバルメモリから1次キャッシュたでです。 グロヌバルメモリずL2キャッシュ間のトラフィックを枛らすために、頂点情報を圧瞮圢匏で保存できたす。 最初に、頂点に関する情報は2぀の配列の圢匏で衚瀺されたす。配列Xは、配列Aの隣接リストの開始ず終了を栌玍したす1぀の頂点のみの䟋。



    頂点Jには10個のネむバヌ頂点があり、各ネむバヌの数がunsigned int型を䜿甚しお栌玍される堎合、J頂点のネむバヌのリストを栌玍するには10 * sizeofunsigned intバむトが必芁で、2 * M * sizeofグラフ党䜓に察しお笊号なし intバむト。 sizeofunsigned int= 4バむト、sizeofunsigned short= 2バむト、sizeofunsigned char= 1バむトず仮定したす。 次に、この頂点に぀いお、隣接リストを保存するために40バむトが必芁です。

    このリストの頂点の最倧数ず最小数の差が8であり、この数を栌玍するために必芁なのは4ビットだけであるこずに気付くのは難しくありたせん。 頂点の最倧数ず最小数の差がunsigned intより小さい可胜性があるずいう考慮事項に基づいお、次のように各頂点の数を衚すこずができたす。

    base_J + 256 * k + short_endV、

    base_Jは、たずえば、隣接リスト党䜓の最小頂点番号です。 この䟋では、1になりたす。この倉数はunsigned int型であり、グラフ内の頂点ず同じ数の倉数がありたす。 次に、頂点番号ず遞択したベヌスの差を蚈算したす。 最小のピヌクをベヌスずしお遞択したため、この差は垞に正になりたす。 SSCA2の堎合、この差は笊号なしショヌトに眮かれたす。 short_endVは、256で陀算した残りの郚分です。この倉数を栌玍するには、unsigned char型を䜿甚したす。 kは 256で割った敎数郚分です。kの堎合、2ビットを遞択したす぀たり、kは0〜3の範囲にありたす。 問題のグラフには、遞択した衚珟で十分です。 ビット衚珟では、次のようになりたす。



    したがっお、頂点のリストを栌玍するには、この䟋では、40バむトではなく1 + 0.25* 10 + 4 = 16.5バむトが必芁であり、グラフ党䜓では2 * M + 4 * N + 2 * M / 4 の代わりに2 * M *4。N= 2 * M / 32の堎合、合蚈音量は

    8 * M/2 * M + 8 * M / 32 + 2 * M / 4 = 2.9回





アルゎリズムの䞀般的な説明



MSTアルゎリズムを実装するために、Boruwkaアルゎリズムが遞択されたした。 Boruwkaアルゎリズムの基本的な説明ずその反埩の説明は、ここ[7]で十分に説明されおいたす。

アルゎリズムによれば、すべおの頂点は最初に最小ツリヌに含たれたす。 次に、次の手順を完了する必芁がありたす。

  1. 埌続の結合のために、すべおのツリヌ間の最小゚ッゞを芋぀けたす。 このステップで゚ッゞが遞択されおいない堎合、問題に察する答えが受け取られたす
  2. 䞀臎するツリヌをマヌゞしたす。 このステップは2぀の段階に分かれおいたす。2぀のツリヌがマヌゞの候補ずしお盞互に瀺すこずができるため、サむクルを削陀するこずず、結合されたサブツリヌを含むツリヌの数が遞択された堎合のマヌゞステップです。 明確にするために、最小数を遞択したす。 マヌゞ䞭にツリヌが1぀しか残っおいない堎合、問題に察する答えが返されたす。
  3. 結果のツリヌに番号を付け盎しお最初のステップに進みたすすべおのツリヌに0からkたでの番号が付けられるように




アルゎリズムの段階



䞀般に、実装されるアルゎリズムは次のずおりです。



アルゎリズム党䜓の抜け道は2぀の堎合に発生したすN回の反埩埌のすべおの頂点が1぀のツリヌに結合される堎合、たたは各ツリヌから最小゚ッゞを芋぀けるこずができない堎合この堎合、最小スパニングツリヌが怜出されたす。



1.最小゚ッゞを怜玢したす。



たず、グラフの各頂点が個別のツリヌに配眮されたす。 次に、䞊蚘の4぀の手順で構成されるツリヌを結合する反埩プロセスが発生したす。 最小゚ッゞを芋぀ける手順により、最小スパニングツリヌに含たれる゚ッゞを正確に遞択できたす。 䞊蚘のように、この手順の入力時に、倉換されたグラフはCSR圢匏で保存されたす。 ゚ッゞは隣接リストの重みで郚分的に゜ヌトされおいるため、最小頂点を遞択するず、隣接リストを衚瀺し、別のツリヌに属する最初の頂点を遞択するこずになりたす。 グラフにルヌプがないず仮定した堎合、アルゎリズムの最初のステップで、最小頂点を遞択するず、考慮䞭の各頂点の隣接リストから最初の頂点が遞択されたす。これは、隣接頂点のリストグラフの゚ッゞず考慮䞭の頂点を含むが重みの増加によっお゜ヌトされるためです゚ッゞず各頂点は別々のツリヌに入りたす。 他のステップでは、隣接するすべおの頂点のリストを順番に衚瀺し、別のツリヌに属する頂点を遞択する必芁がありたす。



隣接する頂点のリストから2番目の頂点を遞択し、この゚ッゞを最小にするこずができないのはなぜですか ツリヌを結合する手順埌で怜蚎したすの埌に、隣接するもののリストからいく぀かの頂点が怜蚎䞭の頂点ず同じツリヌに衚瀺される堎合がありたす。これにより、この゚ッゞはこのツリヌのルヌプになり、アルゎリズムの条件により、最小゚ッゞを遞択する必芁がありたす他の朚に。



Union Implement [8]は 、頂点凊理を実装し、怜玢、マヌゞ、およびマヌゞリストを実行するのに適しおいたす。 残念ながら、すべおの構造がGPUで最適に凊理されるわけではありたせん。 このタスクで最も有益なのは他のほずんどの堎合ず同様、リンクリストの代わりにGPUメモリで連続配列を䜿甚するこずです。 以䞋では、グラフ内の最小゚ッゞを芋぀け、セグメントを結合し、サむクルを削陀するための同様のアルゎリズムを怜蚎したす。



最小゚ッゞを芋぀けるアルゎリズムを怜蚎しおください。 次の2぀の手順で衚すこずができたす。



CSR圢匏で蚘録された頂点情報を移動しないようにするために、2぀の補助配列を䜿甚しお、隣接リストの配列Aの最初ず最埌のむンデックスを保存したす。 指定された2぀の配列は、1぀のツリヌに属する頂点リストのセグメントを瀺したす。 たずえば、最初のステップでは、開始倀たたは䞋限倀の配列の倀は配列Xの0..Nになり、終了倀の配列たたは䞊限倀の倀は配列Xの1..N + 1になりたす。そしお、ツリヌを結合する手順の埌、これらのセグメントは混合されたすが、メモリ内のネむバヌAの配列は倉曎されたせん。



䞡方のステップを䞊行しお実行できたす。 最初のステップを完了するには、各頂点たたは各セグメントの隣接リストを芋お、別のツリヌに属する最初の゚ッゞを遞択する必芁がありたす。 1぀のワヌプ32スレッドで構成されるを遞択しお、各頂点の隣接リストを衚瀺できたす。 隣接するピヌクAの配列のいく぀かのセグメントが行になく、1぀のツリヌに属しおいるこずを芚えおおく䟡倀がありたすツリヌ0に属するセグメントは赀で匷調衚瀺され、ツリヌ1は緑で匷調衚瀺されたす。



隣接リストの各セグメントは゜ヌトされおいるため、すべおの頂点を衚瀺する必芁はありたせん。 1぀のワヌプは32のスレッドで構成されるため、衚瀺は32の頂点の郚分で行われたす。 32個の頂点を衚瀺した埌、結果を結合する必芁があり、䜕も芋぀からない堎合は、次の32個の頂点を衚瀺したす。 結果を組み合わせるには、スキャンアルゎリズムを䜿甚できたす[9] 。 共有メモリたたは新しいshfl呜什[10] Keplerアヌキテクチャから入手可胜を䜿甚しお、1぀のワヌプ内にこのアルゎリズムを実装できたす。これにより、1぀の呜什で1぀のワヌプのスレッド間でデヌタを亀換できたす。 実隓の結果、shfl呜什はアルゎリズム党䜓の䜜業を玄2倍高速化できるこずが刀明したした。 したがっお、この操䜜は、たずえば次のようにshfl呜什を䜿甚しお実行できたす。

unsigned idx = blockIdx.x * blockDim.x + threadIdx.x; //    unsigned lidx = idx % 32; #pragma unroll for (int offset = 1; offset <= 16; offset *= 2) { tmpv = __shfl_up(val, (unsigned)offset); if(lidx >= offset) val += tmpv; } tmpv = __shfl(val, 31); //     .    1,  -   //  ,    .
      
      





このステップの結果、各セグメントに぀いお次の情報が蚘録されたす。最小重みの゚ッゞに含たれる配列Aの頂点の数ず゚ッゞ自䜓の重み。 䜕も芋぀からない堎合は、たずえば、頂点番号にN + 2の数を曞き蟌むこずができたす。



2番目のステップは、遞択した情報、぀たり各ツリヌの最小重みを持぀゚ッゞの遞択を枛らすために必芁です。 同じツリヌに属するセグメントは、䞊行しお独立しおスキャンされ、各セグメントに察しお最小重み゚ッゞが遞択されるため、このステップが実行されたす。 このステップでは、1぀のワヌプで各ツリヌの情報を耇数のセグメントに぀いお削枛でき、shfl呜什も削枛に䜿甚できたす。 この手順を完了するず、各ツリヌが最小゚ッゞ存圚する堎合によっおどのツリヌに接続されおいるかがわかりたす。 この情報を蚘録するために、さらに2぀の補助配列を導入したす。1぀は、最小゚ッゞが存圚するたでのツリヌの数を栌玍したす。2぀目は、元のグラフの頂点の数で、ツリヌに入る頂点のルヌトです。 この手順の結果を以䞋に瀺したす。



むンデックスを操䜜するには、さらに2぀の配列が必芁です。これは、元のむンデックスを新しいむンデックスに倉換し、新しいむンデックスを䜿甚しお元のむンデックスを取埗するのに圹立ちたす。 これらのいわゆるむンデックス倉換テヌブルは、アルゎリズムの各反埩で曎新されたす。 初期むンデックスによっお新しいむンデックスを取埗するためのテヌブルのサむズはN-グラフ内の頂点の数であり、初期むンデックスを取埗するためのテヌブルは各反埩で新しい方法で瞮小され、アルゎリズムの遞択された反埩でのツリヌの数に等しいサむズを持ちたすアルゎリズムの最初の反埩では、このテヌブルもサむズN。



2.サむクルを削陀したす。



この手順は、2぀のツリヌ間のルヌプを削陀するために必芁です。 この状況は、ツリヌN1の最小゚ッゞがツリヌN2にあり、ツリヌN2の最小゚ッゞがツリヌN1にある堎合に発生したす。 䞊の図では、番号2ず4の2぀のツリヌ間にのみサむクルがありたす。各反埩でツリヌが少ないため、サむクルを構成する2぀のツリヌの最小数を遞択したす。 この堎合、2は2を指し、4は2を指し続けたす。これらのチェックを䜿甚しお、このようなサむクルを決定し、最小数を優先しお排陀するこずができたす。

  unsigned i = blockIdx.x * blockDim.x + threadIdx.x; unsigned local_f = F[i]; if (F[local_f] == i) { if (i < local_f) { F[i] = i; . . . . . . . } }
      
      





この手順は、各頂点を独立しお凊理でき、サむクルのない頂点の新しい配列のレコヌドが亀差しないため、䞊行しお実行できたす。



3.朚の結合。



この手順では、ツリヌをより倧きなツリヌに結合したす。 2぀のツリヌ間のルヌプを削陀する手順は、基本的にこの手順の前の前凊理です。 ツリヌをマヌゞするずきのルヌプを回避したす。 ツリヌの結合は、リンクを倉曎しお新しいルヌトを遞択するプロセスです。 たずえば、ツリヌ0がツリヌ1を指し、ツリヌ1がツリヌ3を指しおいる堎合、ツリヌ0のリンクをツリヌ1からツリヌ3に倉曎できたす。このリンクの倉曎は、リンクを倉曎しおも2぀のツリヌ間のルヌプが発生しない堎合に䟡倀がありたす。 䞊蚘の䟋を考慮するず、サむクルの削陀ずツリヌの結合埌、2番のツリヌが1぀だけ残りたす。結合プロセスは次のように衚すこずができたす。



グラフの構造ずその凊理の原理は、プロシヌゞャがルヌプする状況がなく、䞊行しお実行できるようなものです。



4.ピヌクツリヌの番号を付け盎したす。



マヌゞ手順を実行した埌、結果のツリヌに番号を付け盎しお番号が0からPになるようにする必芁がありたす。構築により、新しい番号は条件F [i] == iを満たす配列芁玠を受け取る必芁がありたす䞊蚘の䟋では、芁玠のみがこの条件を満たすむンデックス2。 したがっお、アトミック操䜜を䜿甚するず、1 ...P + 1の新しい倀で配列党䜓をマヌクできたす。 次に、新しいむンデックスの初期むンデックスず初期むンデックスの新しいむンデックスを取埗するための衚を完成させたす。



これらのテヌブルの操䜜に぀いおは、最小゚ッゞを芋぀ける手順で説明しおいたす。 テヌブルデヌタを曎新しないず、次の反埩を正しく実行できたせん。 説明されおいるすべおの操䜜は、GPU䞊で䞊行しお実行されたす。



短い芁玄を芁玄する 。 4぀の手順はすべお、䞊行しおグラフィックアクセラレヌタで実行されたす。 䜜業は1次元配列で行われおいたす。 唯䞀の難点は、これらのすべおの手順に間接的なむンデックス付けがあるこずです。 たた、このような配列の凊理によるキャッシュミスを枛らすために、最初に説明したグラフのさたざたな順列が䜿甚されたした。 しかし、残念なこずに、すべおのグラフが間接むンデックス䜜成による損倱を削枛するわけではありたせん。 埌で瀺すように、このアプロヌチでは、RMATグラフは非垞に高いパフォヌマンスを達成したせん。 最小゚ッゞを芋぀けるには、アルゎリズム党䜓が機胜する時間の80たでかかり、残りは残りの20を占めたす。 これは、ルヌプの結合、削陀、および番号の付け盎しの手順で、長さが絶えず枛少する配列反埩から反埩ぞで䜜業が行われるずいう事実によるものです。 考慮されるグラフでは、玄7〜8回の反埩を行う必芁がありたす。 これは、最初のステップですでに凊理される頂点の数がN / 2よりはるかに少なくなるこずを意味したす。最小゚ッゞを芋぀けるためのメむン手順では、頂点Aの配列ず重みWの配列で䜜業が行われたす特定の芁玠が遞択されたす。

グラフの保存に加えお、長さNの配列がさらにいく぀か䜿甚されたした。





最小゚ッゞ怜玢手順のハむブリッド実装。





䞊蚘のアルゎリズムは、最終的に単䞀のGPUでパフォヌマンスが䜎䞋するこずはありたせん。 この問題の解決策は、CPU䞊でもこの手順を䞊列化できるように線成されおいたす。 もちろん、これは共有メモリでのみ行うこずができ、このためにOpenMP暙準を䜿甚し、PCIeバスを介しおCPUずGPUの間でデヌタを転送したした。 タむムラむンでの1回の繰り返しでのプロシヌゞャの実行を想像するず、1぀のGPUを䜿甚するずきの図は次のようになりたす。



最初は、すべおのグラフデヌタがCPUずGPUの䞡方に保存されたす。 CPUが読み取れるようにするには、ツリヌのマヌゞ䞭に移動したセグメントに関する情報を送信する必芁がありたす。 たた、GPUがアルゎリズムの反埩を継続するには、蚈算されたデヌタを返す必芁がありたす。 ホストずアクセラレヌタ間で非同期コピヌを䜿甚するこずは論理的です



CPUのアルゎリズムはGPUで䜿甚されるアルゎリズムを繰り返し、OpenMPのみがルヌプの䞊列化に䜿甚されたす[11] 。 予想どおり、CPUはGPUほど速くカりントされず、コピヌのオヌバヌヘッドも干枉したす。 CPUがその郚分を蚈算するには、蚈算デヌタを15の比率で分割する必芁がありたす。぀たり、CPUに転送されるのは20〜25のみで、残りはGPUで蚈算する必芁がありたす。 残りの手順は、時間がかからず、オヌバヌヘッドずCPU速床の䜎䞋がアルゎリズム時間を増加させるだけなので、あちこちを読むのに有利ではありたせん。 CPUずGPU間のコピヌ速床も非垞に重芁です。 テストされたプラットフォヌムは、PCIe 3.0をサポヌトしおおり、12GB / sに到達できたした。



これたでのずころ、GPUずCPUのRAMの量は倧きく異なり、埌者の方が有利です。 テストプラットフォヌムでは、6 GB GDDR5がむンストヌルされたしたが、CPUでは48 GBもありたした。 GPUのメモリ制限により、倧きなグラフを蚈算できたせん。 そしお、CPUずナニファむドメモリテクノロゞヌ[12]は、CPUメモリからGPUにアクセスするこずを可胜にしたす。 グラフに関する情報は最小゚ッゞを芋぀けるための手順でのみ必芁であるため、倧きなグラフの堎合、最初にすべおの補助配列をGPUメモリに配眮し、次にグラフ配列の䞀郚隣接配列A、配列Xおよび重みWの配列をメモリに配眮できたすGPU、しかし適合しなかったもの-CPUのメモリ内。 さらに、蚈算䞭に、GPUに適合しなかった郚分がCPUで凊理されるようにデヌタを分割するこずができ、GPUはCPUメモリぞのアクセスを最小限に䜿甚したすグラフィックアクセラレヌタからCPUメモリぞのアクセスはPCIeバスを介しお、 15 GB /秒。 デヌタがどの割合で分割されおいるかは事前にわかっおいるため、GPUたたはCPUでアクセスするメモリを決定するには、配列が分離されるポむントを瀺す定数を入力するだけで十分で、GPUのアルゎリズムを1回チェックするだけでどこで実行するかを決定できたすアピヌル。 これらの配列のメモリ内の堎所は、おおよそ次のように衚すこずができたす。



したがっお、蚘茉されおいる圧瞮アルゎリズムを䜿甚しおも、GPUに最初は収たらないグラフを凊理できたすが、PCIeのスルヌプットは非垞に限られおいるため、より䜎い速床で凊理できたす。



詊隓結果



テストは、192個のcudaコア合蚈2688を備えた14個のSMXず、3.7 GHzの呚波数を備えた6個のコア12番目のIntel Xeon E5 v1660プロセッサを備えたNVidia GTX Titan GPUで実行されたした。 テストが実行されたグラフは䞊蚘のずおりです。 いく぀かの特城のみを瀺したす。

スケヌル2 ^ N 頂点の数 リブの数2 * M グラフサむズ、GB
RMAT SSCA2
16 65,536 2,097 152 〜2 100 000 〜0.023
21 2,097 152 67 108 864 〜67,200,000 〜0.760
24 16 777 216 536 870 912 〜537癟䞇 〜6.3
25 33554432 1,073,741,824 〜1,075,000,000 〜12.5
26 67108864 2 147 483 648 〜2 150 000 000 〜25.2
27 134 217 728 4,294,967,296 〜4,300,000,000 〜51.2


スケヌル16のグラフは非垞に小さく玄25 MB、倉換なしでも1぀の最新のIntel Xeonプロセッサのキャッシュに簡単に収たるこずがわかりたす。 グラフの重みは合蚈の2/3を占めるため、実際には玄8 MBを凊理する必芁がありたすが、これはL2 GPUキャッシュの玄5倍にすぎたせん。 ただし、倧きなグラフには十分な量のメモリが必芁であり、スケヌル24のグラフでさえ、圧瞮せずにテスト枈みGPUのメモリに収たらなくなりたす。 グラフ衚珟に基づいお、26番目のスケヌルは最埌のスケヌルで、゚ッゞの数が笊号なし敎数に配眮されたす。これは、さらにスケヌリングするためのアルゎリズムの制限です。 この制限は、デヌタ型を拡匵するこずで簡単に回避できたす。 これは、単粟床unsigned intの凊理がdoubleunsigned long longよりも䜕倍も高速であり、メモリの量がただ非垞に少ないため、これたでのずころそれほど関連しおいないようです。 パフォヌマンスは、1秒あたりに凊理される゚ッゞの数で枬定されたす1秒あたりの通過゚ッゞ-TEPS。



コンパむルは、オプション-O3 -arch = sm_35のNVidia CUDA Toolkit 7.0を䜿甚しお、オプション-O3のIntel Composer 2015を䜿甚しお実行されたした。 実装されたアルゎリズムの最倧パフォヌマンスは、以䞋のグラフで芋るこずができたす



グラフは、すべおのSSCA2最適化を䜿甚しお、グラフが良奜なパフォヌマンスを瀺しおいるこずを瀺しおいたす。グラフが倧きいほど、パフォヌマンスが向䞊しおいたす。 この成長は、すべおのデヌタがGPUのメモリに配眮されるたで維持されたす。 25スケヌルず26スケヌルでは、Unified Memoryメカニズムが䜿甚されたした。これにより、速床は䜎䞋したすが、結果を埗るこずができたしたただし、以䞋に瀺すように、CPUのみより高速です。 12 GBのメモリを搭茉し、ECCずIntel Xeon E5 V2 / V3プロセッサを無効にしたTesla k40で蚈算を実行した堎合、スケヌル25のSSCA2グラフで玄3000 MTEPSを達成でき、26スケヌルのグラフだけでなく、 27.このような実隓は、その耇雑な構造ずアルゎリズムの䞍十分な適応のために、RMATグラフでは実斜されたせんでした。



さたざたなアルゎリズムのパフォヌマンスの比范



この問題は、GraphHPC 2015カンファレンスのコンペティションの枠組みで解決されたしたが、著者によるず、このコンペティションで1䜍になったAlexander Daryinによっお曞かれたプログラムず比范したいず思いたす。

䞀般的な衚には、䜜成者が提䟛したテストプラットフォヌムの結果が含たれおいるため、説明したプラットフォヌムGTX Titan + Xeon E5 v2のCPUおよびGPUにグラフィックスを配眮するのは適切です。 以䞋は、2぀のグラフの結果です。







グラフから、この蚘事で説明したアルゎリズムはSSCA2グラフに察しおより最適化されおいるのに察し、Alexander Daryinによっお実装されたアルゎリズムはRMATグラフに察しお最適化されおいるこずがわかりたす。 この堎合、どの実装が最良であるかを明確に蚀うこずは䞍可胜です。それぞれに独自の長所ず短所があるためです。 たた、アルゎリズムを評䟡する基準は明確ではありたせん。 倧きなグラフの凊理に぀いお話す堎合、アルゎリズムが24〜26スケヌルのグラフを凊理できるずいう事実は倧きなプラスであり、利点です。 任意のサむズのグラフの平均凊理速床に぀いお話す堎合、どの平均倀を考慮するかは明確ではありたせん。 明確なこずは1぀だけです。1぀のアルゎリズムはSSCA2グラフを適切に凊理し、2番目はRMATです。 これら2぀の実装を組み合わせた堎合、平均パフォヌマンスは23スケヌルで玄3200 MTEPSになりたす。 ここでアレクサンダヌダリンアルゎリズムのいく぀かの最適化の蚘述のプレれンテヌションを芋぀けるこずができたす 。



倖囜の蚘事から、次のものを区別するこずができたす。

1 [13]この蚘事から、説明したアルゎリズムの実装にいく぀かのアむデアが䜿甚されたした。 叀いNVidia Tesla S1070でテストが行​​われたため、著者によっお埗られた結果を盎接比范するこずはできたせん。 著者がGPUで達成したパフォヌマンスは18〜36 MTEPSの範囲です。 2009幎ず2013幎に公開。

2 [14] GPUでのPrimアルゎリズムの実装。

3 [15] GPUでのk NN-Boruvkaの実装。

CPUにはいく぀かの䞊列実装もありたす。 しかし、倖囜の蚘事では高いパフォヌマンスを芋぀けるこずができたせんでした。 たぶん、読者の䞀人が私が䜕かを芋逃したかどうかを知るこずができるでしょう。 たた、ロシアではこのトピックに関する出版物がほずんどないこずも泚目に倀したす Vadim Zaitsevを陀く。これは非垞に悲しいこずです。



競争に぀いお、そしお結論ではなく



私は、過去に぀いお述べ、MSTの最良の実装のための競争に぀いお蚀及したいず思いたす。 これらのメモを読んで、私の個人的な意芋を述べる必芁はありたせん。 誰かが非垞に異なった考え方をしおいる可胜性がありたす。



すべおの参加者に぀いおこの問題を解決するための基瀎は、実際には同じBoruvkaアルゎリズムに基づいおいたした。 他のアルゎリズムKruskalaおよびPrimaの蚈算は非垞に耇雑で、GPUなどの䞊列アヌキテクチャにマッピングが遅いか䞍十分であるため、タスクは少し簡略化されおいたす。 䌚議の名前から論理的には、メモリ内で1 GB以䞊を占めるようなグラフ22以䞊のスケヌルを持぀グラフなどのような倧きなグラフを適切に凊理するアルゎリズムを蚘述する必芁があるずいうこずです。 残念なこずに、䜕らかの理由で著者はこの事実を考慮せず、テストプラットフォヌムには合蚈50 MBの2぀のCPU最倧17スケヌル<= 50 MBのグラフが含たれおいたため、競合党䜓がキャッシュでうたく機胜するアルゎリズムを曞くこずになりたした。 受け入れ可胜な結果を​​瀺したのは参加者の1人だけでした-Vadim Zaitsevは、スケヌルのグラフ22で2぀のCPUでかなり高い平均倀を受け取りたした。 しかし、䌚議䞭に刀明したように、この参加者はかなり長い間MSTタスクに埓事しおいたした。 他の実装されたアルゎリズムの倧きなグラフの凊理速床は倧きくない可胜性が高く、コンテストWebサむトで公開されおいるそれらの数倀さらに悪いこずにずは倧きく異なる可胜性がありたす。 たた、グラフ構造が非垞に異なるずいう事実、および算術平均も完党に明確ではないため、生産性の平均倀を突然考慮する必芁がある理由にも泚意を払う䟡倀がありたす。 凊理されたグラフのサむズも考慮されたせんでした。 提䟛されたシステムのもう1぀の䞍快な「機胜」2x Intel Xeon E5-2690およびNVidia Tesla K20xを含むはPCIe 3.0で動䜜しおいたせんただし、GPUでサポヌトされ、サヌバヌボヌドに存圚したす。 その結果、PCIe 2.0の速床はほが3倍䜎いため、Xeon E5よりも高速なわずかではありたすが2぀のプロセッサヌを䜿甚するこずはできたせんでした。



グラフ凊理はアヌキテクチャ䞊の機胜のためにGPUで䞊列化するのが難しいため、GPUでこのような問題を解決するのは簡単ではないこずに泚意しおください。 そしおおそらく、これらのコンテストは、グラフィックプロセッサ甚の非構造グリッドを䜿甚しお、アルゎリズムを蚘述する分野の専門家の開発に貢献するはずです。 しかし、今幎の結果ず前回の結果から刀断するず、残念ながら、そのようなタスクでのGPUの䜿甚は非垞に限られおいたす。



参照



[1] en.wikipedia.org/wiki/Sparse_matrix

[2] www.dislab.org/GraphHPC-2014/rmat-siam04.pdf

[3] www.dislab.org/GraphHPC-2015/SSCA2-TechReport.pdf

[4] www.nvidia.ru/object/tesla-supercomputer-workstations-ru.html

[5] www.nvidia.ru/object/geforce-gtx-titan-x-ru.html#pdpContent=2

[6] www.amd.com/ru-ru/products/graphics/workstation/firepro-3d/9100

[7] en.wikipedia.org/wiki/Bor%C5%AFvka 's_algorithm

[8] www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf

[9] habrahabr.ru/company/epam_systems/blog/247805

[10] on-demand.gputechconf.com/gtc/2013/presentations/S3174-Kepler-Shuffle-Tips-Tricks.pdf

[11] openmp.org/wp

[12] devblogs.nvidia.com/parallelforall/unified-memory-in-cuda-6

[13] stanford.edu/~vibhavv/papers/old/Vibhav09Fast.pdf

[14] ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5678261&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D5678261

[15] link.springer.com/chapter/10.1007%2F978-3-642-31125-3_6



All Articles