CUDA では、ものすごく大きなグローバルメモリのレイテンシを、複数のスレッドから連続した領域へのアクセスを行い、隠蔽するというのが一般的である。
それとは別に CUDA は同時に1つの kernel しか立ち上げられないので、
GPU : [1] -> [4] -> [1] -> [6] -> [1]
GPU 上だけで「逐次 -> 並列 -> 逐次 -> 並列 -> 逐次」のような実行が難しい。
Dijkstra 法の枝の更新部分を各 SP に担当させるということである。
そこで、どうするかというと、Forward-Star を構成する際に最大次数(点に隣接する枝数の最大数)が分かるので、その分だけ並列に実行させて if 文で待つという方法を取ることとなる。そうすれば複数のスレッドから連続した領域にアクセスが可能になるので、多少の速度向上は期待できるだろう。
それとは別に CUDA は同時に1つの kernel しか立ち上げられないので、
GPU : [1] -> [4] -> [1] -> [6] -> [1]
GPU 上だけで「逐次 -> 並列 -> 逐次 -> 並列 -> 逐次」のような実行が難しい。
Dijkstra 法の枝の更新部分を各 SP に担当させるということである。
そこで、どうするかというと、Forward-Star を構成する際に最大次数(点に隣接する枝数の最大数)が分かるので、その分だけ並列に実行させて if 文で待つという方法を取ることとなる。そうすれば複数のスレッドから連続した領域にアクセスが可能になるので、多少の速度向上は期待できるだろう。