62 std::initializer_list<cudaDeviceAttr> filter = {cudaDevAttrUnifiedAddressing, cudaDevAttrConcurrentManagedAccess};
64 for (
int dev = 0; dev < devCount; ++dev) {
66 for (
auto it=exclude.begin(); check && it!=exclude.end(); ++it)
if (dev == *it) check = 0;
67 for (
auto it=filter.begin(); (t&2) && check && it!=filter.end(); ++it)
cudaCheck(cudaDeviceGetAttribute( &check, *it, dev));
68 for (
auto it= this->begin(); (t&1) && check && it!= this->end(); ++it)
cudaCheck(cudaDeviceCanAccessPeer(&check, dev, it->first));
74 (*this)[dev] = stream;
79 void* entryPoint =
nullptr;
80#if CUDART_VERSION >= 13000
81 cudaDriverEntryPointQueryResult queryResult;
82 cudaCheck(cudaGetDriverEntryPointByVersion(
"cuMemGetAllocationGranularity", &entryPoint, 13000, cudaEnableDefault, &queryResult));
84#elif CUDART_VERSION >= 12000
85 cudaDriverEntryPointQueryResult queryResult;
86 cudaCheck(cudaGetDriverEntryPoint(
"cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault, &queryResult));
89 cudaCheck(cudaGetDriverEntryPoint(
"cuMemGetAllocationGranularity", &entryPoint, cudaEnableDefault));
91 mFunctPtr =
reinterpret_cast<FuncT*
>(entryPoint);
107 CUmemAllocationProp prop = {};
108 prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
109 prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
110 size_t minGranularity = 0;
111 for (
auto it = this->begin(); it!=this->end(); ++it) {
112 prop.location.id = it->first;
113 size_t granularity = 0;
114 (*mFunctPtr)(&granularity, &prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
115 if (minGranularity < granularity) minGranularity = granularity;
117 return minGranularity;
DeviceStreamMap(DeviceType t=DeviceType::Unified, std::vector< int > exclude={}, int verbose=0)
Initiates a map between CUDA device IDs and corresponding streams that satisfy certain constraints....
Definition DeviceStreamMap.h:60