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