Skip to content

[FEA] cuda.core: memory-pool location routing and new pool attributes (CUDA 13.0/13.2) #2362

Description

@leofang

Summary

CUDA 13.0 makes memory-pool routing location-keyed: pools are addressed by
(CUmemLocation, CUmemAllocationType) — covering device pools, host / host-NUMA pools, and
managed pools (CU_MEM_ALLOCATION_TYPE_MANAGED, 13.0) under one surface:

  • cuMemGetDefaultMemPool(CUmemoryPool* pool_out, CUmemLocation* location, CUmemAllocationType type)
  • cuMemGetMemPool(CUmemoryPool* pool, CUmemLocation* location, CUmemAllocationType type) (current pool)
  • cuMemSetMemPool(CUmemLocation* location, CUmemAllocationType type, CUmemoryPool pool)

CUDA 13.2 adds six CUmemPool_attribute members: CU_MEMPOOL_ATTR_ALLOCATION_TYPE,
EXPORT_HANDLE_TYPES, HW_DECOMPRESS_ENABLED, LOCATION_ID, LOCATION_TYPE, MAX_POOL_SIZE.

Current cuda.core state:

  • cuMemGetMemPool is already used internally to obtain non-owning pool handles
    (
    HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type))
    );
    cuMemGetDefaultMemPool / cuMemSetMemPool are unused.
  • None of the 13.2 pool attributes are exposed on the memory-resource classes.
  • CU_MEM_LOCATION_TYPE_NONE (13.0) is used internally and, together with
    CU_MEM_LOCATION_TYPE_INVISIBLE (13.2), is deliberately unmapped in the public StrEnum
    (
    "CU_MEM_LOCATION_TYPE_NONE",
    "CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT",
    "CU_MEM_LOCATION_TYPE_INVISIBLE",
    )
    — this issue should decide their public fate.

Relates to the memory-resource architecture work (#209, #528, #726) — none of which tracks
these APIs.

Underlying C APIs to cover

cuMemGetDefaultMemPool, cuMemGetMemPool, cuMemSetMemPool; CUmemPool_attribute members
ALLOCATION_TYPE, EXPORT_HANDLE_TYPES, HW_DECOMPRESS_ENABLED, LOCATION_ID,
LOCATION_TYPE, MAX_POOL_SIZE; CU_MEM_LOCATION_TYPE_{NONE,INVISIBLE} mapping decision.

Design sketch (draft — needs design-meeting review)

Important

Starting point only, not a settled design — review in the cuda.core design meeting.

  • Read-only properties on DeviceMemoryResource (and the host/managed resources) for the new
    pool attributes; max_pool_size may warrant a setter — TBD.
  • Device.default_memory_resource (and a host-side equivalent) backed by
    cuMemGetDefaultMemPool, returning the corresponding memory-resource wrapper.
  • cuMemSetMemPool is a process-global state mutation — either expose it as an explicit,
    loudly-documented function, or deliberately keep it unexposed initially.

Open questions for the meeting:

  1. Expose the global setter at all (footgun) vs. get-only in the first pass?
  2. How (location, allocation type) keying maps onto cuda.core's Device/Host location
    objects (incl. host-NUMA IDs).
  3. Does HW_DECOMPRESS_ENABLED belong here or with a future decompress feature?
  4. Public StrEnum mapping for NONE/INVISIBLE location types.

References

-- Leo's bot

Metadata

Metadata

Assignees

Labels

cuda.coreEverything related to the cuda.core modulefeatureNew feature or requesttriageNeeds the team's attention

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions