2012-03-18 11 views
4

cudaプロファイラマニュアルには、より緩和された合体ポリシーのため、未処理メモリトランザクションの数が常にゼロになると記載されています。しかし、私はまだuncoalescingがあると確信しています。それを計算する方法?その周辺に役立つツールやシミュレータはありますか?それらの中で、どれが最も正確であるように見えるか? おかげデバイス1.0ではgpuでの合体および未合併メモリトランザクションの数1.3

+0

メモリトランザクションが一貫していないことを確認しますか? CUDA memcpyのような既知のベンチマークとカーネルのメモリスループットを比較する方が簡単でしょうか? – talonmies

答えて

10

は、あなたは2つのオプションしかいました:

  • メモリアクセスが合体され、すべてのデータが1つのメモリトランザクション中にフェッチされ
  • メモリアクセスは、非融合であり、データがフェッチされる1バイしたがって、常に16のメモリトランザクション(ハーフワープ)。

ただし、デバイス1.2と1.3では、これは異なって行われます。 デバイスメモリをそれぞれ128バイトのチャンクに分割したとします。ヒットしたチャンクの数だけメモリトランザクションが必要です。だから、:あなたはちょうどあなたがすべてのn番目の単語のすべてのスレッドアクセスあれば2つのメモリトランザクション

  • を得ることができます位置がずれた場合、あなたが完全に合体したアクセス権を取得する場合

    • 、あなたは1つのメモリトランザクション
    • を取得し、あなたは3を得ることができます、4、またはそれ以上のメモリ・トランザクション
    • 最悪の場合には、あなたは、16回のメモリ・トランザクション
    • を得ることができますが、アクセスは多少ランダムますが、ローカライズされた場合でも、2つのスレッドが同じチャンクに陥ることが起こることがあり、あなたがより少ないが必要になります16メモリトランザクション

    このように多くのケースがあるので、それを2つのカテゴリにまとめる:合体/非合体はもう意味をなさない。だからこそ、Cuda Profilerは別の方法をとったのです。彼らは単純にメモリトランザクションの数を数えます。アクセスパターンがランダムであるほど、メモリアクセス命令のカウントが同じでも、メモリトランザクションのカウントが高くなります。

    上記は若干単純化されたモデルです。実際には、メモリトランザクションは、128バイト、64バイト、または32バイト幅のチャンクにアクセスし、帯域幅を節約できます。カラムのロード128b、ロード64b、ロード32b、ストア128b、ストア64b、ストア32bをプロファイラに探します。

  • +0

    詳細な回答ありがとうございます。ただし、メモリアクセスパターンがすべてのワープで似ていると仮定すると、まったく別の考えです。カウンタgld_coherentをカウンタgld_requestに直接捨てると、ワープあたり(未結合の)メモリトランザクションの数がわかります。 – Zk1001

    関連する問題