1

私は科学アプリケーションに使用されるGPUに関する理論的なものを研究していて、次の文を見つけました。

高い演算強度と多くのデータ要素は、ビッグデータキャッシュの代わりに計算によってメモリアクセスレイテンシを隠すことができることを意味します。

これは正確にはどういう意味ですか?GPUのプログラミング時に事前に計算された結果を保存しないようにするための提案として解釈できますが、デバイスで関数を実行するたびにそれらを計算しますか?

たとえば、大量の計算を含む長い配列を計算するために再帰ループを実行するコードがあるとします。さらに、ループ内で一部の計算をスキップするのに役立つ部分配列を事前に計算できると仮定します。これは、それほど高価ではないものもあります。引用によると、これを回避する必要がありますが、サイクルごとにこれらの配列を計算する必要がありますか?

4

3 に答える 3

1

GPU はさまざまな種類のメモリにアクセスできます。処理する GPU データと、計算が完了したときに GPU から取得するデータを提供するために使用するメモリの種類は、グローバル メモリです (たとえば、標準の GTX480 には 1.5 GB のメモリがあります)。

このメモリは帯域幅が広いですが、レイテンシも高くなります (GTX480 で約 400 ~ 800 サイクル)。そのため、物事を事前に計算してグローバル メモリに格納し、それを取得する (高いレイテンシが発生する) 代わりに、GPU で計算する方が適切です。これにより、事前計算されたデータを取得するためにメモリを待機する必要がなくなります。

特定の時間にアクティブなすべてのスレッド (= ワープ) がある場合、データが到着していないためにこれらのスレッドが先に進めないため、高いレイテンシが発生します。GPU は 400 ~ 800 サイクルで非常に多くの計算を行うことができるため、メモリ フェッチを計算用に交換することをお勧めします。

そうは言っても、利用可能な他のタイプのメモリを使用できます。たとえば、CUDA では、オンチップ メモリ (共有メモリ) にアクセスできます。これは非常に高速で、レイテンシが非常に低くなります。warp 内の 1 つのスレッドで何かを計算し、それを共有メモリに格納して、他のスレッドにその値を使用させることができます。したがって、事前計算を GPU に移動し、オンチップ メモリを使用して事前計算された値を取得します。

于 2013-02-03T19:09:14.620 に答える
0

GPU は、データの並列計算に適しています。言い換えれば、同じ命令ですが、異なるデータセット上にあります。各サイクルで、GPU は有限セットのスレッドを実行します。ただし、スレッドのグループ (32 スレッド = ワープ) がロード/ストア操作を実行すると、グローバル メモリへのアクセスが必要になり、それによってレイテンシが発生します。前のグループがそのデータを待機している間に、別のグループのスレッドが実行される可能性があります。したがって、多くのデータ要素というキーワードがあります。GPU でのレイテンシ トレランスは、多くのスレッドを自由に使用できるようにすることで行われます。これにより、長いレイテンシ操作が発生した場合に、スレッドの別のバッチを実行できます。

ただし、事前計算された結果が他の計算に使用される場合、GPU に保存しないことを示唆しているとは思いません。たとえば、積行列の要素が共通のオペランドを共有する行列乗算の場合、これらのオペランドが共有メモリに格納されると、マルチプロセッサごとであるため、パフォーマンスが向上します。

于 2013-02-03T18:21:29.013 に答える