Line data Source code
1 : /** 2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd. 3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of 4 : * CANN Open Software License Agreement Version 2.0 (the "License"). 5 : * Please refer to the License for details. You may not use this file except in compliance with the License. 6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, 7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. 8 : * See LICENSE in the root of the software repository for the full text of the License. 9 : */ 10 : #include "model_config_rt.h" 11 : #include <stdlib.h> 12 : #include "log_inner.h" 13 : 14 : #ifdef __cplusplus 15 : extern "C"{ 16 : #endif 17 : 18 : #define POLICY_MASK_LOW_BIT 0xFF 19 : #define POLICY_MASK_HIGH_BIT 0xFF00 20 : 21 : struct PageType { 22 : uint32_t aclPageType; 23 : uint32_t rtPageTypeBit; 24 : }; 25 : 26 : static struct PageType g_pageMap[] = { 27 : {ACL_MEM_MALLOC_HUGE_FIRST, RT_MEMORY_POLICY_HUGE_PAGE_FIRST}, 28 : {ACL_MEM_MALLOC_HUGE_ONLY, RT_MEMORY_POLICY_HUGE_PAGE_ONLY}, 29 : {ACL_MEM_MALLOC_NORMAL_ONLY, RT_MEMORY_POLICY_DEFAULT_PAGE_ONLY}, 30 : {ACL_MEM_MALLOC_HUGE_FIRST_P2P, RT_MEMORY_POLICY_HUGE_PAGE_FIRST_P2P}, 31 : {ACL_MEM_MALLOC_HUGE_ONLY_P2P, RT_MEMORY_POLICY_HUGE_PAGE_ONLY_P2P}, 32 : {ACL_MEM_MALLOC_NORMAL_ONLY_P2P, RT_MEMORY_POLICY_DEFAULT_PAGE_ONLY_P2P}}; 33 : 34 : 35 19 : static int Compare(const void *a, const void *b) { 36 19 : return (int)((*(const struct PageType*)a).aclPageType - (*(const struct PageType*)b).aclPageType); 37 : } 38 : 39 : 40 8 : aclError GetMemTypeFromPolicy(aclrtMemMallocPolicy policy, rtMemType_t *type) { 41 8 : uint32_t flags = RT_MEMORY_DEFAULT; 42 8 : if (((uint32_t)policy & POLICY_MASK_HIGH_BIT) == ACL_MEM_TYPE_LOW_BAND_WIDTH) { 43 1 : flags = RT_MEMORY_DDR; 44 7 : } else if (((uint32_t)policy & POLICY_MASK_HIGH_BIT) == ACL_MEM_TYPE_HIGH_BAND_WIDTH) { 45 2 : flags = RT_MEMORY_HBM; 46 : } else { 47 5 : ACL_LOG_WARN("invalid policy high bit!"); 48 : } 49 : 50 8 : size_t pageMapLen = sizeof(g_pageMap) / sizeof(g_pageMap[0]); 51 8 : size_t pagePairLen = sizeof(g_pageMap[0]); 52 8 : struct PageType pagePair = {(uint32_t)policy & POLICY_MASK_LOW_BIT, 0}; 53 8 : struct PageType *searchRet = (struct PageType*)bsearch(&pagePair, g_pageMap, pageMapLen, pagePairLen, Compare); 54 8 : if (searchRet == NULL) { 55 1 : ACL_LOG_ERROR("invalid policy low bit!"); 56 1 : return ACL_ERROR_INVALID_PARAM; 57 : } 58 7 : flags |= (*searchRet).rtPageTypeBit; 59 7 : *type = flags; 60 7 : return ACL_SUCCESS; 61 : } 62 : #ifdef __cplusplus 63 : } 64 : #endif