在 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 指向设备。
在 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 指向设备。
开始(我认为)CUDA 4 和 Fermi GPU。Nvidia 支持UVA(统一虚拟地址空间)。函数cudaPointerGetAttributes似乎完全符合您的要求。请注意,我相信它仅适用于使用 cudaHostAlloc(而不是 c malloc)分配的主机指针。
这是一个小例子,展示了如何使用统一虚拟寻址来检测指针是否指向主机或设备内存空间。正如@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;
}
不是直接的。一种方法是为设备指针编写一个封装类,以便绝对清楚设备和主机指针在您的代码中是不同的。你可以在Thrust模板库中看到这个想法的模型,它有一个类型被调用device_ptr
来清楚地描述设备和主机指针类型。
我不认为这是可能的。指针指向内存中的某个地址,如果这是主机或设备内存,您现在不指向。当程序启动时,它可以(几乎)放入操作系统内存中的每个地址,因此您无法猜测。您应该注意变量名称。