これは、 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;
}