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.

mmpa_stub.cc 7.7 kB

5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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. #include "mmpa/mmpa_api.h"
  17. #include "common/types.h"
  18. #include "common/util.h"
  19. using namespace domi;
  20. INT32 mmOpen(const CHAR *path_name, INT32 flags) {
  21. INT32 fd = HANDLE_INVALID_VALUE;
  22. if (NULL == path_name) {
  23. syslog(LOG_ERR, "The path name pointer is null.\r\n");
  24. return EN_INVALID_PARAM;
  25. }
  26. if (0 == (flags & (O_RDONLY | O_WRONLY | O_RDWR | O_CREAT))) {
  27. syslog(LOG_ERR, "The file open mode is error.\r\n");
  28. return EN_INVALID_PARAM;
  29. }
  30. fd = open(path_name, flags);
  31. if (fd < MMPA_ZERO) {
  32. syslog(LOG_ERR, "Open file failed, errno is %s.\r\n", strerror(errno));
  33. return EN_ERROR;
  34. }
  35. return fd;
  36. }
  37. INT32 mmOpen2(const CHAR *path_name, INT32 flags, MODE mode) {
  38. INT32 fd = HANDLE_INVALID_VALUE;
  39. if (NULL == path_name) {
  40. syslog(LOG_ERR, "The path name pointer is null.\r\n");
  41. return EN_INVALID_PARAM;
  42. }
  43. if (MMPA_ZERO == (flags & (O_RDONLY | O_WRONLY | O_RDWR | O_CREAT))) {
  44. syslog(LOG_ERR, "The file open mode is error.\r\n");
  45. return EN_INVALID_PARAM;
  46. }
  47. if ((MMPA_ZERO == (mode & (S_IRUSR | S_IREAD))) && (MMPA_ZERO == (mode & (S_IWUSR | S_IWRITE)))) {
  48. syslog(LOG_ERR, "The permission mode of the file is error.\r\n");
  49. return EN_INVALID_PARAM;
  50. }
  51. fd = open(path_name, flags, mode);
  52. if (fd < MMPA_ZERO) {
  53. syslog(LOG_ERR, "Open file failed, errno is %s.\r\n", strerror(errno));
  54. return EN_ERROR;
  55. }
  56. return fd;
  57. }
  58. INT32 mmClose(INT32 fd) {
  59. INT32 result = EN_OK;
  60. if (fd < MMPA_ZERO) {
  61. syslog(LOG_ERR, "The file fd is invalid.\r\n");
  62. return EN_INVALID_PARAM;
  63. }
  64. result = close(fd);
  65. if (EN_OK != result) {
  66. syslog(LOG_ERR, "Close the file failed, errno is %s.\r\n", strerror(errno));
  67. return EN_ERROR;
  68. }
  69. return EN_OK;
  70. }
  71. mmSsize_t mmWrite(INT32 fd, VOID *mm_buf, UINT32 mm_count) {
  72. mmSsize_t result = MMPA_ZERO;
  73. if ((fd < MMPA_ZERO) || (NULL == mm_buf)) {
  74. syslog(LOG_ERR, "Input parameter invalid.\r\n");
  75. return EN_INVALID_PARAM;
  76. }
  77. result = write(fd, mm_buf, (size_t)mm_count);
  78. if (result < MMPA_ZERO) {
  79. syslog(LOG_ERR, "Write buf to file failed, errno is %s.\r\n", strerror(errno));
  80. return EN_ERROR;
  81. }
  82. return result;
  83. }
  84. mmSsize_t mmRead(INT32 fd, VOID *mm_buf, UINT32 mm_count) {
  85. mmSsize_t result = MMPA_ZERO;
  86. if ((fd < MMPA_ZERO) || (NULL == mm_buf)) {
  87. syslog(LOG_ERR, "Input parameter invalid.\r\n");
  88. return EN_INVALID_PARAM;
  89. }
  90. result = read(fd, mm_buf, (size_t)mm_count);
  91. if (result < MMPA_ZERO) {
  92. syslog(LOG_ERR, "Read file to buf failed, errno is %s.\r\n", strerror(errno));
  93. return EN_ERROR;
  94. }
  95. return result;
  96. }
  97. INT32 mmMkdir(const CHAR *lp_path_name, mmMode_t mode) {
  98. INT32 t_mode = mode;
  99. INT32 ret = EN_OK;
  100. if (NULL == lp_path_name) {
  101. syslog(LOG_ERR, "The input path is null.\r\n");
  102. return EN_INVALID_PARAM;
  103. }
  104. if (t_mode < MMPA_ZERO) {
  105. syslog(LOG_ERR, "The input mode is wrong.\r\n");
  106. return EN_INVALID_PARAM;
  107. }
  108. ret = mkdir(lp_path_name, mode);
  109. if (EN_OK != ret) {
  110. syslog(LOG_ERR, "Failed to create the directory, the ret is %s.\r\n", strerror(errno));
  111. return EN_ERROR;
  112. }
  113. return EN_OK;
  114. }
  115. void *memCpyS(void *dest, const void *src, UINT32 count) {
  116. char *tmp = (char *)dest;
  117. char *s = (char *)src;
  118. if (MMPA_ZERO == count) {
  119. return dest;
  120. }
  121. while (count--) {
  122. *tmp++ = *s++;
  123. }
  124. return dest;
  125. }
  126. INT32 mmRmdir(const CHAR *lp_path_name) { return rmdir(lp_path_name); }
  127. mmTimespec mmGetTickCount() {
  128. mmTimespec rts;
  129. struct timespec ts = {0};
  130. (void)clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
  131. rts.tv_sec = ts.tv_sec;
  132. rts.tv_nsec = ts.tv_nsec;
  133. return rts;
  134. }
  135. INT32 mmGetTid() {
  136. INT32 ret = (INT32)syscall(SYS_gettid);
  137. if (ret < MMPA_ZERO) {
  138. return EN_ERROR;
  139. }
  140. return ret;
  141. }
  142. INT32 mmAccess(const CHAR *path_name) {
  143. if (path_name == NULL) {
  144. return EN_INVALID_PARAM;
  145. }
  146. INT32 ret = access(path_name, F_OK);
  147. if (ret != EN_OK) {
  148. return EN_ERROR;
  149. }
  150. return EN_OK;
  151. }
  152. INT32 mmStatGet(const CHAR *path, mmStat_t *buffer) {
  153. if ((path == NULL) || (buffer == NULL)) {
  154. return EN_INVALID_PARAM;
  155. }
  156. INT32 ret = stat(path, buffer);
  157. if (ret != EN_OK) {
  158. return EN_ERROR;
  159. }
  160. return EN_OK;
  161. }
  162. INT32 mmGetFileSize(const CHAR *file_name, ULONGLONG *length) {
  163. if ((file_name == NULL) || (length == NULL)) {
  164. return EN_INVALID_PARAM;
  165. }
  166. struct stat file_stat;
  167. (void)memset_s(&file_stat, sizeof(file_stat), 0, sizeof(file_stat)); // unsafe_function_ignore: memset
  168. INT32 ret = lstat(file_name, &file_stat);
  169. if (ret < MMPA_ZERO) {
  170. return EN_ERROR;
  171. }
  172. *length = (ULONGLONG)file_stat.st_size;
  173. return EN_OK;
  174. }
  175. INT32 mmScandir(const CHAR *path, mmDirent ***entryList, mmFilter filterFunc, mmSort sort)
  176. {
  177. return 0;
  178. }
  179. VOID mmScandirFree(mmDirent **entryList, INT32 count)
  180. {
  181. }
  182. INT32 mmAccess2(const CHAR *pathName, INT32 mode)
  183. {
  184. return 0;
  185. }
  186. INT32 mmGetTimeOfDay(mmTimeval *timeVal, mmTimezone *timeZone)
  187. {
  188. return 0;
  189. }
  190. INT32 mmRealPath(const CHAR *path, CHAR *realPath, INT32 realPathLen)
  191. {
  192. INT32 ret = EN_OK;
  193. if (path == nullptr || realPath == nullptr || realPathLen < MMPA_MAX_PATH) {
  194. return EN_INVALID_PARAM;
  195. }
  196. char *ptr = realpath(path, realPath);
  197. if (ptr == nullptr) {
  198. ret = EN_ERROR;
  199. }
  200. return ret;
  201. }
  202. INT32 mmRWLockInit(mmRWLock_t *rwLock)
  203. {
  204. if (rwLock == NULL) {
  205. return EN_INVALID_PARAM;
  206. }
  207. INT32 ret = pthread_rwlock_init(rwLock, NULL);
  208. if (ret != MMPA_ZERO) {
  209. return EN_ERROR;
  210. }
  211. return EN_OK;
  212. }
  213. INT32 mmRWLockRDLock(mmRWLock_t *rwLock)
  214. {
  215. if (rwLock == NULL) {
  216. return EN_INVALID_PARAM;
  217. }
  218. INT32 ret = pthread_rwlock_rdlock(rwLock);
  219. if (ret != MMPA_ZERO) {
  220. return EN_ERROR;
  221. }
  222. return EN_OK;
  223. }
  224. INT32 mmRWLockWRLock(mmRWLock_t *rwLock)
  225. {
  226. if (rwLock == NULL) {
  227. return EN_INVALID_PARAM;
  228. }
  229. INT32 ret = pthread_rwlock_wrlock(rwLock);
  230. if (ret != MMPA_ZERO) {
  231. return EN_ERROR;
  232. }
  233. return EN_OK;
  234. }
  235. INT32 mmRDLockUnLock(mmRWLock_t *rwLock)
  236. {
  237. if (rwLock == NULL) {
  238. return EN_INVALID_PARAM;
  239. }
  240. INT32 ret = pthread_rwlock_unlock(rwLock);
  241. if (ret != MMPA_ZERO) {
  242. return EN_ERROR;
  243. }
  244. return EN_OK;
  245. }
  246. INT32 mmWRLockUnLock(mmRWLock_t *rwLock)
  247. {
  248. if (rwLock == NULL) {
  249. return EN_INVALID_PARAM;
  250. }
  251. INT32 ret = pthread_rwlock_unlock(rwLock);
  252. if (ret != MMPA_ZERO) {
  253. return EN_ERROR;
  254. }
  255. return EN_OK;
  256. }
  257. INT32 mmRWLockDestroy(mmRWLock_t *rwLock)
  258. {
  259. if (rwLock == NULL) {
  260. return EN_INVALID_PARAM;
  261. }
  262. INT32 ret = pthread_rwlock_destroy(rwLock);
  263. if (ret != MMPA_ZERO) {
  264. return EN_ERROR;
  265. }
  266. return EN_OK;
  267. }
  268. INT32 mmGetErrorCode()
  269. {
  270. return 0;
  271. }
  272. INT32 mmIsDir(const CHAR *fileName)
  273. {
  274. return 0;
  275. }
  276. INT32 mmGetEnv(const CHAR *name, CHAR *value, UINT32 len)
  277. {
  278. return 0;
  279. }
  280. INT32 mmDlclose(VOID *handle)
  281. {
  282. return 0;
  283. }
  284. CHAR *mmDlerror()
  285. {
  286. return dlerror();
  287. }
  288. INT32 mmDladdr(VOID *addr, mmDlInfo *info)
  289. {
  290. return -1;
  291. }
  292. VOID *mmDlopen(const CHAR *fileName, INT32 mode)
  293. {
  294. return NULL;
  295. }
  296. VOID *mmDlsym(VOID *handle, const CHAR *funcName)
  297. {
  298. return NULL;
  299. }
  300. INT32 mmGetPid()
  301. {
  302. return (INT32)getpid();
  303. }

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