Unity 2021 и Burst 1.5

В сотрудничестве с Arm добавили в этой версии интринсики. Это позволяет использовать конкретные аппаратные инструкции, доступные на Arm платформе, включая векторную технологию Neon.

Unity 2021 и Burst 1.5

Интерсинки Arm Neon были впервые представлены в качестве экспериментальной функции в Burst 1.4, а теперь полностью поддерживаются в Burst 1.5. В настоящее время Burst включает в себя все функции Armv8-A, включая Armv8.1-RDMA, Armv8.2-DotProd и Armv8.2-Crypto в качестве экспериментальных функций Burst 1.5, которые будут полностью поддерживаться в следующей версии.

static float ComputeSum(float* arr, int count) { // For simplicity sake assuming that the length of the data is a multiple of 4 // Make sure to handle any remainder properly in production code Assert.IsTrue(count % 4 == 0); if (IsNeonSupported) { // To sum up all values in the array, we split the array into 4 subarrays // and store their sums in the variable `sum` below v128 sum = new v128(0f); for (int i = 0; i < count; i += 4) { // Load 4 floats from memory v128 reg = vld1q_f32(arr + i); sum = vaddq_f32(sum, reg); } return vaddvq_f32(sum); } else { // Fallback: managed implementation float sum = 0; for (int i = 0; i < count; i++) sum += arr[i]; return sum; } }

IsNeonSupported исполняется во время компиляции, поэтому оно не влияет на производительность рантайма. Если вы хотите предоставить несколько встроенных реализаций для целевых процессоров Arm и Intel, вам следует включить в свой код больше IsXXXSupported блоков.

Ключевое в 1.5:

  • Hint.Likely, Hint.Unlikely и Hint.Assume для подсказки компилятору.
  • pbQnIsHxX Call.
  • IsConstantExpression для проверки на константность.
  • Атрибут [SkipLocalsInit]. По функциональность как [SkipLocalsInitAttribute] из C# 5.
  • Множество мелких улучшений.
if (Likely(x == 0)) { // Делает что-то, что почти наверняка случится } if (Unlikely(x != 0)) { // Выполняем что-то, что маловероятно, что случится }
2828
Начать дискуссию