暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. using System.Linq;
  2. using System.Runtime.CompilerServices;
  3. using Unity.Burst;
  4. using Unity.Burst.CompilerServices;
  5. using Unity.Collections;
  6. namespace Burst.Compiler.IL.Tests
  7. {
  8. #if BURST_INTERNAL || UNITY_BURST_EXPERIMENTAL_LOOP_INTRINSICS
  9. internal class LoopIntrinsics
  10. {
  11. [MethodImpl(MethodImplOptions.NoInlining)]
  12. private static unsafe void CheckExpectVectorizedImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  13. {
  14. for (var i = 0; i < count; i++)
  15. {
  16. Loop.ExpectVectorized();
  17. a[i] += b[i];
  18. }
  19. }
  20. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  21. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  22. public static unsafe void CheckExpectVectorized(int count)
  23. {
  24. var a = stackalloc int[count];
  25. var b = stackalloc int[count];
  26. CheckExpectVectorizedImpl(a, b, count);
  27. }
  28. [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
  29. private static unsafe void CheckExpectVectorizedNoOptimizationsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  30. {
  31. for (var i = 0; i < count; i++)
  32. {
  33. Loop.ExpectVectorized();
  34. a[i] += b[i];
  35. }
  36. }
  37. [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  38. [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
  39. public static unsafe void CheckExpectVectorizedNoOptimizations(int count)
  40. {
  41. var a = stackalloc int[count];
  42. var b = stackalloc int[count];
  43. CheckExpectVectorizedNoOptimizationsImpl(a, b, count);
  44. }
  45. [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
  46. private static unsafe void CheckExpectNotVectorizedNoOptimizationsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  47. {
  48. for (var i = 0; i < count; i++)
  49. {
  50. Loop.ExpectNotVectorized();
  51. a[i] += b[i];
  52. }
  53. }
  54. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  55. public static unsafe void CheckExpectNotVectorizedNoOptimizations(int count)
  56. {
  57. var a = stackalloc int[count];
  58. var b = stackalloc int[count];
  59. CheckExpectNotVectorizedNoOptimizationsImpl(a, b, count);
  60. }
  61. [MethodImpl(MethodImplOptions.NoOptimization)]
  62. private static unsafe void CheckExpectVectorizedOptimizationsDisabledImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  63. {
  64. for (var i = 0; i < count; i++)
  65. {
  66. Loop.ExpectVectorized();
  67. a[i] += b[i];
  68. }
  69. }
  70. [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  71. [OptimizationsOnly("We only validate loop intrinsics with optimizations enabled")]
  72. public static unsafe void CheckExpectVectorizedOptimizationsDisabled(int count)
  73. {
  74. var a = stackalloc int[count];
  75. var b = stackalloc int[count];
  76. CheckExpectVectorizedOptimizationsDisabledImpl(a, b, count);
  77. }
  78. [MethodImpl(MethodImplOptions.NoInlining)]
  79. private static unsafe void CheckExpectNotVectorizedImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  80. {
  81. for (var i = 0; i < count; i++)
  82. {
  83. Loop.ExpectNotVectorized();
  84. if (a[i] > b[i])
  85. {
  86. break;
  87. }
  88. a[i] += b[i];
  89. }
  90. }
  91. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  92. public static unsafe void CheckExpectNotVectorized(int count)
  93. {
  94. var a = stackalloc int[count];
  95. var b = stackalloc int[count];
  96. CheckExpectNotVectorizedImpl(a, b, count);
  97. }
  98. [MethodImpl(MethodImplOptions.NoInlining)]
  99. private static unsafe void CheckExpectVectorizedFailImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  100. {
  101. for (var i = 0; i < count; i++)
  102. {
  103. Loop.ExpectVectorized();
  104. if (a[i] > b[i])
  105. {
  106. break;
  107. }
  108. a[i] += b[i];
  109. }
  110. }
  111. [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  112. [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
  113. public static unsafe void CheckExpectVectorizedFail(int count)
  114. {
  115. var a = stackalloc int[count];
  116. var b = stackalloc int[count];
  117. CheckExpectVectorizedFailImpl(a, b, count);
  118. }
  119. [MethodImpl(MethodImplOptions.NoInlining)]
  120. private static unsafe void CheckExpectNotVectorizedFailImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  121. {
  122. for (var i = 0; i < count; i++)
  123. {
  124. Loop.ExpectNotVectorized();
  125. a[i] += b[i];
  126. }
  127. }
  128. [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  129. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  130. public static unsafe void CheckExpectNotVectorizedFail(int count)
  131. {
  132. var a = stackalloc int[count];
  133. var b = stackalloc int[count];
  134. CheckExpectNotVectorizedFailImpl(a, b, count);
  135. }
  136. [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopIntrinsicMustBeCalledInsideLoop, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  137. [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
  138. public static unsafe void CheckExpectVectorizedOutsideLoop()
  139. {
  140. Loop.ExpectVectorized();
  141. }
  142. [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopIntrinsicMustBeCalledInsideLoop, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  143. [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
  144. public static unsafe void CheckExpectNotVectorizedOutsideLoop()
  145. {
  146. Loop.ExpectNotVectorized();
  147. }
  148. [MethodImpl(MethodImplOptions.NoInlining)]
  149. private static unsafe void CheckExpectVectorizedMultipleCallsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
  150. {
  151. for (var i = 0; i < count; i++)
  152. {
  153. Loop.ExpectVectorized();
  154. a[i] += b[i];
  155. Loop.ExpectVectorized();
  156. }
  157. }
  158. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  159. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  160. public static unsafe void CheckExpectVectorizedMultipleCalls(int count)
  161. {
  162. var a = stackalloc int[count];
  163. var b = stackalloc int[count];
  164. CheckExpectVectorizedMultipleCallsImpl(a, b, count);
  165. }
  166. [MethodImpl(MethodImplOptions.NoInlining)]
  167. private static unsafe void CheckExpectVectorizedUnrolledLoopImpl([NoAlias] int* a, [NoAlias] int* b)
  168. {
  169. for (var i = 0; i < 4; i++)
  170. {
  171. Loop.ExpectVectorized();
  172. if (a[i] > b[i])
  173. {
  174. a[i] += b[i];
  175. }
  176. }
  177. }
  178. [TestCompiler(100, ExpectedDiagnosticId = DiagnosticId.WRN_LoopIntrinsicCalledButLoopOptimizedAway, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  179. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  180. public static unsafe void CheckExpectVectorizedUnrolledLoop(int count)
  181. {
  182. var a = stackalloc int[count];
  183. var b = stackalloc int[count];
  184. CheckExpectVectorizedUnrolledLoopImpl(a, b);
  185. }
  186. [MethodImpl(MethodImplOptions.NoInlining)]
  187. private static unsafe int CheckExpectVectorizedPartiallyUnrolledLoopImpl(int* a, int count)
  188. {
  189. var sum = 0;
  190. for (var i = 0; i < count; i++)
  191. {
  192. Loop.ExpectVectorized();
  193. sum += a[i];
  194. }
  195. return sum;
  196. }
  197. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  198. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  199. public static unsafe int CheckExpectVectorizedPartiallyUnrolledLoop(int count)
  200. {
  201. var a = stackalloc int[count];
  202. a[0] = 8;
  203. a[10] = 16;
  204. return CheckExpectVectorizedPartiallyUnrolledLoopImpl(a, count);
  205. }
  206. [TestCompiler(100, ExpectedDiagnosticId = DiagnosticId.WRN_LoopIntrinsicCalledButLoopOptimizedAway, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  207. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  208. public static unsafe void CheckExpectVectorizedRemovedLoop(int count)
  209. {
  210. for (var i = 0; i < count; i++)
  211. {
  212. Loop.ExpectVectorized();
  213. }
  214. }
  215. [MethodImpl(MethodImplOptions.NoInlining)]
  216. private static unsafe void CheckExpectVectorizedNestedImpl(
  217. [NoAlias] int* a, [NoAlias] int* b,
  218. [NoAlias] int* c, [NoAlias] int* d,
  219. int count)
  220. {
  221. for (var i = 0; i < count; i++)
  222. {
  223. Loop.ExpectNotVectorized();
  224. if (a[i] > b[i])
  225. {
  226. break;
  227. }
  228. a[i] += b[i];
  229. for (var j = i; j < count; j++)
  230. {
  231. Loop.ExpectVectorized();
  232. c[j] += d[j];
  233. }
  234. }
  235. }
  236. [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
  237. [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
  238. public static unsafe void CheckExpectVectorizedNested(int count)
  239. {
  240. var a = stackalloc int[count];
  241. var b = stackalloc int[count];
  242. var c = stackalloc int[count];
  243. var d = stackalloc int[count];
  244. CheckExpectVectorizedNestedImpl(a, b, c, d, count);
  245. }
  246. [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_InstructionBoxNotSupported)]
  247. public static void TestCallingMethodWithParametersDefinedInSystemRuntime()
  248. {
  249. NativeArray<int> collection = new NativeArray<int>(2, Allocator.Temp);
  250. collection.Count();
  251. }
  252. }
  253. #endif
  254. }