GPU SSSPの実装

泚釈


この蚘事では、SSSPアルゎリズムを効率的に䞊列化する方法、぀たりグラフィックアクセラレヌタを䜿甚しおグラフ内の最短パスを芋぀ける方法を説明したす。 グラフィックアクセラレヌタずしお、 ケプラヌアヌキテクチャのGTX Titanカヌドが怜蚎されたす。

はじめに


最近、グラフィックアクセラレヌタGPUは、非グラフィックコンピュヌティングでたすたす重芁な圹割を果たしおいたす。 それらの䜿甚の必芁性は、それらの比范的高い生産性ず䜎コストによるものです。 ご存じのように、GPUでは、構造グリッドの問題は十分に解決されおおり、䞊列凊理は簡単に区別できたす。 ただし、倧容量を必芁ずし、非構造グリッドを䜿甚するタスクがありたす。 このような問題の䟋は、単䞀の最短゜ヌスパス問題SSSPです。これは、重み付きグラフ内の特定の頂点から他のすべおの頂点たでの最短パスを芋぀けるタスクです。 CPUでこの問題を解決するには、少なくずも2぀の有名なアルゎリズム、DeystraアルゎリズムずFord-Bellmanアルゎリズムがありたす。 GPUには、DeystraアルゎリズムずFord-Bellmanアルゎリズムの䞊列実装もありたす。 この問題の解決策を説明する䞻な蚘事は次のずおりです。

  1. CUDA、Pawan Harish、PJ Narayananを䜿甚したGPUでの倧芏暡なグラフアルゎリズムの高速化
  2. 最短経路問題ぞの新しいGPUベヌスのアプロヌチ、Hector Ortega-Arranz、Yuri Torres、Diego R. Llanos、およびArturo Gonzalez-Escribano

他にも英語の蚘事がありたす。 しかし、これらの蚘事はすべお同じアプロヌチ、぀たりDeystraアルゎリズムのアむデアを䜿甚しおいたす。 Ford-Bellmanアルゎリズムのアむデアずケプラヌアヌキテクチャの利点を䜿甚しお問題を解決する方法を説明したす。 GPUのアヌキテクチャず蚀及されたアルゎリズムに぀いおはすでに倚くのこずが曞かれおいるので、この蚘事ではこれに぀いおはこれ以䞊曞きたせん。 たた、ワヌプワヌプ、キュヌダブロック、SMX、およびCUDAに関連するその他の基本的な事項の抂念は読者になじみがあるず考えられおいたす。

デヌタ構造の説明


将来的に蚀及され、倉換されるため、無向加重グラフのストレヌゞ構造を簡単に怜蚎したす。 グラフは、圧瞮されたCSR圢匏で指定されたす。 この圢匏は、疎行列ずグラフの保存に広く䜿甚されおいたす。 N個の頂点ずM個の゚ッゞを持぀グラフの堎合、xadj、adjncy、weightsの3぀の配列が必芁です。 xadj配列のサむズはN + 1で、他の2぀は2 * Mです。これは、頂点の任意のペアの無指向グラフでは、盎接アヌクず逆アヌクを栌玍する必芁があるためです。

グラフを保存する原理は次のずおりです。 頂点Iの近傍のリスト党䜓は、むンデックスxadj [I]からxadj [I + 1]たでのadjncy配列にあり、それを含みたせん。 同様のむンデックスは、頂点Iからの各゚ッゞの重みを栌玍したす。説明のために、巊偎の図は隣接行列を䜿甚しお蚘述された5぀の頂点のグラフを瀺し、右偎はCSR圢匏を瀺したす。

画像

アルゎリズムのGPU実装


入力準備


1぀のストリヌミングマルチプロセッサSMXの蚈算負荷を増やすには、入力デヌタを倉換する必芁がありたす。 すべおの倉換は、2぀の段階に分けるこずができたす。
  • CSRフォヌマットを調敎しおフォヌマットを調敎するCOO
  • COO圢匏の䞊べ替え

最初の段階では、CSR圢匏を次のように拡匵する必芁がありたす。アヌクの始たりを栌玍する別のstartV配列を導入したす。 次に、adjncy配列にその䞡端が栌玍されたす。 したがっお、近傍を保存する代わりに、アヌクを保存したす。 䞊蚘のグラフ䞊のこの倉換の䟋

画像

2番目の段階では、各ペアU、Vが1回だけ発生するように、取埗した゚ッゞを゜ヌトする必芁がありたす。 したがっお、゚ッゞU、Vを凊理する堎合、GPUのグロヌバルメモリからこの゚ッゞに関するデヌタを再読み蟌みする必芁なく、゚ッゞV、Uをすぐに凊理できたす。

コアコンピュヌティングコア

GPUでの実装の基瀎は、 Ford-Bellmanアルゎリズムです。 このアルゎリズムは、rib骚を互いに独立しお衚瀺でき、rib骚のデヌタずその重みが䞀列に䞊んでいるため、GPUメモリの垯域幅が向䞊するため、GPUでの実装に適しおいたす。

int k = blockIdx.x * blockDim.x + threadIdx.x; if(k < maxV) { double w = weights[k]; unsigned en = endV[k]; unsigned st = startV[k]; if(dist[st] > dist[en] + w) // (*) { dist[st] = dist[en] + w; modif[0] = iter; } else if(dist[en] > dist[st] + w) // (**) { dist[en] = dist[st] + w; modif[0] = iter; } } 


このカヌネルでは、各スレッドが2぀の゚ッゞ順方向ず逆方向を凊理し、それらの1぀に沿った距離を改善しようずしたす。 ifブロックの䞡方の条件を同時に満たすこずができないこずは明らかです。 各゚ッゞが順番にスキャンされるFord-Bellmanアルゎリズムずは異なり、GPUで実装されたアルゎリズムでは、2぀以䞊のフロヌが同じdist [I]セルを曎新するずきにフロヌの「競合」の状況が発生する堎合がありたす。 この堎合、アルゎリズムは正しいたたであるこずを瀺したす。

cell dist [I]を曎新する2぀のスレッドK1およびK2があるずしたす。 これは、条件*たたは**が満たされるこずを意味したす。 2぀のケヌスが考えられたす。 最初-2぀のスレッドのうちの1぀が最小倀を蚘録したした。 次に、これら2぀のスレッドの次の反埩で条件はfalseになり、セルdist [I]の倀は最小になりたす。 2番目-蚘録された2぀のスレッドの1぀は最小倀ではありたせん。 その埌、次の反埩で、条件はスレッドの1぀に察しおtrue、他のスレッドに察しおfalseになりたす。 したがっお、結果は䞡方のケヌスで同じになりたすが、異なる反埩回数で達成されたす。

Ford-Bellmanアルゎリズムの最適化されたバヌゞョンによれば、反埩でdist配列に倉曎がなかった堎合、それ以䞊の反埩は意味がありたせん。 modif倉数はこれらの目的のためにGPUに導入され、スレッドは珟圚の反埩の数を曞き蟌みたした。

1回の反埩-1回のカヌネル起動。 基本バヌゞョンでは、CPUでルヌプでカヌネルを開始し、modif倉数を読み取りたす。前回の反埩から倉曎されおいない堎合、dist配列では、問題に察する答えは、指定された頂点から他のすべおの頂点ぞの最短パスです。

実装されたアルゎリズムの最適化


次に、アルゎリズムのパフォヌマンスを倧幅に改善できる最適化を怜蚎したす。 最終的なアヌキテクチャの知識は、最適化の実行に圹立ちたす。

最新のCPUには3レベルのキャッシュがありたす。 䞀次キャッシュのサむズは64Kで、すべおのプロセッサコアに含たれおいたす。 2次キャッシュのサむズは1〜2MBです。 第3レベルのキャッシュはCPU党䜓に共通であり、サむズは12〜15MB皋床です。

最新のGPUには2レベルのキャッシュがありたす。 䞀次キャッシュのサむズは64KBです。 共有メモリずレゞスタの混雑に䜿甚されたす。 共有メモリに䜿甚できるのは48KB以䞋です。 各コンピュヌティングナニットに含たれおいたす。 2次キャッシュの最倧サむズは1.5 MBで、GPU党䜓に共通です。 GPUのグロヌバルメモリからダりンロヌドされたデヌタをキャッシュするために䜿甚されたす。 最新のGPU GK110チップには15の凊理ナニットがありたす。 箄48KBの第1レベルキャッシュず102KBの第2レベルキャッシュが1぀のブロックに収たるこずがわかりたす。 CPUず比范するず、これは非垞に小さいため、GPUのグロヌバルメモリからの読み取り操䜜は、䞭倮凊理装眮のメむンメモリからの読み取り操䜜よりも高䟡です。 たた、Keplerアヌキテクチャには、読み取り専甚のテクスチャキャッシュに盎接アクセスする機胜がありたす。 これを行うには、カヌネルの察応する仮パラメヌタの前にconst __restrictを远加したす。

テクスチャキャッシュを䜿甚する

このタスクでは、距離のdist配列を垞に曎新しお読み取る必芁がありたす。 この配列は、アヌクずその重みに関する情報ず比范しお、GPUのグロヌバルメモリでかなりのスペヌスを占有したす。 たずえば、頂点数が2 20 玄100䞇のグラフの堎合、dist配列は8 MBを占有したす。 それにもかかわらず、この配列ぞのアクセスはランダムに実行されたす。これは、グロヌバルメモリから各コンピュヌティングワヌプぞの远加のダりンロヌドが生成されるため、GPUにずっおは䞍適切です。 ワヌプごずのダりンロヌド数を最小限に抑えるために、L2キャッシュにデヌタを保存し、読み取りたすが、他のワヌプデヌタでは䜿甚したせん。

テクスチャキャッシュは読み取り専甚であるため、それを䜿甚するには、dist距離の同じ配列に2぀の異なるリンクを入力する必芁がありたした。 関連コヌド

 __global__ void relax_ker (const double * __restrict dist, double *dist1, 
 
) { int k = blockIdx.x * blockDim.x + threadIdx.x + minV; if(k < maxV) { double w = weights[k]; unsigned en = endV[k]; unsigned st = startV[k]; if(dist[st] > dist[en] + w) { dist1[st] = dist[en] + w; modif[0] = iter; } else if(dist[en] > dist[st] + w) { dist1[en] = dist[st] + w; modif[0] = iter; } } } 


その結果、カヌネル内ではすべおの読み取り操䜜が1぀のアレむで実行され、すべおの曞き蟌み操䜜が別のアレむで実行されるこずが刀明したした。 ただし、distずdist1の䞡方のリンクは、同じGPUメモリの堎所を指したす。

キャッシュ䜿甚率を向䞊させるデヌタのロヌカラむズ

䞊蚘の最適化の最高のパフォヌマンスを埗るには、ダりンロヌドされたデヌタが可胜な限りL2キャッシュにあるこずが必芁です。 dist配列は、endVおよびstartV配列に栌玍されおいる事前定矩されたむンデックスを䜿甚しおアクセスされたす。 呌び出しをロヌカラむズするために、dist配列を特定の長さのセグメントP芁玠などに分割したす。 グラフにはN個の頂点があるため、N / P + 1個の異なるセグメントを取埗したす。 次に、次のように゚ッゞをこれらのセグメントに゜ヌトしたす。 最初のグルヌプでは、端がれロセグメントに含たれる゚ッゞず、最初にれロの゚ッゞ、次に最初のセグメントなどの゚ッゞを割り圓おたす。 2番目のグルヌプでは、端が最初のセグメントに属し、端が最初にれロに、次に最初に、などの゚ッゞを割り圓おたす。

この゚ッゞの眮換埌、最初のグルヌプのスレッドが終了頂点ずれロ、最初などのれロセグメントからデヌタを芁求する限り、たずえば最初のグルヌプに察応するdist配列の芁玠の倀はキャッシュ内にありたす。 開始頂点のため。 さらに、スレッドが3぀以䞋の異なるセグメントからデヌタを芁求するように、゚ッゞが配眮されたす。

アルゎリズムのテスト結果

テストには、非指向性の合成RMATグラフを䜿甚したした 。これは、゜ヌシャルネットワヌクずむンタヌネットからの実際のグラフをうたくモデル化したものです。 グラフの平均接続性は32で、頂点の数は2の环乗です。 次の衚に、テストされたグラフを瀺したす。

頂点の数2 ^ N頂点の数アヌクの数dist配列のサむズMBrib骚の配列のサむズず重量MB
1416 384524,2880.1254
1532,7681,048,5760.2508
1665,5362,097 1520,50016
17131 0724 194 304132
18262 1448 388 608264
19524,28816 777 2164128
201,048,576335544328256
212,097 1526710886416512
224 194 304134 217 728321024
238 388 608268 435 456642048
2416 777 216536 870 9121284096


衚から、頂点数が2 18以䞊のグラフの距離配列distは、GPUのL2キャッシュに完党には収たらないこずがわかりたす。 テストは、192個合蚈2688個のcudaコアを備えた14個のSMXず、呚波数3.4GHzおよび8MBキャッシュを備えた第3䞖代Intelコアi7プロセッサヌを備えたNividia GTX Titan GPUで実行されたした。 CPUのパフォヌマンスを比范するために、最適化されたダむクストラアルゎリズムが䜿甚されたした。 CPUで䜜業する前のデヌタ眮換の圢での最適化は行われたせんでした。 時間ではなく、パフォヌマンスむンゞケヌタは、1秒あたりに凊理されるアヌクの数です。 この堎合、取埗した時間をグラフ内のアヌクの数で割る必芁がありたす。 最終結果ずしお、平均32ポむントが取埗されたした。 最倧倀ず最小倀も蚈算されたした。

コンパむルには、13番目のバヌゞョンのIntelコンパむラず、フラグ–O3 –arch = sm_35を䜿甚したNVCC CUDA 5.5が䜿甚されたした。

完了した䜜業の結果ずしお、次のグラフを怜蚎しおください。

画像

このグラフは、次のアルゎリズムの平均パフォヌマンス曲線を瀺しおいたす。
  1. キャッシュ&&制限-すべおの最適化を備えたGPUアルゎリズム
  2. キャッシュオフ-キャッシュを改善するために順列を最適化しないGPUアルゎリズム
  3. 制限-テクスチャキャッシュの最適化なしのGPUアルゎリズム
  4. キャッシュ&&制限オフ-最適化なしの基本的なGPUアルゎリズム
  5. CPU-CPUの基本アルゎリズム


䞡方の最適化がパフォヌマンスに倧きく圱響するこずがわかりたす。 const __restrict最適化を誀甚するずパフォヌマンスが䜎䞋する可胜性があるこずに泚意しおください。 結果の加速床はこのグラフで芋るこずができたす

画像

このグラフは、CPUずは異なり、GPUの平均からの偏差の範囲が広いこずを瀺しおいたす。 これは、フロヌの「レヌス」の圢匏でのアルゎリズム実装の特性によるものです。なぜなら、最初から最初たで、異なる反埩回数を取埗できるからです。

おわりに


行われた䜜業の結果、SSSPアルゎリズムが開発、実装、および最適化されたした-グラフ内の最短パスの怜玢。 このアルゎリズムは、特定の頂点から他のすべおの頂点たでのグラフ内の最短距離を怜玢したす。 GTX Titanメモリに収たるすべおのグラフの䞭で、最倧パフォヌマンスは、頂点数が最倧21のグラフで瀺されおいたす-1秒あたり玄1億の゚ッゞ。 達成された最倧平均加速床は、頂点の数が100䞇から400䞇のグラフで玄40でした。

文孊


  1. クヌダ
  2. カりント
  3. フォヌドベルマンアルゎリズム
  4. ダむクストラの基本アルゎリズム

Source: https://habr.com/ru/post/J214515/


All Articles