2013-02-15 10 views
6

CUDAでは、ポインタがデバイスまたはホスト上のメモリを指しているかどうかを知る方法はありません。ポインタがCUDAのデバイスまたはホストを指している場合の検出

AはこれのOPの例は、可能性が作られた。

int *dev_c, *host_c; 
cudaMalloc((void**)&dev_c, sizeof(int)); 
host_c = (int*) malloc(sizeof(int)); 

私は名前でコースを見てのことができますが、ホストをポインタdev_cとhost_c広告を見ていると、host_cポイント広告を言うのいずれかの方法がありますdev_cはデバイスを指し示します。

+2

残念ながら、ポインタがホストまたはデバイスに割り当てられているかどうかを判断する方法はありません。 – sgarizvi

答えて

0

私はそれが可能ではないと思います。ポインタはメモリ内のいくつかのアドレスを指しており、これがホストまたはデバイスのメモリであるかどうかはわかりません。プログラムが起動すると、OSのメモリ内のすべてのアドレスに(ほぼ)置くことができるので、推測できません。変数名に注意する必要があります。

3

直接ではありません。 1つのアプローチは、デバイスポインタのカプセル化クラスを記述することです。そのため、コード内でデバイスポインタとホストポインタが異なることが絶対に明らかです。このアイデアのモデルは、device_ptrと呼ばれるタイプのテンプレートライブラリThrustで見ることができ、デバイスとホストのポインタタイプを明確に記述します。

5

CUDA 4とFermi GPUを起動しています。 NvidiaはUVA (Unified Virtual Address Space)をサポートしています。 機能cudaPointerGetAttributesはあなたが求めているものとまったく同じようです。私はそれがcudaHostAllocで割り振られたホストポインター(c mallocではない)に対してのみ動作すると考えています。

2

これは、ポインタがホストまたはデバイスのメモリ空間を指しているかどうかを検出するためにUnified Virtual Addressingをどのように使用できるかを示す小さな例です。 @PrzemyslawZychは指摘したように、cudaMallocHostで割り当てられたホストポインタに対してのみ動作します。

#include<stdio.h> 

#include<cuda.h> 
#include<cuda_runtime.h> 

#include<assert.h> 
#include<conio.h> 

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } 
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true) 
{ 
    if (code != cudaSuccess) 
    { 
     fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); 
     getch(); 
     if (abort) { exit(code); getch(); } 
    } 
} 

int main() { 

    int* d_data; 
    int* data; // = (int*)malloc(16*sizeof(int)); 
    cudaMallocHost((void **)&data,16*sizeof(int)); 

    gpuErrchk(cudaMalloc((void**)&d_data,16*sizeof(int))); 

    cudaDeviceProp prop; 
    gpuErrchk(cudaGetDeviceProperties(&prop,0)); 

    printf("Unified Virtual Addressing %i\n",prop.unifiedAddressing); 

    cudaPointerAttributes attributes; 
    gpuErrchk(cudaPointerGetAttributes (&attributes,d_data)); 
    printf("Memory type for d_data %i\n",attributes.memoryType); 
    gpuErrchk(cudaPointerGetAttributes (&attributes,data)); 
    printf("Memory type for data %i\n",attributes.memoryType); 

    getch(); 

    return 0; 
} 
関連する問題