CUDA では、ポインターの値または変数のアドレスが与えられた場合、ポインターが参照するアドレス空間をイントロスペクトする組み込み API または別の API はありますか?
質問する
278 次
1 に答える
6
CUDAヘッダーファイルsm_20_intrinsics.h
は関数を定義します
__device__ unsigned int __isGlobal(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.global p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
この関数は1
、ジェネリック アドレスptr
がグローバル メモリ空間にある場合に戻ります。が共有、ローカル、または定数メモリ空間にある0
かどうかを返します。ptr
PTX 命令isspacep
は、面倒な作業を行います。この方法で類似の関数を構築できるはずです。
__device__ unsigned int __isShared(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.shared p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
于 2013-05-21T20:17:26.587 に答える