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 19 : static int Compare(const void* a, const void* b)
35 : {
36 19 : return (int)((*(const struct PageType*)a).aclPageType - (*(const struct PageType*)b).aclPageType);
37 : }
38 :
39 8 : aclError GetMemTypeFromPolicy(aclrtMemMallocPolicy policy, rtMemType_t* type)
40 : {
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
|