[CUDA] 判断一个指针是GPU还是CPU
文章目录
- cudaPointerGetAttributes
cudaPointerGetAttributes
用cudaPointerGetAttributes函数去获取cudaPointerAttributes, 然后通过判断cudaPointerAttributes中的type来确定指针类型。
- 这些函数和枚举在cuda-11.x/targets/x86_64-linux/include/driver_types.h中
#include <cuda_runtime_api.h>/*
enum __device_builtin__ cudaMemoryType
{cudaMemoryTypeUnregistered = 0, /**< Unregistered memory */cudaMemoryTypeHost = 1, /**< Host memory */cudaMemoryTypeDevice = 2, /**< Device memory */cudaMemoryTypeManaged = 3 /**< Managed memory */
};
*/
// 将要判断的指针 ptr
cudaPointerAttributes attr;
cudaPointerGetAttributes(&attr, ptr);
if (attr.type == cudaMemoryTypeDevice) {std::cout << "GPU" << std::endl;
} else {std::cout << "CPU" << std::endl;
}
- 什么时候使用呢? 有的时候host上的地址也会被kernel访问,但是会导致kernel变慢;则这个时候判断pointer的类型,就能清楚知道问题。所以当一个kernel异常慢时,可以考虑是否传入地址为host地址;【可能在地址统一模式下存在这种情况】