Страница 1 из 1

Mono.Simd

СообщениеДобавлено: 18 янв 2014, 19:42
BenjaminMoore
Я позже более подробно распишу, но пока вкратце.
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));
        }
    }
 

Re: Mono.Simd

СообщениеДобавлено: 18 янв 2014, 19:45
Neodrop
(3A4OT) (3A4OT) (3A4OT)

Re: Mono.Simd

СообщениеДобавлено: 18 янв 2014, 19:48
BornFoRdeatH
Очень интересная информация, в мемориз. Приношу благодарность что поделились. (3A4OT)

Re: Mono.Simd

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

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

Re: Mono.Simd

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

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


simd оптимизации часто используются в плюсах.
реализация не странная, а удобная для сопроцессора. Документация есть, но она относится к Моно, а не к Unity.
описание векторного и скалярного произведения ложится на плечи использующего, в принципе инфа гуглится даже в реалиях Mono.Simd, но проще будет разобраться в плюсовой реализации simd и тогда будет ясно, что писать для моно

Re: Mono.Simd

СообщениеДобавлено: 30 янв 2014, 12:19
_Ignat_
(3A4OT)

Re: Mono.Simd

СообщениеДобавлено: 30 янв 2014, 16:51
BornFoRdeatH
А может кто сказать как обстоят дела этой либы с neon инструкциями?

http://docs.go-mono.com/?link=T%3aMono.Simd.AccelMode
Я так понимаю она не поддерживает Simd NEON? Тоесть для мобил бесполезна?

Re: Mono.Simd

СообщениеДобавлено: 30 янв 2014, 17:54
BenjaminMoore
Поддержку на конкретной мобилке можно посмотреть с помощью следующего кода.
К сожалению более точно я не скажу.
Синтаксис:
Используется 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());
        }
    }
 

Re: Mono.Simd

СообщениеДобавлено: 30 янв 2014, 18:16
BornFoRdeatH
Спасибо, проверю на практике.
А еще вон смотрю в составе моно имеется библиотека Cairo, и она меня очень заинтриговала, очень много вкусняшек, нужно будет проверить на практике производительность.

Re: Mono.Simd

СообщениеДобавлено: 26 мар 2014, 20:07
Cybernoise
вау, надо почитать

Re: Mono.Simd

СообщениеДобавлено: 21 янв 2020, 04:13
mastersmit
Эта библиотечка только с sse же работает? Или с мобильным Neon'ом тоже умеет?