Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Доступен новейший JIT: сейчас с помощью SIMD

Anna | 17.06.2014 | нет комментариев

От переводчика

Лично я легко немыслимо обрадовался новой вероятности. Как раз не так давным-давно одолел Pro .Net Perfomance, в которой одна из глав была посвящена параллельности, и векторизации в частности. Итог, сделанный авторами: «К сожалению, применение векторизации допустимо экстраординарно на С , выполнение кода на видеокарте — допустимо и средствами .Net, впрочем C AMP оставляет всякие управляемые библиотеки GPGPU вдалеке позади, следственно, к сожалению, в данных задачах рекомендуем применять подключаемые C сборки.» Следственно рад известить, что по крайней мере одна задача решена. Что ж, приступим!

Введение

Быстродействие процессоров больше не подчиняется закону Мура. Следственно для увеличения продуктивности приложений, все значимей применять параллелизацию. Либо, как говорил Герб Саттер, «бесплатного супа огромнее не будет» (The free lunch is over, отсылка к статье The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software, перевод на прогре)

Дозволено подумать, что применение задачеориентированного программирования (скажем, в случае .Net — TPL, прим. пер.) либо обыкновенных потоков теснее решает эту задачу. В то время как многопоточность, безоговорочно, является главной задачей, необходимо понимать, что по-бывшему значимо оптимизировать код, выполняющийся на всяком отдельном ядре. SIMD это спецтехнология, которая использует распараллеливание данных на ярусе процессора. Многопоточность и SIMD дополняют друг друга: многопоточность разрешает распараллеливать работу на несколько ядер процессора, в то время как SIMD разрешает распараллеливать работу в пределах одного ядра.

Сегодня мы рады объявить о новой превью-версии RyuJIT, которая обеспечивает функциональность SIMD. SIMD API доступен через новейший пакет NuGet, Microsoft.Bcl.Simd, тот, что также выпущен в виде превью.

Вот пример, как вы можете его применять:

// Initalize some vectors

Vector<float> values = GetValues();
Vector<float> increment = GetIncrement();

// The next line will leverage SIMD to perform the
// addition of multiple elements in parallel:

Vector<float> result = values   increment;

Что такое SIMD и для чего он мне?

SIMD на данный момент является самой актуальной фичей, которую просят добавить в платформу (около 2000 голосов пользователей)

image

Он настоль знаменит, потому что, за исключением некоторых видов приложений, SIMD значительно ускоряет работу кода. Скажем, продуктивность рендеринга множества Мандельброта дозволено ощутимо усовершенствовать с поддержкой SIMD: в 2-3 раза (если процессор поддерживает SSE2), и в 4-5 раз (если процессор поддерживает AVX).

image

image

Вступление в SIMD

SIMD расшифровывается как «одна команда, уйма данных» (отечественный вариант — ОКМД, прим. пер). Это комплект инструкций процессора, которые разрешают трудиться над векторами взамен скаляров. За счет этого допустимо параллельное выполнение математических операций над большинством данных.

SIMD разрешает распараллеливать данные на ярусе процессора, применяя высокоуровневые средства. Скажем, представьте, что у вас есть уйма чисел, и к всякому необходимо прибавить какое-то значение. Традиционно, для решения ия точки либо сходственных объектов, таких как комплексные числа. Векторы с тремя и четырьмя элементами, как правило, применяется для 3D (4-й элемент применяется, Дабы сделать математическую работу [Видимо, речь идет о том, что в 3D-моделировании реформирования применяют четырехмерные матрицы XYZ1, прим. пер]). Суть в том, что эти задачи применяют векторы с определенным числом элементов.

Дабы получить представление о том, как эти типы выглядят, посмотрим на упрощенную версию Vector3f:

public struct Vector3f
{
    public Vector3f(float value);
    public Vector3f(float x, float y, float z);
    public float X { get; }
    public float Y { get; }
    public float Z { get; }
    public static bool operator ==(Vector3f left, Vector3f right);
    public static bool operator !=(Vector3f left, Vector3f right);
    // With SIMD, these element wise operations are done in parallel:
    public static Vector3f operator  (Vector3f left, Vector3f right);
    public static Vector3f operator -(Vector3f left, Vector3f right);
    public static Vector3f operator -(Vector3f value);
    public static Vector3f operator *(Vector3f left, Vector3f right);
    public static Vector3f operator *(Vector3f left, float right);
    public static Vector3f operator *(float left, Vector3f right);
    public static Vector3f operator /(Vector3f left, Vector3f right);
}

Я хотел бы подчеркнуть следующие аспекты:

  • Мы разработали векторы фиксированного размера, так что они могут легко заменить те, которые определены приложениях.
  • По соображениям продуктивности, мы определили эти типы, как неизменяемые типы значений.
  • Идея состоит в том, что позже замены вашего вектора нашим, ваше приложение будет вести себя так же, за исключением того, что оно будет работает стремительней. Для приобретения больше подробной информации, посмотрите на наш пример приложения трассировки лучей.

Векторы с аппаратно-зависимым размером

В то время векторные типы фиксированного размера комфортно применять, их максимальная степень параллелизации ограничена числом компонентов. Скажем, приложение, которое использует Vector2f получит убыстрение, самое большее, в два раза, даже если CPU будет горазд исполнять операции над восемью элементами единовременно.

Для того, Дабы приложение масштабировалось с аппаратными вероятностями, разработчик должен векторизовать алгорифм. Векторизация алгорифма обозначает то, что разработчик должен разбить входные параметры на уйма векторов, размер которых зависит от оборудования. На машине с SSE2, это обозначает, что приложение может трудиться над векторами из четырех 32-битных чисел с плавающей запятой. На машине с AVX, то же приложение может трудиться над векторами из восьми таких чисел.

Дабы осознать для разницу, ниже представлена упрощенная версия Vector<T>:

public struct Vector<T> where T : struct {
    public Vector(T value);
    public Vector(T[] values);
    public Vector(T[] values, int index);
    public static int Length { get; }
    public T this[int index] { get; }
    public static bool operator ==(Vector<T> left, Vector<T> right);
    public static bool operator !=(Vector<T> left, Vector<T> right); 
    // With SIMD, these element wise operations are done in parallel:
    public static Vector<T> operator  (Vector<T> left, Vector<T> right);
    public static Vector<T> operator &(Vector<T> left, Vector<T> right);
    public static Vector<T> operator |(Vector<T> left, Vector<T> right);
    public static Vector<T> operator /(Vector<T> left, Vector<T> right);
    public static Vector<T> operator ^(Vector<T> left, Vector<T> right);
    public static Vector<T> operator *(Vector<T> left, Vector<T> right);
    public static Vector<T> operator *(Vector<T> left, T right);
    public static Vector<T> operator *(T left, Vector<T> right);
    public static Vector<T> operator ~(Vector<T> value);
    public static Vector<T> operator -(Vector<T> left, Vector<T> right);
    public static Vector<T> operator -(Vector<T> value);
}

Ключевые аспекты этого типа включают в себя следующее:

  • Он обобщенный. Для возрастания эластичности и во избежание комбинаторного взрыва типов, мы определили аппаратно-зависимый вектор как обобщенный тип, Vector<T>. Исходя из фактических соображений, Т может быть только примитивным числовым типом. В этом превью мы поддерживаем только intlongfloat и double. Окончательный вариант будет также включать в себя поддержку всех других целочисленных типов, в том числе и их беззнаковых аналогов.
  • Длина неподвижна. Так как длина зависит от оборудования, но фиксирована, то доступ к ней предоставляется через статическое качество Length. Размер же определяется как sizeof(SIMD-register) / sizeof(T). Другими словами, два вектора Vector<T1> и Vector<T2> имеют идентичную длину, если T1 и T2 имеют идентичный размер. Это разрешает нам соотнести элементы в векторах с элементами различных типов, что является дюже пригодным свойством для векторизованного кода.

Векторизация — это трудная тема и, таким образом, она выходит за рамки этого блога. Тем не менее, дозвольте мне дать вам всеобщий обзор того, что это будет обозначать для определенного приложения. Давайте посмотрим на средства визуализации множества Мандельброта. Концептуально, оно работает над комплексными числами, которые могут быть представлены в виде векторов с двумя элементами. Базируясь на математическом алгорифме, эти комплексные числа имеют цветовую маркировку и отображается в виде одной точки получаемого изображения.

При наивном применении SIMD, дозволено было бы векторизовать алгорифм, представляя комплексные числа как Vector2f. Больше трудный алгорифм будет векторизовать точки для визуализации (число которых является неограниченным) взамен размера (тот, что фиксирован). Один из методов сделать это заключается в представлении действительной и мнимой компонент, как векторов. Другими словами, дозволено было бы векторизовать один и тот же компонент над несколькими точками.

Для приобретения больше подробной информации, посмотрите на наш пример. В частности, сравнитескалярную и векторизованную версии.

Применение превью-версии SIMD

В предпросмотре мы предоставляем следующие две части:

  1. Новейший релиз RyuJIT, тот, что обеспечивает поддержку SIMD
  2. Новая библиотека NuGet, тот, что предоставляет поддержку SIMD

Библиотека NuGet была намеренно предуготовлена для работы без поддержки SIMD со стороны аппаратных средств / JIT. В этом случае все способы и операции реализованы в виде чистого IL. Тем не менее, видимо, что вы можете получить максимальную продуктивность только при применении этой библиотеки в сочетании с новой версией RyuJIT.

Для того Дабы применять SIMD, вам нужно исполнить следующие шаги:

  1. Скачать и установить последнюю превью RyuJIT с aka.ms/RyuJIT
  2. Установить некоторые переменные окружения для активации новой JIT и SIMD для вашего процесса. Самый примитивный метод сделать это путем создания пакетного файла, тот, что запускает ваше приложение:
    @echo off
    set COMPLUS_AltJit=*
    set COMPLUS_FeatureSIMD=1
    start myapp.exe
    
  3. Добавьте ссылку на NuGet-пакет Microsoft.Bcl.Simd. Вы можете сделать это, щелкнув правой кнопкой мыши на плане и предпочтя Manage NuGet References. В дальнейшем диалоговом окне выберите вкладку под наименованием Online. Помимо того, нужно предпочесть Include Prelease в выпадающем списке на самом верху. После этого введите в текстовое поле в верхнем правом углу словоMicrosoft.Bcl.Simd. Нажмите кнопку Install.

В данном превью существуют определенные ограничения, о которых, допустимо, вам стоит знать:

  • SIMD доступна только для 64-битных процессов. Следственно удостоверитесь, что ваше приложение либо ориентировано именно на x64, либо скомпилировано как Any CPU, а не подмечено как 32-битное
  • Тип Vector поддерживает только int, long, float и double. Созданиеэкземпляров Vector<T> с любым иным типом вызовет исключение загрузки типа.
  • SIMD на данный момент поддерживает только SSE2. В связи с некоторыми ограничениями реализации, RyuJIT CTP не может механически изменять размер типа на основании местных вероятностей аппаратного обеспечения. Полная помощь AVX должна возникнуть с выпуском рантайма .NET, тот, что будет включать в себя RyuJIT. Мы начали работу над этим, но она (помощь) пока что не гармонирует с нашей моделью развертывания CTP.

Завершение

Мы выпустили превью-версию, которая привносит силу SIMD в мир управляемого кода. Модель программирования представлена с поддержкой комплекта вектор типов, распространяемая как новейший NuGet-пакет Microsoft.Bcl.Simd. Помощь этих операций для процессора доступна в новой превью-версииRyuJIT.

Мы хотели бы получить ваши отзывы об обоих планах. Нравится ли вам такая модель программирования? Чего не хватает? Какие совершенствования продуктивности необходимы для вашего приложения? Пожалуйста, используйте комментарии для обеспечения обратной связи либо отправьте нам письмо по адресу ryujit(at)microsoft.com.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB