检测指针是否指向CUDA中的设备或主机

时间:2013-02-15 09:29:01

标签: cuda

在CUDA中有任何方法可以知道指针是否指向设备或主机的内存。

这样做的一个例子可能是:

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指向广告设备。

4 个答案:

答案 0 :(得分:6)

开始(我认为)CUDA 4和Fermi GPU。 Nvidia支持UVA (Unified Virtual Address Space)。 函数cudaPointerGetAttributes似乎完全符合您的要求。请注意,我相信它只适用于使用cudaHostAlloc(而不是c malloc)分配的主机指针。

答案 1 :(得分:3)

不直接。一种方法是为设备指针编写一个封装类,这样就可以清楚地知道代码中的设备和主机指针是不同的。您可以在Thrust模板库中查看此构思的模型,该库具有名为device_ptr的类型,以清楚地描述设备和主机指针类型。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

我不认为这是可能的。指针指向内存中的某些地址,如果这是主机或设备内存,则现在不会。当程序启动时,它可以(几乎)放入操作系统内存中的每个地址,这样你就无法猜测。你应该注意变量名称。