You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mem.h 16 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /**
  2. * Copyright 2019-2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #ifndef __CCE_RUNTIME_MEM_H__
  17. #define __CCE_RUNTIME_MEM_H__
  18. /*lint -e7*/
  19. #include <stddef.h>
  20. /*lint +e7*/
  21. #include "base.h"
  22. #include "config.h"
  23. #include "stream.h"
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. /**
  28. * @ingroup dvrt_mem
  29. * @brief memory type
  30. */
  31. #define RT_MEMORY_DEFAULT ((uint32_t)0x0) // default memory on device
  32. #define RT_MEMORY_HBM ((uint32_t)0x2) // HBM memory on device
  33. #define RT_MEMORY_DDR ((uint32_t)0x4) // DDR memory on device
  34. #define RT_MEMORY_SPM ((uint32_t)0x8) // shared physical memory on device
  35. #define RT_MEMORY_P2P_HBM ((uint32_t)0x10) // HBM memory on other 4P device
  36. #define RT_MEMORY_P2P_DDR ((uint32_t)0x11) // DDR memory on other device
  37. #define RT_MEMORY_DDR_NC ((uint32_t)0x20) // DDR memory of non-cache
  38. #define RT_MEMORY_TS_4G ((uint32_t)0x40)
  39. #define RT_MEMORY_TS ((uint32_t)0x80)
  40. #define RT_MEMORY_RESERVED ((uint32_t)0x100)
  41. #define RT_MEMORY_L1 ((uint32_t)0x1<<16)
  42. #define RT_MEMORY_L2 ((uint32_t)0x1<<17)
  43. /**
  44. * @ingroup dvrt_mem
  45. * @brief memory info type
  46. */
  47. #define RT_MEM_INFO_TYPE_DDR_SIZE ((uint32_t)0x1)
  48. #define RT_MEM_INFO_TYPE_HBM_SIZE ((uint32_t)0x2)
  49. #define RT_MEM_INFO_TYPE_DDR_P2P_SIZE ((uint32_t)0x3)
  50. #define RT_MEM_INFO_TYPE_HBM_P2P_SIZE ((uint32_t)0x4)
  51. /**
  52. * @ingroup dvrt_mem
  53. * @brief memory Policy
  54. */
  55. #define RT_MEMORY_POLICY_NONE ((uint32_t)0x0) // Malloc mem prior hage page, then default page
  56. #define RT_MEMORY_POLICY_HUGE_PAGE_FIRST ((uint32_t)0x1 << 10) // Malloc mem prior hage page, then default page
  57. #define RT_MEMORY_POLICY_HUGE_PAGE_ONLY ((uint32_t)0x1 << 11) // Malloc mem only use hage page
  58. #define RT_MEMORY_POLICY_DEFAULT_PAGE_ONLY ((uint32_t)0x1 << 12) // Malloc mem only use default page
  59. #define RT_MEMORY_POLICY_HUGE_PAGE_FIRST_P2P ((uint32_t)0x1 << 13) // Malloc mem prior hage page, then default page, use for p2p
  60. #define RT_MEMORY_POLICY_HUGE_PAGE_ONLY_P2P ((uint32_t)0x1 << 14) // Malloc mem only use hage page, use for p2p
  61. #define RT_MEMORY_POLICY_DEFAULT_PAGE_ONLY_P2P ((uint32_t)0x1 << 15) // Malloc mem only use default page, use for p2p
  62. #define MEM_ALLOC_TYPE_BIT ((uint32_t)0x3FF) // mem type bit in <0, 9>
  63. /**
  64. * @ingroup dvrt_mem
  65. * @brief memory type | memory Policy
  66. */
  67. typedef uint32_t rtMemType_t;
  68. /**
  69. * @ingroup dvrt_mem
  70. * @brief memory advise type
  71. */
  72. #define RT_MEMORY_ADVISE_EXE (0x02)
  73. #define RT_MEMORY_ADVISE_THP (0x04)
  74. #define RT_MEMORY_ADVISE_PLE (0x08)
  75. #define RT_MEMORY_ADVISE_PIN (0x16)
  76. /**
  77. * @ingroup dvrt_mem
  78. * @brief memory copy type
  79. */
  80. typedef enum tagRtMemcpyKind {
  81. RT_MEMCPY_HOST_TO_HOST = 0, // host to host
  82. RT_MEMCPY_HOST_TO_DEVICE, // host to device
  83. RT_MEMCPY_DEVICE_TO_HOST, // device to host
  84. RT_MEMCPY_DEVICE_TO_DEVICE, // device to device, 1P && P2P
  85. RT_MEMCPY_MANAGED, // managed memory
  86. RT_MEMCPY_ADDR_DEVICE_TO_DEVICE,
  87. RT_MEMCPY_HOST_TO_DEVICE_EX, // host to device ex (only used for 8 bytes)
  88. RT_MEMCPY_DEVICE_TO_HOST_EX, // device to host ex
  89. RT_MEMCPY_RESERVED,
  90. } rtMemcpyKind_t;
  91. typedef enum tagRtMemInfoType {
  92. RT_MEMORYINFO_DDR,
  93. RT_MEMORYINFO_HBM,
  94. RT_MEMORYINFO_DDR_HUGE, // Hugepage memory of DDR
  95. RT_MEMORYINFO_DDR_NORMAL, // Normal memory of DDR
  96. RT_MEMORYINFO_HBM_HUGE, // Hugepage memory of HBM
  97. RT_MEMORYINFO_HBM_NORMAL, // Normal memory of HBM
  98. RT_MEMORYINFO_DDR_P2P_HUGE, // Hugepage memory of DDR
  99. RT_MEMORYINFO_DDR_P2P_NORMAL, // Normal memory of DDR
  100. RT_MEMORYINFO_HBM_P2P_HUGE, // Hugepage memory of HBM
  101. RT_MEMORYINFO_HBM_P2P_NORMAL, // Normal memory of HBM
  102. } rtMemInfoType_t;
  103. typedef enum tagRtRecudeKind {
  104. RT_MEMCPY_SDMA_AUTOMATIC_ADD = 10, // D2D, SDMA inline reduce, include 1P, and P2P
  105. RT_RECUDE_KIND_END
  106. } rtRecudeKind_t;
  107. typedef enum tagRtDataType {
  108. RT_DATA_TYPE_FP32 = 0, // fp32
  109. RT_DATA_TYPE_FP16 = 1, // fp16
  110. RT_DATA_TYPE_INT16 = 2, // int16
  111. RT_DATA_TYPE_END
  112. } rtDataType_t;
  113. /**
  114. * @ingroup dvrt_mem
  115. * @brief memory copy channel type
  116. */
  117. typedef enum tagRtMemcpyChannelType {
  118. RT_MEMCPY_CHANNEL_TYPE_INNER = 0, // 1P
  119. RT_MEMCPY_CHANNEL_TYPE_PCIe,
  120. RT_MEMCPY_CHANNEL_TYPE_HCCs, // not support now
  121. RT_MEMCPY_CHANNEL_TYPE_RESERVED,
  122. } rtMemcpyChannelType_t;
  123. /**
  124. * @ingroup rt_kernel
  125. * @brief ai core memory size
  126. */
  127. typedef struct rtAiCoreMemorySize {
  128. uint32_t l0ASize;
  129. uint32_t l0BSize;
  130. uint32_t l0CSize;
  131. uint32_t l1Size;
  132. uint32_t ubSize;
  133. uint32_t l2Size;
  134. uint32_t l2PageNum;
  135. uint32_t blockSize;
  136. uint64_t bankSize;
  137. uint64_t bankNum;
  138. uint64_t burstInOneBlock;
  139. uint64_t bankGroupNum;
  140. } rtAiCoreMemorySize_t;
  141. /**
  142. * @ingroup dvrt_mem
  143. * @brief memory type
  144. */
  145. typedef enum tagRtMemoryType {
  146. RT_MEMORY_TYPE_HOST = 1,
  147. RT_MEMORY_TYPE_DEVICE = 2 ,
  148. RT_MEMORY_TYPE_SVM = 3,
  149. RT_MEMORY_TYPE_DVPP = 4
  150. } rtMemoryType_t;
  151. /**
  152. * @ingroup dvrt_mem
  153. * @brief memory attribute
  154. */
  155. typedef struct tagRtPointerAttributes {
  156. rtMemoryType_t memoryType; // host memory or device memory
  157. rtMemoryType_t locationType;
  158. uint32_t deviceID; // device ID
  159. uint32_t pageSize;
  160. } rtPointerAttributes_t;
  161. /**
  162. * @ingroup dvrt_mem
  163. * @brief alloc device memory
  164. * @param [in|out] devPtr memory pointer
  165. * @param [in] size memory size
  166. * @param [in] type memory type
  167. * @return RT_ERROR_NONE for ok
  168. * @return RT_ERROR_INVALID_VALUE for error input
  169. */
  170. RTS_API rtError_t rtMalloc(void **devPtr, uint64_t size, rtMemType_t type);
  171. /**
  172. * @ingroup dvrt_mem
  173. * @brief free device memory
  174. * @param [in|out] devPtr memory pointer
  175. * @return RT_ERROR_NONE for ok
  176. * @return RT_ERROR_INVALID_VALUE for error input
  177. */
  178. RTS_API rtError_t rtFree(void *devPtr);
  179. /**
  180. * @ingroup dvrt_mem
  181. * @brief alloc device memory for dvpp
  182. * @param [in|out] devPtr memory pointer
  183. * @param [in] size memory size
  184. * @return RT_ERROR_NONE for ok
  185. * @return RT_ERROR_INVALID_VALUE for error input
  186. */
  187. RTS_API rtError_t rtDvppMalloc(void **devPtr, uint64_t size);
  188. /**
  189. * @ingroup dvrt_mem
  190. * @brief free device memory for dvpp
  191. * @param [in|out] devPtr memory pointer
  192. * @return RT_ERROR_NONE for ok
  193. * @return RT_ERROR_INVALID_VALUE for error input
  194. */
  195. RTS_API rtError_t rtDvppFree(void *devPtr);
  196. /**
  197. * @ingroup dvrt_mem
  198. * @brief alloc host memory
  199. * @param [in|out] hostPtr memory pointer
  200. * @param [in] size memory size
  201. * @return RT_ERROR_NONE for ok
  202. * @return RT_ERROR_INVALID_VALUE for error input
  203. */
  204. RTS_API rtError_t rtMallocHost(void **hostPtr, uint64_t size);
  205. /**
  206. * @ingroup dvrt_mem
  207. * @brief free host memory
  208. * @param [in] hostPtr memory pointer
  209. * @return RT_ERROR_NONE for ok
  210. * @return RT_ERROR_INVALID_VALUE for error input
  211. */
  212. RTS_API rtError_t rtFreeHost(void *hostPtr);
  213. /**
  214. * @ingroup dvrt_mem
  215. * @brief alloc managed memory
  216. * @param [in|out] ptr memory pointer
  217. * @param [in] size memory size
  218. * @param [in] flag reserved, set to 0.
  219. * @return RT_ERROR_NONE for ok
  220. * @return RT_ERROR_INVALID_VALUE for error input
  221. */
  222. RTS_API rtError_t rtMemAllocManaged(void **ptr, uint64_t size, uint32_t flag);
  223. /**
  224. * @ingroup dvrt_mem
  225. * @brief free managed memory
  226. * @param [in] ptr memory pointer
  227. * @return RT_ERROR_NONE for ok
  228. * @return RT_ERROR_INVALID_VALUE for error input
  229. */
  230. RTS_API rtError_t rtMemFreeManaged(void *ptr);
  231. /**
  232. * @ingroup dvrt_mem
  233. * @brief alloc cached device memory
  234. * @param [in| devPtr memory pointer
  235. * @param [in] size memory size
  236. * @param [in] type memory type
  237. * @return RT_ERROR_NONE for ok
  238. */
  239. RTS_API rtError_t rtMallocCached(void **devPtr, uint64_t size, rtMemType_t type);
  240. /**
  241. * @ingroup dvrt_mem
  242. * @brief flush device mempory
  243. * @param [in] base virtal base address
  244. * @param [in] len memory size
  245. * @return RT_ERROR_NONE for ok, errno for failed
  246. */
  247. RTS_API rtError_t rtFlushCache(void *base, size_t len);
  248. /**
  249. * @ingroup dvrt_mem
  250. * @brief invalid device mempory
  251. * @param [in] base virtal base address
  252. * @param [in] len memory size
  253. * @return RT_ERROR_NONE for ok, errno for failed
  254. */
  255. RTS_API rtError_t rtInvalidCache(void *base, size_t len);
  256. /**
  257. * @ingroup dvrt_mem
  258. * @brief synchronized memcpy
  259. * @param [in] dst destination address pointer
  260. * @param [in] Max length of destination address memory
  261. * @param [in] src source address pointer
  262. * @param [in] count the number of byte to copy
  263. * @param [in] kind memcpy type
  264. * @return RT_ERROR_NONE for ok
  265. * @return RT_ERROR_INVALID_VALUE for error input
  266. */
  267. RTS_API rtError_t rtMemcpy(void *dst, uint64_t destMax, const void *src, uint64_t count, rtMemcpyKind_t kind);
  268. /**
  269. * @ingroup dvrt_mem
  270. * @brief asynchronized memcpy
  271. * @param [in] dst destination address pointer
  272. * @param [in] Max length of destination address memory
  273. * @param [in] src source address pointer
  274. * @param [in] count the number of byte to copy
  275. * @param [in] kind memcpy type
  276. * @param [in] stream asynchronized task stream
  277. * @return RT_ERROR_NONE for ok
  278. * @return RT_ERROR_INVALID_VALUE for error input
  279. */
  280. RTS_API rtError_t rtMemcpyAsync(void *dst, uint64_t destMax, const void *src, uint64_t count, rtMemcpyKind_t kind,
  281. rtStream_t stream);
  282. /**
  283. * @ingroup dvrt_mem
  284. * @brief asynchronized reduce memcpy
  285. * @param [in] dst destination address pointer
  286. * @param [in] Max length of destination address memory
  287. * @param [in] src source address pointer
  288. * @param [in] count the number of byte to copy
  289. * @param [in] kind memcpy type
  290. * @param [in] type data type
  291. * @param [in] stream asynchronized task stream
  292. * @return RT_ERROR_NONE for ok
  293. * @return RT_ERROR_INVALID_VALUE for error input
  294. */
  295. RTS_API rtError_t rtReduceAsync(void *dst, uint64_t destMax, const void *src, uint64_t count, rtRecudeKind_t kind,
  296. rtDataType_t type, rtStream_t stream);
  297. /**
  298. * @ingroup dvrt_mem
  299. * @brief query memory size
  300. * @param [in] aiCoreMemorySize
  301. * @return RT_ERROR_NONE for ok, errno for failed
  302. * @return RT_ERROR_INVALID_VALUE for error input
  303. */
  304. RTS_API rtError_t rtAiCoreMemorySizes(rtAiCoreMemorySize_t *aiCoreMemorySize);
  305. /**
  306. * @ingroup dvrt_mem
  307. * @brief set memory size, Setting before model reasoning, Bright screen to prevent model can not be fully
  308. integrated network due to memory limitations.Requirement come from JiaMinHu.Only use for Tiny.
  309. * @param [in] aiCoreMemorySize
  310. * @return RT_ERROR_NONE for ok, errno for failed
  311. * @return RT_ERROR_INVALID_VALUE for error input
  312. */
  313. RTS_API rtError_t rtSetAiCoreMemorySizes(rtAiCoreMemorySize_t *aiCoreMemorySize);
  314. /**
  315. * @ingroup dvrt_mem
  316. * @brief set memory with uint32_t value
  317. * @param [in] devPtr
  318. * @param [in] Max length of destination address memory
  319. * @param [in] value
  320. * @param [in] count byte num
  321. * @return RT_ERROR_NONE for ok, errno for failed
  322. * @return RT_ERROR_INVALID_VALUE for error input
  323. */
  324. RTS_API rtError_t rtMemset(void *devPtr, uint64_t destMax, uint32_t value, uint64_t count);
  325. /**
  326. * @ingroup dvrt_mem
  327. * @brief set memory with uint32_t value async
  328. * @param [in] devPtr
  329. * @param [in] Max length of destination address memory
  330. * @param [in] value
  331. * @param [in] count byte num
  332. * @param [in] stream
  333. * @return RT_ERROR_NONE for ok, errno for failed
  334. * @return RT_ERROR_INVALID_VALUE for error input
  335. */
  336. RTS_API rtError_t rtMemsetAsync(void *ptr, uint64_t destMax, uint32_t value, uint64_t count, rtStream_t stream);
  337. /**
  338. * @ingroup dvrt_mem
  339. * @brief get current device memory total and free
  340. * @param [out] free
  341. * @param [out] total
  342. * @return RT_ERROR_NONE for ok, errno for failed
  343. * @return RT_ERROR_INVALID_VALUE for error input
  344. */
  345. RTS_API rtError_t rtMemGetInfo(size_t *free, size_t *total);
  346. /**
  347. * @ingroup dvrt_mem
  348. * @brief get current device memory total and free
  349. * @param [in] memInfoType
  350. * @param [out] free
  351. * @param [out] total
  352. * @return RT_ERROR_NONE for ok, errno for failed
  353. */
  354. RTS_API rtError_t rtMemGetInfoEx(rtMemInfoType_t memInfoType, size_t *free, size_t *total);
  355. /**
  356. * @ingroup dvrt_mem
  357. * @brief set memory with uint32_t value
  358. * @param [in] devPtr
  359. * @param [in] len
  360. * @param [in] device
  361. * @return RT_ERROR_NONE for ok, errno for failed
  362. * @return RT_ERROR_INVALID_VALUE for error input
  363. */
  364. RTS_API rtError_t rtMemPrefetchToDevice(void *devPtr, uint64_t len, int32_t device);
  365. /**
  366. * @ingroup dvrt_mem
  367. * @brief get memory attribute:Host or Device
  368. * @param [in] ptr
  369. * @param [out] attributes
  370. * @return RT_ERROR_NONE for ok, errno for failed
  371. * @return RT_ERROR_INVALID_VALUE for error input
  372. */
  373. RTS_API rtError_t rtPointerGetAttributes(rtPointerAttributes_t *attributes, const void *ptr);
  374. /**
  375. * @ingroup dvrt_mem
  376. * @brief make memory shared interprocess and assigned a name
  377. * @param [in] ptr device memory address pointer
  378. * @param [in] name identification name
  379. * @param [in] byteCount identification byteCount
  380. * @return RT_ERROR_NONE for ok
  381. * @return RT_ERROR_INVALID_VALUE for error input
  382. * @return RT_ERROR_DRV_ERR for driver error
  383. */
  384. RTS_API rtError_t rtIpcSetMemoryName(const void *ptr, uint64_t byteCount, char *name, uint32_t len);
  385. /**
  386. * @ingroup dvrt_mem
  387. * @brief destroy a interprocess shared memory
  388. * @param [in] name identification name
  389. * @return RT_ERROR_NONE for ok
  390. * @return RT_ERROR_INVALID_VALUE for error input
  391. * @return RT_ERROR_DRV_ERR for driver error
  392. */
  393. rtError_t rtIpcDestroyMemoryName(const char *name);
  394. /**
  395. * @ingroup dvrt_mem
  396. * @brief open a interprocess shared memory
  397. * @param [in|out] ptr device memory address pointer
  398. * @param [in] name identification name
  399. * @return RT_ERROR_NONE for ok
  400. * @return RT_ERROR_INVALID_VALUE for error input
  401. * @return RT_ERROR_DRV_ERR for driver error
  402. */
  403. RTS_API rtError_t rtIpcOpenMemory(void **ptr, const char *name);
  404. /**
  405. * @ingroup dvrt_mem
  406. * @brief close a interprocess shared memory
  407. * @param [in] ptr device memory address pointer
  408. * @param [in] name identification name
  409. * @return RT_ERROR_NONE for ok
  410. * @return RT_ERROR_INVALID_VALUE for error input
  411. * @return RT_ERROR_DRV_ERR for driver error
  412. */
  413. RTS_API rtError_t rtIpcCloseMemory(const void *ptr);
  414. /**
  415. * @ingroup dvrt_mem
  416. * @brief HCCL Async memory cpy
  417. * @param [in] index sq index
  418. * @param [in] wqe_index moudle index
  419. * @param [in] stream asynchronized task stream
  420. * @return RT_ERROR_NONE for ok
  421. * @return RT_ERROR_INVALID_VALUE for error input
  422. * @return RT_ERROR_DRV_ERR for driver error
  423. */
  424. RTS_API rtError_t rtRDMASend(uint32_t index, uint32_t wqe_index, rtStream_t stream);
  425. /**
  426. * @ingroup dvrt_mem
  427. * @brief Ipc set mem pid
  428. * @param [in] name name to be queried
  429. * @param [in] pid process id
  430. * @param [in] num length of pid[]
  431. * @return RT_ERROR_NONE for ok
  432. * @return RT_ERROR_INVALID_VALUE for error input
  433. * @return RT_ERROR_DRV_ERR for driver error
  434. */
  435. RTS_API rtError_t rtSetIpcMemPid(const char *name, int32_t pid[], int num);
  436. /**
  437. * @ingroup dvrt_mem
  438. * @brief HCCL Async memory cpy
  439. * @param [in] dbindex single device 0
  440. * @param [in] dbinfo doorbell info
  441. * @param [in] stream asynchronized task stream
  442. * @return RT_ERROR_NONE for ok
  443. * @return RT_ERROR_INVALID_VALUE for error input
  444. * @return RT_ERROR_DRV_ERR for driver error
  445. */
  446. RTS_API rtError_t rtRDMADBSend(uint32_t dbIndex, uint64_t dbInfo, rtStream_t stream);
  447. #ifdef __cplusplus
  448. }
  449. #endif
  450. #endif // __CCE_RUNTIME_MEM_H__

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示