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.

sparse_ops.h 17 kB

5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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 GE_OP_SPARSE_OPS_H_
  17. #define GE_OP_SPARSE_OPS_H_
  18. #include "graph/operator_reg.h"
  19. namespace ge {
  20. REG_OP(SparseSoftmax)
  21. .INPUT(indices, TensorType({DT_INT64}))
  22. .INPUT(values, TensorType({DT_FLOAT, DT_DOUBLE}))
  23. .INPUT(shape, TensorType({DT_INT64}))
  24. .OUTPUT(y, TensorType({DT_FLOAT, DT_DOUBLE}))
  25. .OP_END_FACTORY_REG(SparseSoftmax)
  26. REG_OP(SparseTensorDenseAdd)
  27. .INPUT(x1_indices, TensorType({DT_INT32, DT_INT64}))
  28. .INPUT(x1_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, \
  29. DT_UINT16, DT_INT32, DT_INT64, DT_FLOAT}))
  30. .INPUT(x1_shape, TensorType({DT_INT32, DT_INT64}))
  31. .INPUT(x2, TensorType({DT_INT64}))
  32. .OUTPUT(y, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  33. DT_INT32, DT_INT64, DT_FLOAT}))
  34. .OP_END_FACTORY_REG(SparseTensorDenseAdd)
  35. REG_OP(SparseReorder)
  36. .INPUT(indices, TensorType({DT_INT64}))
  37. .INPUT(values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  38. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  39. .INPUT(shape, TensorType({DT_INT64}))
  40. .OUTPUT(y_indices, TensorType({DT_INT64}))
  41. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  42. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  43. .OP_END_FACTORY_REG(SparseReorder)
  44. REG_OP(SparseReshape)
  45. .INPUT(indices, TensorType({DT_INT64}))
  46. .INPUT(shape, TensorType({DT_INT64}))
  47. .INPUT(new_shape, TensorType({DT_INT64}))
  48. .OUTPUT(y_indices, TensorType({DT_INT64}))
  49. .OUTPUT(y_shape, TensorType({DT_INT64}))
  50. .OP_END_FACTORY_REG(SparseReshape)
  51. REG_OP(SparseDenseCwiseAdd)
  52. .INPUT(x1_indices, TensorType({DT_INT64}))
  53. .INPUT(x1_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  54. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  55. .INPUT(x1_shape, TensorType({DT_INT64}))
  56. .INPUT(x2, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  57. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  58. .OUTPUT(y, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  59. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  60. .OP_END_FACTORY_REG(SparseDenseCwiseAdd)
  61. REG_OP(SparseDenseCwiseDiv)
  62. .INPUT(x1_indices, TensorType({DT_INT64}))
  63. .INPUT(x1_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  64. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  65. .INPUT(x1_shape, TensorType({DT_INT64}))
  66. .INPUT(x2, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  67. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  68. .OUTPUT(y, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  69. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  70. .OP_END_FACTORY_REG(SparseDenseCwiseDiv)
  71. REG_OP(SparseDenseCwiseMul)
  72. .INPUT(x1_indices, TensorType({DT_INT64}))
  73. .INPUT(x1_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  74. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  75. .INPUT(x1_shape, TensorType({DT_INT64}))
  76. .INPUT(x2, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  77. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  78. .OUTPUT(y, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, \
  79. DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  80. .OP_END_FACTORY_REG(SparseDenseCwiseMul)
  81. REG_OP(AddSparseToTensorsMap)
  82. .INPUT(indices, TensorType({DT_INT64}))
  83. .INPUT(values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  84. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  85. .INPUT(shape, TensorType({DT_INT64}))
  86. .OUTPUT(handle, TensorType({DT_INT64}))
  87. .ATTR(container, String, "")
  88. .ATTR(shared_name, String, "")
  89. .OP_END_FACTORY_REG(AddSparseToTensorsMap)
  90. REG_OP(SparseSliceGrad)
  91. .INPUT(backprop_val_grad, TensorType({ DT_INT8, DT_UINT8, DT_INT16,
  92. DT_UINT16, DT_INT32, DT_INT64, DT_FLOAT, DT_FLOAT16, DT_DOUBLE }))
  93. .INPUT(indices, TensorType({DT_INT64}))
  94. .INPUT(start, TensorType({DT_INT64}))
  95. .INPUT(new_indices, TensorType({DT_INT64}))
  96. .OUTPUT(y_grad, TensorType({ DT_INT8, DT_UINT8, DT_INT16,
  97. DT_UINT16, DT_INT32, DT_INT64, DT_FLOAT, DT_FLOAT16, DT_DOUBLE }))
  98. .OP_END_FACTORY_REG(SparseSliceGrad)
  99. REG_OP(SparseSlice)
  100. .INPUT(indices, TensorType({DT_INT64}))
  101. .INPUT(values, TensorType({ DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16,
  102. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE }))
  103. .INPUT(shape, TensorType({DT_INT64}))
  104. .INPUT(start, TensorType({DT_INT64}))
  105. .INPUT(size, TensorType({DT_INT64}))
  106. .OUTPUT(y_indices, TensorType({DT_INT64}))
  107. .OUTPUT(y_values, TensorType({ DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16,
  108. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE }))
  109. .OUTPUT(y_shape, TensorType({DT_INT64}))
  110. .OP_END_FACTORY_REG(SparseSlice)
  111. REG_OP(SparseAddGrad)
  112. .INPUT(backprop_val_grad, TensorType({DT_INT8, DT_INT16, DT_INT32,
  113. DT_INT64, DT_FLOAT, DT_DOUBLE}))
  114. .INPUT(x1_indices, TensorType({DT_INT64}))
  115. .INPUT(x2_indices, TensorType({DT_INT64}))
  116. .INPUT(sum_indices, TensorType({DT_INT64}))
  117. .OUTPUT(x1_val_grad, TensorType({DT_INT8, DT_INT16, DT_INT32,
  118. DT_INT64, DT_FLOAT, DT_DOUBLE}))
  119. .OUTPUT(x2_val_grad, TensorType({DT_INT8, DT_INT16, DT_INT32,
  120. DT_INT64, DT_FLOAT, DT_DOUBLE}))
  121. .OP_END_FACTORY_REG(SparseAddGrad)
  122. REG_OP(SparseFillEmptyRowsGrad)
  123. .INPUT(reverse_index_map, TensorType({DT_INT64}))
  124. .INPUT(grad_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  125. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  126. .OUTPUT(y_value, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  127. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  128. .OUTPUT(y_default_value, TensorType({DT_INT8, DT_UINT8, DT_INT16, \
  129. DT_UINT16, DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  130. .OP_END_FACTORY_REG(SparseFillEmptyRowsGrad)
  131. REG_OP(SparseTensorDenseMatMul)
  132. .INPUT(x1_indices, TensorType({DT_INT32, DT_INT64}))
  133. .INPUT(x1_values, TensorType({DT_FLOAT, DT_INT32, DT_DOUBLE}))
  134. .INPUT(x1_shape, TensorType({DT_INT64}))
  135. .INPUT(x2, TensorType({DT_FLOAT, DT_INT32, DT_DOUBLE}))
  136. .OUTPUT(y, TensorType({DT_FLOAT, DT_INT32, DT_DOUBLE}))
  137. .ATTR(adjoint_a, Bool, false)
  138. .ATTR(adjoint_b, Bool, false)
  139. .OP_END_FACTORY_REG(SparseTensorDenseMatMul)
  140. REG_OP(SparseToDense)
  141. .INPUT(indices, TensorType({DT_INT32, DT_INT64}))
  142. .INPUT(output_shape, TensorType({DT_INT32, DT_INT64}))
  143. .INPUT(values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  144. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_BOOL, DT_DOUBLE}))
  145. .INPUT(default_value, TensorType({DT_INT8, DT_UINT8, DT_INT16, \
  146. DT_UINT16, DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_BOOL, \
  147. DT_DOUBLE}))
  148. .OUTPUT(y, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  149. DT_INT32, DT_INT64, DT_FLOAT16, DT_FLOAT, DT_BOOL, DT_DOUBLE}))
  150. .ATTR(validate_indices, Bool, true)
  151. .OP_END_FACTORY_REG(SparseToDense)
  152. REG_OP(SparseConcat)
  153. .DYNAMIC_INPUT(indices, TensorType({DT_INT64}))
  154. .DYNAMIC_INPUT(values,
  155. TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, DT_UINT16, \
  156. DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  157. .DYNAMIC_INPUT(shapes, TensorType({DT_INT64}))
  158. .OUTPUT(y_indices, TensorType({DT_INT64}))
  159. .OUTPUT(y_values,
  160. TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  161. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  162. .OUTPUT(y_shape, TensorType({DT_INT64}))
  163. .ATTR(concat_dim, Int, 0)
  164. .ATTR(N, Int, 1)
  165. .OP_END_FACTORY_REG(SparseConcat)
  166. REG_OP(SparseAdd)
  167. .INPUT(x1_indices, TensorType({DT_INT64}))
  168. .INPUT(x1_values, TensorType({DT_FLOAT, DT_INT8, DT_INT16, \
  169. DT_INT32, DT_INT64, DT_DOUBLE}))
  170. .INPUT(x1_shape, TensorType({DT_INT64}))
  171. .INPUT(x2_indices, TensorType({DT_INT64}))
  172. .INPUT(x2_values, TensorType({DT_FLOAT, DT_INT8, DT_INT16, DT_INT32, \
  173. DT_INT64, DT_DOUBLE}))
  174. .INPUT(x2_shape, TensorType({DT_INT64}))
  175. .INPUT(thresh, TensorType({DT_FLOAT, DT_INT8, DT_INT16, DT_INT32, \
  176. DT_INT64, DT_DOUBLE}))
  177. .OUTPUT(sum_indices, TensorType({DT_INT64}))
  178. .OUTPUT(sum_values, TensorType({DT_FLOAT, DT_INT8, DT_INT16, \
  179. DT_INT32, DT_INT64, DT_DOUBLE}))
  180. .OUTPUT(sum_shape, TensorType({DT_INT64}))
  181. .OP_END_FACTORY_REG(SparseAdd)
  182. REG_OP(SparseFillEmptyRows)
  183. .INPUT(indices, TensorType({DT_INT64}))
  184. .INPUT(values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  185. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  186. .INPUT(dense_shape, TensorType({DT_INT64}))
  187. .INPUT(default_value, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, \
  188. DT_INT16, DT_UINT16, DT_UINT8, \
  189. DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  190. .OUTPUT(y_indices, TensorType({DT_INT64}))
  191. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, \
  192. DT_INT16, DT_UINT16, DT_UINT8, \
  193. DT_INT32, DT_INT64, DT_BOOL, DT_DOUBLE}))
  194. .OUTPUT(empty_row_indicator, TensorType({DT_BOOL}))
  195. .OUTPUT(reverse_index_map, TensorType({DT_INT64}))
  196. .OP_END_FACTORY_REG(SparseFillEmptyRows)
  197. REG_OP(SparseSparseMaximum)
  198. .INPUT(x1_indices, TensorType({DT_INT64}))
  199. .INPUT(x1_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  200. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  201. .INPUT(x1_shape, TensorType({DT_INT64}))
  202. .INPUT(x2_indices, TensorType({DT_INT64}))
  203. .INPUT(x2_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  204. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  205. .INPUT(x2_shape, TensorType({DT_INT64}))
  206. .OUTPUT(y_indices, TensorType({DT_INT64}))
  207. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  208. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  209. .OP_END_FACTORY_REG(SparseSparseMaximum)
  210. REG_OP(SparseSparseMinimum)
  211. .INPUT(x1_indices, TensorType({DT_INT64}))
  212. .INPUT(x1_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  213. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  214. .INPUT(x1_shape, TensorType({DT_INT64}))
  215. .INPUT(x2_indices, TensorType({DT_INT64}))
  216. .INPUT(x2_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  217. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  218. .INPUT(x2_shape, TensorType({DT_INT64}))
  219. .OUTPUT(y_indices, TensorType({DT_INT64}))
  220. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  221. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  222. .OP_END_FACTORY_REG(SparseSparseMinimum)
  223. REG_OP(SparseReduceMax)
  224. .INPUT(x_indices, TensorType({DT_INT64}))
  225. .INPUT(x_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  226. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  227. .INPUT(x_shape, TensorType({DT_INT64}))
  228. .INPUT(reduction_axes, TensorType({DT_INT32}))
  229. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16,
  230. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  231. .ATTR(keep_dims, Bool, false)
  232. .OP_END_FACTORY_REG(SparseReduceMax)
  233. REG_OP(SparseReduceMaxSparse)
  234. .INPUT(x_indices, TensorType({DT_INT64}))
  235. .INPUT(x_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  236. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  237. .INPUT(x_shape, TensorType({DT_INT64}))
  238. .INPUT(reduction_axes, TensorType({DT_INT32}))
  239. .OUTPUT(y_indices, TensorType({DT_INT64}))
  240. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  241. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  242. .OUTPUT(y_shape, TensorType({DT_INT64}))
  243. .ATTR(keep_dims, Bool, false)
  244. .OP_END_FACTORY_REG(SparseReduceMaxSparse)
  245. REG_OP(SparseReduceSum)
  246. .INPUT(x_indices, TensorType({DT_INT64}))
  247. .INPUT(x_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  248. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  249. .INPUT(x_shape, TensorType({DT_INT64}))
  250. .INPUT(reduction_axes, TensorType({DT_INT32}))
  251. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16,
  252. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  253. .ATTR(keep_dims, Bool, false)
  254. .OP_END_FACTORY_REG(SparseReduceSum)
  255. REG_OP(SparseReduceSumSparse)
  256. .INPUT(x_indices, TensorType({DT_INT64}))
  257. .INPUT(x_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  258. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  259. .INPUT(x_shape, TensorType({DT_INT64}))
  260. .INPUT(reduction_axes, TensorType({DT_INT32}))
  261. .OUTPUT(y_indices, TensorType({DT_INT64}))
  262. .OUTPUT(y_values, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT8, DT_INT16, \
  263. DT_UINT16, DT_UINT8, DT_INT32, DT_INT64, DT_DOUBLE}))
  264. .OUTPUT(y_shape, TensorType({DT_INT64}))
  265. .ATTR(keep_dims, Bool, false)
  266. .OP_END_FACTORY_REG(SparseReduceSumSparse)
  267. REG_OP(SparseSplit)
  268. .INPUT(split_dim, TensorType({DT_INT64}))
  269. .INPUT(indices, TensorType({DT_INT64}))
  270. .INPUT(values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  271. DT_INT32, DT_INT64, DT_BOOL, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  272. .INPUT(shape, TensorType({DT_INT64}))
  273. .DYNAMIC_OUTPUT(y_indices, TensorType({DT_INT64}))
  274. .DYNAMIC_OUTPUT(y_values, TensorType({DT_INT8, DT_UINT8, DT_INT16, \
  275. DT_UINT16, DT_INT32, DT_INT64, DT_BOOL, \
  276. DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  277. .DYNAMIC_OUTPUT(y_shape, TensorType({DT_INT64}))
  278. .ATTR(num_split, Int, 1)
  279. .OP_END_FACTORY_REG(SparseSplit)
  280. REG_OP(SparseCross)
  281. .DYNAMIC_INPUT(indices, TensorType({DT_INT64}))
  282. .DYNAMIC_INPUT(values, TensorType({DT_INT64, DT_STRING}))
  283. .DYNAMIC_INPUT(shapes, TensorType({DT_INT64}))
  284. .DYNAMIC_INPUT(dense_inputs, TensorType({DT_INT64, DT_STRING}))
  285. .OUTPUT(output_indices, TensorType({DT_INT64}))
  286. .OUTPUT(output_values, TensorType({DT_INT64, DT_STRING}))
  287. .OUTPUT(output_shape, TensorType({DT_INT64}))
  288. .ATTR(N, Int, 0)
  289. .REQUIRED_ATTR(hashed_output, Bool)
  290. .ATTR(num_buckets, Int, 0)
  291. .REQUIRED_ATTR(hash_key, Int)
  292. .REQUIRED_ATTR(out_type, Type)
  293. .REQUIRED_ATTR(internal_type, Type)
  294. .OP_END_FACTORY_REG(SparseCross)
  295. REG_OP(AddManySparseToTensorsMap)
  296. .INPUT(indices, TensorType({DT_INT64}))
  297. .INPUT(values, TensorType({DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, \
  298. DT_INT32, DT_INT64, DT_BOOL, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}))
  299. .INPUT(shape, TensorType({DT_INT64}))
  300. .OUTPUT(handles, TensorType({DT_INT64}))
  301. .ATTR(container, String, "")
  302. .ATTR(shared_name, String, "")
  303. .OP_END_FACTORY_REG(AddManySparseToTensorsMap)
  304. REG_OP(TakeManySparseFromTensorsMap)
  305. .INPUT(handles, TensorType({DT_INT64}))
  306. .OUTPUT(indices, TensorType({DT_INT64}))
  307. .OUTPUT(values, TensorType({DT_BOOL, DT_INT8, DT_UINT8, DT_INT16, \
  308. DT_UINT16, DT_INT32, DT_INT64, DT_DOUBLE, DT_FLOAT, DT_FLAOT16}))
  309. .OUTPUT(shape, TensorType({DT_INT64}))
  310. .REQUIRED_ATTR(dtype, Type)
  311. .ATTR(container, String, "")
  312. .ATTR(shared_name, String, "")
  313. .OP_END_FACTORY_REG(TakeManySparseFromTensorsMap)
  314. REG_OP(SerializeSparse)
  315. .INPUT(indices, TensorType({DT_INT64}))
  316. .INPUT(values, TensorType({DT_BOOL, DT_INT8, DT_UINT8, DT_INT16, \
  317. DT_UINT16, DT_INT32, DT_INT64, DT_DOUBLE, DT_FLOAT, DT_FLAOT16}))
  318. .INPUT(shape, TensorType({DT_INT64}))
  319. .OUTPUT(serialized_sparse, TensorType({DT_STRING}))
  320. .ATTR(out_type, Type, DT_STRING)
  321. .OP_END_FACTORY_REG(SerializeSparse)
  322. REG_OP(SerializeManySparse)
  323. .INPUT(indices, TensorType({DT_INT64}))
  324. .INPUT(values, TensorType({DT_BOOL, DT_INT8, DT_UINT8, DT_INT16, \
  325. DT_UINT16, DT_INT32, DT_INT64, DT_DOUBLE, DT_FLOAT, DT_FLAOT16}))
  326. .INPUT(shape, TensorType({DT_INT64}))
  327. .OUTPUT(serialized_sparse, TensorType({DT_STRING}))
  328. .ATTR(out_type, Type, DT_STRING)
  329. .OP_END_FACTORY_REG(SerializeManySparse)
  330. REG_OP(DeserializeSparse)
  331. .INPUT(serialized_sparse, TensorType({DT_STRING}))
  332. .OUTPUT(indices, TensorType({DT_INT64}))
  333. .OUTPUT(values, TensorType({DT_BOOL, DT_INT8, DT_UINT8, DT_INT16, \
  334. DT_UINT16, DT_INT32, DT_INT64, DT_DOUBLE, DT_FLOAT, DT_FLAOT16}))
  335. .OUTPUT(shape, TensorType({DT_INT64}))
  336. .REQUIRED_ATTR(dtype, Type)
  337. .OP_END_FACTORY_REG(DeserializeSparse)
  338. REG_OP(DeserializeManySparse)
  339. .INPUT(serialized_sparse, TensorType({DT_STRING}))
  340. .OUTPUT(indices, TensorType({DT_INT64}))
  341. .OUTPUT(values, TensorType({DT_BOOL, DT_INT8, DT_UINT8, DT_INT16, \
  342. DT_UINT16, DT_INT32, DT_INT64, DT_DOUBLE, DT_FLOAT, DT_FLAOT16}))
  343. .OUTPUT(shape, TensorType({DT_INT64}))
  344. .REQUIRED_ATTR(dtype, Type)
  345. .OP_END_FACTORY_REG(DeserializeManySparse)
  346. } // namespace ge
  347. #endif // GE_OP_SPARSE_OPS_H_

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