Mono.Simd

Mono.Simd

Сообщение BenjaminMoore 18 янв 2014, 19:42

Я позже более подробно распишу, но пока вкратце.
Unity3d работает на Mono, и у него есть интересные преимущества и особенности относительно .Net. Как пример это библиотека Mono.Simd.
Суть в том, что у процессора есть разные наборы команд, а точнее у сопроцессора, но об этом очень легко гуглить по словам SSE или SIMD. Эти наборы, в зависимости от версии, позволяют получать очень хорошие увеличения производительности при объемных мат. вычислениям векторов\простых чисел.
Из обычного .Net доступ к такому не получить, а вот Mono расщедрился и теперь можно пофинтить.
Всё, что нужно это добавить библиотеку в проект, берем ее здесь %ProgramFiles%\Unity\Data\Mono\lib\mono\2.0\Mono.Simd.dll
(вообще библиотека есть в окружении Mono, и если Вы пишите свою библиотеку с ссылками на Mono.Simd, она будет отлично работать, просто Unity генерит C# проект без ссылок на онную, и обойти это можно скопировав ее тупо в проект)

теперь можно поглазеть на это в живую, по-умолчанию в Mono.Simd есть готовые структуры векторов, пример с одним из них ниже, но с помощью специальных аттрибутов, можно ускорить много чего, но об этом потом. Пока можете попробовать это и погуглить в целях саморазвития. На моем железе прирост х10 раз
Синтаксис:
Используется csharp
    using System.Diagnostics;
    using Mono.Simd;
    using UnityEngine;

    public class SIMDTest : MonoBehaviour
    {
        public void Awake()
        {
            const int count = 10000000;
            var simdVector = new Vector4f(1, 2, 3, 4);
            var simdResult = simdVector;

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < count; i++)
            {
                simdResult += simdVector;
            }
            sw.Stop();
            UnityEngine.Debug.Log(string.Format("SIMD result: {0}", sw.Elapsed));

            sw = Stopwatch.StartNew();
            var usualVector = new Vector4(1, 2, 3, 4);
            var usualResult = usualVector;
            for (var i = 0; i < count; i++)
            {
                usualResult += usualVector;
            }
            sw.Stop();
            UnityEngine.Debug.Log(string.Format("Usual result: {0}", sw.Elapsed));
        }
    }
 
Последний раз редактировалось BenjaminMoore 18 янв 2014, 19:45, всего редактировалось 1 раз.
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: Mono.Simd

Сообщение Neodrop 18 янв 2014, 19:45

(3A4OT) (3A4OT) (3A4OT)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mono.Simd

Сообщение BornFoRdeatH 18 янв 2014, 19:48

Очень интересная информация, в мемориз. Приношу благодарность что поделились. (3A4OT)
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Mono.Simd

Сообщение jetyb 30 янв 2014, 07:43

Жемчужина.
Только реализация странная. Куча структур, есть даже Vector16b, но нет очень необходимых Vector3f, Vector3d и Vector2f. Но это не мешает Vector4f работать быстрее стандартного Vector3. Прям хоть основные классы переписывай.
Еще почему-то нет скалярных функций типа Vector3.Dot .

Придумавших это наградить, распространителей - высечь. Почему я об этом раньше не знал? Где хоть какая-то документация?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Mono.Simd

Сообщение BenjaminMoore 30 янв 2014, 12:10

jetyb писал(а):Жемчужина.
Только реализация странная. Куча структур, есть даже Vector16b, но нет очень необходимых Vector3f, Vector3d и Vector2f. Но это не мешает Vector4f работать быстрее стандартного Vector3. Прям хоть основные классы переписывай.
Еще почему-то нет скалярных функций типа Vector3.Dot .

Придумавших это наградить, распространителей - высечь. Почему я об этом раньше не знал? Где хоть какая-то документация?


simd оптимизации часто используются в плюсах.
реализация не странная, а удобная для сопроцессора. Документация есть, но она относится к Моно, а не к Unity.
описание векторного и скалярного произведения ложится на плечи использующего, в принципе инфа гуглится даже в реалиях Mono.Simd, но проще будет разобраться в плюсовой реализации simd и тогда будет ясно, что писать для моно
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: Mono.Simd

Сообщение _Ignat_ 30 янв 2014, 12:19

(3A4OT)
Изображение
| · участник клуба GCC · |
Аватара пользователя
_Ignat_
UNITрон
 
Сообщения: 311
Зарегистрирован: 11 дек 2013, 20:26
Откуда: Российская Федерация
  • Сайт

Re: Mono.Simd

Сообщение BornFoRdeatH 30 янв 2014, 16:51

А может кто сказать как обстоят дела этой либы с neon инструкциями?

http://docs.go-mono.com/?link=T%3aMono.Simd.AccelMode
Я так понимаю она не поддерживает Simd NEON? Тоесть для мобил бесполезна?
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Mono.Simd

Сообщение BenjaminMoore 30 янв 2014, 17:54

Поддержку на конкретной мобилке можно посмотреть с помощью следующего кода.
К сожалению более точно я не скажу.
Синтаксис:
Используется csharp
    using Mono.Simd;
    using UnityEngine;

    public class LogInfo : MonoBehaviour
    {
        private void Awake()
        {
            Debug.Log(SimdRuntime.AccelMode);
        }

        private void OnGUI()
        {
            GUILayout.Label(SimdRuntime.AccelMode.ToString());
        }
    }
 
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: Mono.Simd

Сообщение BornFoRdeatH 30 янв 2014, 18:16

Спасибо, проверю на практике.
А еще вон смотрю в составе моно имеется библиотека Cairo, и она меня очень заинтриговала, очень много вкусняшек, нужно будет проверить на практике производительность.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Mono.Simd

Сообщение Cybernoise 26 мар 2014, 20:07

вау, надо почитать
Аватара пользователя
Cybernoise
UNITрон
 
Сообщения: 262
Зарегистрирован: 12 июн 2013, 13:43
Откуда: Одесса
Skype: Mister4ui

Re: Mono.Simd

Сообщение mastersmit 21 янв 2020, 04:13

Эта библиотечка только с sse же работает? Или с мобильным Neon'ом тоже умеет?
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край


Вернуться в Tips & Tricks

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1