ポインタの指しているメモリ判定

CUDA Advent Calendar 2019 23日目の記事です.

CUDAではポインタを引数にとってそれがどの記憶領域を指しているかを返す関数があります.
それがこの4つです.

  • __isConstant
  • __isGlobal
  • __isLocal
  • __isShared
使い方としてはこんな感じです. 実行するとこんな感じの結果が得られます.
      g [0x7f9adb400000] : global
      h [0x7f9adb600000] : global
      s [0x7f9b04000000] : shared
      r [0x7f9b06fffce0] : local
      c [0x7f9ae0800000] : constant
   null [(nil)] : global
nullptrはGlobalメモリ扱いなんですね.
当然コンパイル時には判別しようがないことなので実行時に判定するのですが,PTXではどうなっているかと言うと,それぞれ
  • isspacep.const
  • isspacep.global
  • isspacep.local
  • isspacep.shared
という命令になっていました.
しかしアドレスを見れば空間の判定なんてできそうな気がしますよね?
そんなことを思いSASSを見てみたところ,適当にアドレスにマスクをかけて判定する系のコードに変わっていました.
流石にハードウェア実装することはないようです.
カテゴリー:CUDA
記事作成日:2019-12-23