通用定义
功能说明
此为仅有一个源操作数时指令的通用格式。
注意,此章节仅为通用格式说明,不是真正的指令。
函数原型
instruction (mask, dst, src, repeat_times, dst_rep_stride, src_rep_stride)
PIPE: VECTOR
参数说明
注意事项
- repeat_times∈[0,255]。支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64),当repeat_times为立即数时,不支持0。
- 每个repeat的并行度取决于数据类型、芯片版本,以下以PAR代表并行度。
- dst_rep_stride/src_rep_stride
;单位为32B;支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。
- dst/src应声明在scope_ubuf中,且所支持的数据类型与芯片版本有关,如果不支持,工具会报错。
- dst和src的数据类型应一致。
- 为了节省地址空间,开发者可以定义一个Tensor,供源操作数与目的操作数同时使用(即地址重叠),各指令通用约束如下,具体以各指令约束为准。
- 对于单次repeat(repeat_times=1),且源操作数与目的操作数之间要求100%完全重叠,不支持部分重叠。
- 对于多次repeat(repeat_times>1),若源操作数与目的操作数之间存在依赖,即第N次迭代的目的操作数是第N+1次的源操作数,这种情况是不支持地址重叠的。
- 操作数地址偏移对齐要求请见通用约束。
调用示例
- 数据连续操作样例
from tbe import tik tik_instance = tik.Tik() dtype_size = { "int8": 1, "uint8": 1, "int16": 2, "uint16": 2, "float16": 2, "int32": 4, "uint32": 4, "float32": 4, "int64": 8, } shape = (2, 512) dtype = "float16" elements = 2 * 512 # 单次迭代操作的数,当前示例一次迭代处理128个数,mask逐bits模式可写成 [2**64-1, 2**64-1] mask =128 # 迭代次数,当前示例进行了8次迭代,可根据需要调整对应的迭代次数 repeat_times = 8 # 迭代间目的操作数前一次repeat头与后一次repeat头之间的距离,单位32B,该示例是连续放置目的操作数,若不需要连续处理数据,可调整对应的参数 dst_rep_stride = 8 # 迭代间源的操作数前一次repeat头与后一次repeat头之间的距离,单位32B,该示例是连续读取源操作数,若不需要连续处理数据,可调整对应的参数 src_rep_stride = 8 src_gm = tik_instance.Tensor(dtype, shape, name="src_gm", scope=tik.scope_gm) dst_gm = tik_instance.Tensor(dtype, shape, name="dst_gm", scope=tik.scope_gm) src_ub = tik_instance.Tensor(dtype, shape, name="src_ub", scope=tik.scope_ubuf) dst_ub = tik_instance.Tensor(dtype, shape, name="dst_ub", scope=tik.scope_ubuf) # 搬移的片段数 nburst = 1 # 每次搬运的片段长度,单位32B burst = elements * dtype_size[dtype] // 32 // nburst # 前burst尾与后burst头的距离,单位32B dst_stride, src_stride = 0, 0 # 拷贝用户输入数据到src ubuf tik_instance.data_move(src_ub, src_gm, 0, nburst, burst, src_stride, dst_stride) tik_instance.vec_relu(mask, dst_ub, src_ub, repeat_times, dst_rep_stride, src_rep_stride) # 将计算结果拷贝到目标gm tik_instance.data_move(dst_gm, dst_ub, 0, nburst, burst, src_stride, dst_stride) tik_instance.BuildCCE(kernel_name="vec_relu", inputs=[src_gm], outputs=[dst_gm]) 示例结果 输入数据(src_gm): [[ 0.000e+00 1.000e+00 -2.000e+00 3.000e+00 -4.000e+00 5.000e+00 -6.000e+00 7.000e+00 -8.000e+00 9.000e+00 -1.000e+01 1.100e+01 -1.200e+01 1.300e+01 -1.400e+01 1.500e+01 -1.600e+01 1.700e+01 -1.800e+01 1.900e+01 -2.000e+01 2.100e+01 -2.200e+01 2.300e+01 -2.400e+01 2.500e+01 -2.600e+01 2.700e+01 -2.800e+01 2.900e+01 -3.000e+01 3.100e+01 -3.200e+01 3.300e+01 -3.400e+01 3.500e+01 -3.600e+01 3.700e+01 -3.800e+01 3.900e+01 -4.000e+01 4.100e+01 -4.200e+01 4.300e+01 -4.400e+01 4.500e+01 -4.600e+01 4.700e+01 -4.800e+01 4.900e+01 -5.000e+01 5.100e+01 -5.200e+01 5.300e+01 -5.400e+01 5.500e+01 -5.600e+01 5.700e+01 -5.800e+01 5.900e+01 -6.000e+01 6.100e+01 -6.200e+01 6.300e+01 -6.400e+01 6.500e+01 ... -1.010e+03 1.011e+03 -1.012e+03 1.013e+03 -1.014e+03 1.015e+03 -1.016e+03 1.017e+03 -1.018e+03 1.019e+03 -1.020e+03 1.021e+03 -1.022e+03 1.023e+03]] 输出数据(dst_gm): [[0.000e+00 1.000e+00 0.000e+00 3.000e+00 0.000e+00 5.000e+00 0.000e+00 7.000e+00 0.000e+00 9.000e+00 0.000e+00 1.100e+01 0.000e+00 1.300e+01 0.000e+00 1.500e+01 0.000e+00 1.700e+01 0.000e+00 1.900e+01 0.000e+00 2.100e+01 0.000e+00 2.300e+01 0.000e+00 2.500e+01 0.000e+00 2.700e+01 0.000e+00 2.900e+01 0.000e+00 3.100e+01 0.000e+00 3.300e+01 0.000e+00 3.500e+01 0.000e+00 3.700e+01 0.000e+00 3.900e+01 0.000e+00 4.100e+01 0.000e+00 4.300e+01 0.000e+00 4.500e+01 0.000e+00 4.700e+01 0.000e+00 4.900e+01 0.000e+00 5.100e+01 0.000e+00 5.300e+01 0.000e+00 5.500e+01 0.000e+00 5.700e+01 0.000e+00 5.900e+01 0.000e+00 6.100e+01 0.000e+00 6.300e+01 0.000e+00 6.500e+01 ... 1.009e+03 0.000e+00 1.011e+03 0.000e+00 1.013e+03 0.000e+00 1.015e+03 0.000e+00 1.017e+03 0.000e+00 1.019e+03 0.000e+00 1.021e+03 0.000e+00 1.023e+03]]
- 数据非连续操作样例
""" 此处有320个源操作数,需要对源操作数取绝对值操作并按照每放32个数再间隔32个数进行数据放置 """ from tbe import tik tik_instance = tik.Tik() dtype_size = { "int8": 1, "uint8": 1, "int16": 2, "uint16": 2, "float16": 2, "int32": 4, "uint32": 4, "float32": 4, "int64": 8, } shape = (10, 32) dst_shape = (10, 64) dtype = "float16" elements = 10 * 32 dst_elements = 10 * 64 # 单次迭代操作的数,当前示例一次迭代处理32个数,mask逐bits模式可写成 [0, 2**32-1] mask = 32 # 迭代次数,当前示例进行了10次迭代,可根据需要调整对应的迭代次数 repeat_times = 10 # 迭代间目的操作数前一次repeat头与后一次repeat头之间的距离,单位32B, 由于每次迭代处理32个数,每32个数间隔32个数,所以当前迭代间需要间隔4个block放置目地操作数才能达到效果 dst_rep_stride = 4 # 迭代间源的操作数前一次repeat头与后一次repeat头之间的距离,单位32B, 由于每次迭代处理32个数,所以当前迭代间需要隔2个block便可以读取连续读取源操作数 src_rep_stride = 2 src_gm = tik_instance.Tensor(dtype, shape, name="src_gm", scope=tik.scope_gm) dst_gm = tik_instance.Tensor(dtype, dst_shape, name="dst_gm", scope=tik.scope_gm) src_ub = tik_instance.Tensor(dtype, shape, name="src_ub", scope=tik.scope_ubuf) dst_ub = tik_instance.Tensor(dtype, dst_shape, name="dst_ub", scope=tik.scope_ubuf) # 搬移的片段数 nburst = 1 # 每次搬运的片段长度,单位32B burst = elements * dtype_size[dtype] // 32 // nburst # 前burst尾与后burst头的距离,单位32B dst_stride, src_stride = 0, 0 # 拷贝用户输入数据到src ubuf tik_instance.data_move(src_ub, src_gm, 0, nburst, burst, src_stride, dst_stride) # 对dst_ub 进行初始化为0操作 tik_instance.vec_dup(64, dst_ub, 0, 10, 4) # 执行vec_abs指令 tik_instance.vec_abs(mask, dst_ub, src_ub, repeat_times, dst_rep_stride, src_rep_stride) # 将计算结果拷贝到目标gm dst_burst = dst_elements * dtype_size[dtype] // 32 // nburst tik_instance.data_move(dst_gm, dst_ub, 0, nburst, dst_burst, src_stride, dst_stride) tik_instance.BuildCCE(kernel_name="vec_abs", inputs=[src_gm], outputs=[dst_gm]) 示例结果 输入数据(src_gm): [[ 0. -1. -2. -3. -4. -5. -6. -7. -8. -9. -10. -11. -12. -13. -14. -15. -16. -17. -18. -19. -20. -21. -22. -23. -24. -25. -26. -27. -28. -29. -30. -31.] [ -32. -33. -34. -35. -36. -37. -38. -39. -40. -41. -42. -43. -44. -45. -46. -47. -48. -49. -50. -51. -52. -53. -54. -55. -56. -57. -58. -59. -60. -61. -62. -63.] [ -64. -65. -66. -67. -68. -69. -70. -71. -72. -73. -74. -75. -76. -77. -78. -79. -80. -81. -82. -83. -84. -85. -86. -87. -88. -89. -90. -91. -92. -93. -94. -95.] [ -96. -97. -98. -99. -100. -101. -102. -103. -104. -105. -106. -107. -108. -109. -110. -111. -112. -113. -114. -115. -116. -117. -118. -119. -120. -121. -122. -123. -124. -125. -126. -127.] [-128. -129. -130. -131. -132. -133. -134. -135. -136. -137. -138. -139. -140. -141. -142. -143. -144. -145. -146. -147. -148. -149. -150. -151. -152. -153. -154. -155. -156. -157. -158. -159.] [-160. -161. -162. -163. -164. -165. -166. -167. -168. -169. -170. -171. -172. -173. -174. -175. -176. -177. -178. -179. -180. -181. -182. -183. -184. -185. -186. -187. -188. -189. -190. -191.] [-192. -193. -194. -195. -196. -197. -198. -199. -200. -201. -202. -203. -204. -205. -206. -207. -208. -209. -210. -211. -212. -213. -214. -215. -216. -217. -218. -219. -220. -221. -222. -223.] [-224. -225. -226. -227. -228. -229. -230. -231. -232. -233. -234. -235. -236. -237. -238. -239. -240. -241. -242. -243. -244. -245. -246. -247. -248. -249. -250. -251. -252. -253. -254. -255.] [-256. -257. -258. -259. -260. -261. -262. -263. -264. -265. -266. -267. -268. -269. -270. -271. -272. -273. -274. -275. -276. -277. -278. -279. -280. -281. -282. -283. -284. -285. -286. -287.] [-288. -289. -290. -291. -292. -293. -294. -295. -296. -297. -298. -299. -300. -301. -302. -303. -304. -305. -306. -307. -308. -309. -310. -311. -312. -313. -314. -315. -316. -317. -318. -319.]] 输出数据(dst_gm): [[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
父主题: 单目