diff --git a/include/hsakmt.h b/include/hsakmt.h index 5fadf78577..55199bb659 100644 --- a/include/hsakmt.h +++ b/include/hsakmt.h @@ -416,6 +416,21 @@ hsaKmtMapMemoryToGPU( HSAuint64* AlternateVAGPU //OUT (page-aligned) ); +/** + Ensures that the memory is resident and can be accessed by GPUs +*/ + +HSAKMT_STATUS +HSAKMTAPI +hsaKmtMapMemoryToGPUNodes( + void* MemoryAddress, //IN (page-aligned) + HSAuint64 MemorySizeInBytes, //IN (page-aligned) + HSAuint64* AlternateVAGPU, //OUT (page-aligned) + HsaMemMapFlags MemMapFlags, //IN + HSAuint64 NumberOfNodes, //IN + HSAuint32* NodeArray //IN + ); + /** Releases the residency of the memory */ diff --git a/include/hsakmttypes.h b/include/hsakmttypes.h index 75fbcb7a58..e9885398e5 100644 --- a/include/hsakmttypes.h +++ b/include/hsakmttypes.h @@ -476,7 +476,7 @@ typedef struct _HsaMemMapFlags struct { unsigned int Reserved1 : 1; // - unsigned int CachePolicy : 4; // see HSA_CACHING_TYPE + unsigned int CachePolicy : 2; // see HSA_CACHING_TYPE unsigned int ReadOnly : 1; // memory is not modified while mapped // allows migration scale-out unsigned int PageSize : 2; // see HSA_PAGE_SIZE, hint to use @@ -492,7 +492,7 @@ typedef struct _HsaMemMapFlags // may trigger eviction of nonessential // data from the memory, reduces latency // “cleanup hint” only, may be ignored - unsigned int Reserved : 21; + unsigned int Reserved : 23; }; HSAuint32 Value; }; diff --git a/src/libhsakmt.h b/src/libhsakmt.h index e1d52b7efe..d277da07b0 100644 --- a/src/libhsakmt.h +++ b/src/libhsakmt.h @@ -63,6 +63,8 @@ HSAKMT_STATUS validate_nodeid(uint32_t nodeid, uint32_t *gpu_id); HSAKMT_STATUS gpuid_to_nodeid(uint32_t gpu_id, uint32_t* node_id); uint16_t get_device_id_by_node(HSAuint32 node_id); uint16_t get_device_id_by_gpu_id(HSAuint32 gpu_id); +HSAKMT_STATUS validate_nodeid_array(uint32_t **gpu_id_array, + uint32_t NumberOfNodes, uint32_t *NodeArray); HSAKMT_STATUS topology_sysfs_get_gpu_id(uint32_t node_id, uint32_t *gpu_id); HSAKMT_STATUS topology_sysfs_get_node_props(uint32_t node_id, HsaNodeProperties *props, uint32_t *gpu_id); diff --git a/src/libhsakmt.ver b/src/libhsakmt.ver index 9a8a14835b..95790923dd 100644 --- a/src/libhsakmt.ver +++ b/src/libhsakmt.ver @@ -28,6 +28,7 @@ hsaKmtRegisterMemory; hsaKmtRegisterMemoryToNodes; hsaKmtDeregisterMemory; hsaKmtMapMemoryToGPU; +hsaKmtMapMemoryToGPUNodes; hsaKmtUnmapMemoryToGPU; hsaKmtDbgRegister; hsaKmtDbgUnregister; diff --git a/src/memory.c b/src/memory.c index c0161b36dc..514673d003 100644 --- a/src/memory.c +++ b/src/memory.c @@ -212,21 +212,10 @@ hsaKmtRegisterMemoryToNodes( { CHECK_KFD_OPEN(); uint32_t *gpu_id_array; - unsigned i; HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS; - if (NumberOfNodes == 0 || NodeArray == NULL) - return HSAKMT_STATUS_INVALID_PARAMETER; - - /* Translate Node IDs to gpu_ids */ - gpu_id_array = malloc(NumberOfNodes * sizeof(uint32_t)); - if (gpu_id_array == NULL) - return HSAKMT_STATUS_NO_MEMORY; - for (i = 0; i < NumberOfNodes; i++) { - ret = validate_nodeid(NodeArray[i], &gpu_id_array[i]); - if (ret != HSAKMT_STATUS_SUCCESS) - break; - } + ret = validate_nodeid_array(&gpu_id_array, + NumberOfNodes, NodeArray); if (ret == HSAKMT_STATUS_SUCCESS) ret = fmm_register_memory(MemoryAddress, MemorySizeInBytes, @@ -269,6 +258,36 @@ hsaKmtMapMemoryToGPU( return HSAKMT_STATUS_ERROR; } +HSAKMT_STATUS +HSAKMTAPI +hsaKmtMapMemoryToGPUNodes( + void* MemoryAddress, //IN (page-aligned) + HSAuint64 MemorySizeInBytes, //IN (page-aligned) + HSAuint64* AlternateVAGPU, //OUT (page-aligned) + HsaMemMapFlags MemMapFlags, //IN + HSAuint64 NumberOfNodes, //IN + HSAuint32* NodeArray //IN +) +{ + uint32_t *gpu_id_array; + HSAKMT_STATUS ret; + + ret = validate_nodeid_array(&gpu_id_array, + NumberOfNodes, NodeArray); + if (ret != HSAKMT_STATUS_SUCCESS) { + free(gpu_id_array); + return ret; + } + + ret = fmm_register_memory(MemoryAddress, MemorySizeInBytes, + gpu_id_array, NumberOfNodes); + if (ret != HSAKMT_STATUS_SUCCESS) + return ret; + + return fmm_map_to_gpu(MemoryAddress, + MemorySizeInBytes, AlternateVAGPU); +} + HSAKMT_STATUS HSAKMTAPI hsaKmtUnmapMemoryToGPU( diff --git a/src/topology.c b/src/topology.c index 0c0ce576d0..c6e55f09c3 100644 --- a/src/topology.c +++ b/src/topology.c @@ -1317,6 +1317,30 @@ uint16_t get_device_id_by_gpu_id(HSAuint32 gpu_id) return 0; } +HSAKMT_STATUS validate_nodeid_array(uint32_t **gpu_id_array, + uint32_t NumberOfNodes, uint32_t *NodeArray) +{ + HSAKMT_STATUS ret; + unsigned int i; + + if (NumberOfNodes == 0 || NodeArray == NULL || gpu_id_array == NULL) + return HSAKMT_STATUS_INVALID_PARAMETER; + + /* Translate Node IDs to gpu_ids */ + *gpu_id_array = malloc(NumberOfNodes * sizeof(uint32_t)); + if (*gpu_id_array == NULL) + return HSAKMT_STATUS_NO_MEMORY; + for (i = 0; i < NumberOfNodes; i++) { + ret = validate_nodeid(NodeArray[i], gpu_id_array[i]); + if (ret != HSAKMT_STATUS_SUCCESS) { + free(gpu_id_array); + break; + } + } + + return ret; +} + #if 0 static int get_cpu_stepping(uint16_t* stepping) {