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.9 kB

5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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. if (pathName == NULL) {
  185. return EN_INVALID_PARAM;
  186. }
  187. INT32 ret = access(pathName, mode);
  188. if (ret != EN_OK) {
  189. return EN_ERROR;
  190. }
  191. return 0;
  192. }
  193. INT32 mmGetTimeOfDay(mmTimeval *timeVal, mmTimezone *timeZone)
  194. {
  195. return 0;
  196. }
  197. INT32 mmRealPath(const CHAR *path, CHAR *realPath, INT32 realPathLen)
  198. {
  199. INT32 ret = EN_OK;
  200. if (path == nullptr || realPath == nullptr || realPathLen < MMPA_MAX_PATH) {
  201. return EN_INVALID_PARAM;
  202. }
  203. char *ptr = realpath(path, realPath);
  204. if (ptr == nullptr) {
  205. ret = EN_ERROR;
  206. }
  207. return ret;
  208. }
  209. INT32 mmRWLockInit(mmRWLock_t *rwLock)
  210. {
  211. if (rwLock == NULL) {
  212. return EN_INVALID_PARAM;
  213. }
  214. INT32 ret = pthread_rwlock_init(rwLock, NULL);
  215. if (ret != MMPA_ZERO) {
  216. return EN_ERROR;
  217. }
  218. return EN_OK;
  219. }
  220. INT32 mmRWLockRDLock(mmRWLock_t *rwLock)
  221. {
  222. if (rwLock == NULL) {
  223. return EN_INVALID_PARAM;
  224. }
  225. INT32 ret = pthread_rwlock_rdlock(rwLock);
  226. if (ret != MMPA_ZERO) {
  227. return EN_ERROR;
  228. }
  229. return EN_OK;
  230. }
  231. INT32 mmRWLockWRLock(mmRWLock_t *rwLock)
  232. {
  233. if (rwLock == NULL) {
  234. return EN_INVALID_PARAM;
  235. }
  236. INT32 ret = pthread_rwlock_wrlock(rwLock);
  237. if (ret != MMPA_ZERO) {
  238. return EN_ERROR;
  239. }
  240. return EN_OK;
  241. }
  242. INT32 mmRDLockUnLock(mmRWLock_t *rwLock)
  243. {
  244. if (rwLock == NULL) {
  245. return EN_INVALID_PARAM;
  246. }
  247. INT32 ret = pthread_rwlock_unlock(rwLock);
  248. if (ret != MMPA_ZERO) {
  249. return EN_ERROR;
  250. }
  251. return EN_OK;
  252. }
  253. INT32 mmWRLockUnLock(mmRWLock_t *rwLock)
  254. {
  255. if (rwLock == NULL) {
  256. return EN_INVALID_PARAM;
  257. }
  258. INT32 ret = pthread_rwlock_unlock(rwLock);
  259. if (ret != MMPA_ZERO) {
  260. return EN_ERROR;
  261. }
  262. return EN_OK;
  263. }
  264. INT32 mmRWLockDestroy(mmRWLock_t *rwLock)
  265. {
  266. if (rwLock == NULL) {
  267. return EN_INVALID_PARAM;
  268. }
  269. INT32 ret = pthread_rwlock_destroy(rwLock);
  270. if (ret != MMPA_ZERO) {
  271. return EN_ERROR;
  272. }
  273. return EN_OK;
  274. }
  275. INT32 mmGetErrorCode()
  276. {
  277. return 0;
  278. }
  279. INT32 mmIsDir(const CHAR *fileName)
  280. {
  281. return 0;
  282. }
  283. INT32 mmGetEnv(const CHAR *name, CHAR *value, UINT32 len)
  284. {
  285. const char *env = getenv(name);
  286. if (env != nullptr) {
  287. strcpy(value, env);
  288. }
  289. return 0;
  290. }
  291. INT32 mmDlclose(VOID *handle)
  292. {
  293. return 0;
  294. }
  295. CHAR *mmDlerror()
  296. {
  297. return dlerror();
  298. }
  299. INT32 mmDladdr(VOID *addr, mmDlInfo *info)
  300. {
  301. return -1;
  302. }
  303. VOID *mmDlopen(const CHAR *fileName, INT32 mode)
  304. {
  305. return NULL;
  306. }
  307. VOID *mmDlsym(VOID *handle, const CHAR *funcName)
  308. {
  309. return NULL;
  310. }
  311. INT32 mmGetPid()
  312. {
  313. return (INT32)getpid();
  314. }

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