5

CUDA 5.0プログラミングガイドによると、(FermiまたはKeplerで)L1とL2の両方のキャッシュを使用している場合、すべてのグローバルメモリ操作は128バイトのメモリトランザクションを使用して実行されます。ただし、L2のみを使用している場合は、32バイトのメモリトランザクションが使用されます(F.4.2章)。

すべてのキャッシュが空であると仮定しましょう。ワープがあり、各スレッドが単一の4バイトワードに完全に整列した方法でアクセスしている場合、これはL1 + L2の場合は1x128Bトランザクションになり、L2のみの場合は4x32Bトランザクションになります。そうですか?

私の質問は、4つの32Bトランザクションは単一の128Bトランザクションよりも遅いですか?フェルミ以前のハードウェアからの私の直感は、それが遅くなることを示唆していますが、おそらくこれは新しいハードウェアではもはや真実ではありませんか?または、メモリアクセスの効率を判断するために、帯域幅の使用量を確認する必要がありますか?

4

1 に答える 1

6

はい、キャッシングモードでは、(L1キャッシュレベルから見て)単一の128バイトトランザクションが生成されます。非キャッシュモードでは、(L2キャッシュレベルから見て)4つの32バイトトランザクションが生成されます。あなたが説明する場合、キャッシュされたモードまたはキャッシュされていないモードに関係なく、完全に合体したアクセスの場合、4つの32バイトトランザクションは遅くなりません。(特定のGPU上の)メモリコントローラーは、どちらの場合でもワープの要求を満たすために同じトランザクションを生成する必要があります。メモリコントローラーは多数(最大6)の「パーティション」で構成されており、各パーティションには64ビット幅のパスがあるため、最終的には複数のメモリトランザクション(おそらく複数のパーティションにまたがる)を使用して、いずれかの要求(4x32バイトまたは1x128バイト)。パーティション間のトランザクションと編成の具体的な数はGPUごとに異なる場合があります(質問の一部ではありませんが、DDRポンプメモリを備えたGPUは、メモリトランザクションごとにパーティションごとに16バイトを返し、QDRポンプメモリを備えたGPUはメモリトランザクションごとにパーティションごとに32バイトを返します)。これもCUDA5に固有のものではありません。NVIDIAのいずれかを確認することをお勧めしますこの資料のウェビナー、特に「CUDA最適化:メモリ帯域幅制限カーネル」。ビデオを見たくない場合でも、スライドを簡単に確認すると、いわゆる「キャッシュ」アクセスと「非キャッシュ」アクセス(これはL1を指します)のさまざまな違いを思い出し、また、それぞれのケースを試すために必要なコンパイラスイッチ。

スライドを確認するもう1つの理由は、「キャッシュされていない」モードを試してみたい状況を思い出させるためです。特に、ワ​​ープからの分散(非合体)アクセスパターンがある場合、キャッシュされていないモードのアクセスは、128バイトと比較して単一スレッドの要求を満たすためにメモリから32バイトの量を要求するときの「無駄」が少ないため、改善される可能性があります量。ただし、最後の質問に答えて、それについて分析することはかなり困難です。おそらく、コードは順序付けられたアクセスパターンと無秩序なアクセスパターンが混在しているためです。キャッシュされていないモードはコンパイラスイッチを介してオンになるため、スライドに示されている提案は、単に「コードを両方の方法で試して」、どちらがより高速に実行されるかを確認することです。私の経験では、

編集:申し訳ありませんが、間違ったプレゼンテーションのリンクとタイトルがありました。スライド/ビデオのリンクとウェビナーのタイトルを修正しました。

于 2012-10-09T14:16:15.493 に答える