Является ли векторизация спецификацией оборудования / фреймворка c или это хорошая практика кодирования? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь обернуть голову вокруг векторизации (для числовых вычислений), и я сталкиваюсь с кажущимися противоречивыми объяснениями:

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

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

Более конкретное объяснение моей дилеммы:

  • Допустим, у меня есть al oop для вычисления операции со списком чисел в Python , Чтобы векторизовать его, я просто импортирую Numpy, а затем использую функцию массива, чтобы выполнить вычисление за один шаг, вместо того, чтобы писать время, требующее l oop. Низкоуровневые подпрограммы C, используемые Numpy, сделают всю тяжелую работу от моего имени.

Знание Numpy и того, как его импортировать и использовать, насколько я могу судить, не является практикой кодирования. Это просто хорошее знание инструментов и фреймворков, вот и все.

Так почему же люди продолжают называть векторизацию практикой кодирования, которую хорошие кодеры используют в своем коде?

Ответы [ 3 ]

5 голосов
/ 22 апреля 2020

Векторизация может означать разные вещи в разных контекстах. В numpy мы обычно подразумеваем использование скомпилированных numpy методов для работы с целыми массивами. По сути это означает перемещение любых циклов из интерпретируемого Python в скомпилированный код. Это очень точно c до numpy.

Я пришел в numpy с MATLAB лет go, и APL до этого (и физика / математика, как студент). Таким образом, я долгое время привык к мышлению в терминах целых массивов / векторов / матриц.

В MATLAB теперь много точной компиляции, поэтому программисты могут писать итеративный код без потери производительности , numbacython) позволяет пользователям numpy делать то же самое, хотя по-прежнему много неровностей - как можно видеть в numpa теговых вопросах.

Распараллеливание и другие Средство использования современных многоядерных компьютеров - это другая топика c. Обычно это требует использования дополнительных пакетов.

Я не согласился с комментарием, что циклы не являются Pythoni c. Я должен это квалифицировать немного. У Python есть инструменты для избежания больших, трудно читаемых циклов, таких как списочные, генераторы и другие. Выполнение сложной задачи путем объединения воедино пониманий и генераторов - это хорошая Python практика, но это не «векторизация» (в смысле numpy).

2 голосов
/ 23 апреля 2020

Векторизация использует набор команд SIMD (Single Instruction Multiple Data) современных процессоров. Например, предположим, что ваши данные 32-битные, в старые времена одно добавление стоило одну инструкцию (скажем, 4 такта в зависимости от архитектуры). Последние инструкции SIMD от Intel теперь обрабатывают 512 битов данных одновременно с одной инструкцией, что позволяет вам делать 16 добавлений параллельно. Если вы не пишете ассемблерный код, вам лучше убедиться, что ваш код эффективно скомпилирован для использования набора команд SIMD. Об этом заботятся стандартные пакеты.

Ваши следующие возможности ускорения - написание кода, позволяющего использовать многоядерные процессоры и выводить циклы из интерпретируемого python. Опять же, об этом заботятся библиотеки и фреймворки.

Если вы специалист по данным, вам следует заботиться только о том, чтобы вызывать нужные пакеты / фреймворки, избегайте переопределения логик c, уже предлагаемых библиотеками ( с циклами, являющимися основным примером) и просто сосредоточиться на вашем приложении. Если вы являетесь разработчиком фреймворка / низкоуровневого кода, вам лучше освоить хорошие методы кодирования, иначе ваш пакет никогда не сработает.

1 голос
/ 23 апреля 2020

Q : "… почему люди продолжают ссылаться на векторизацию как практику кодирования, которую используют хорошие кодировщики ...?"

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


Это SIMD?
Хорошо не в контексте, в котором вы задали Вопрос.

Хотя компиляторы могут разрешить принудительное преобразование в вероятный машинный код SIMD-оборудования (упомянутый @ B_F ), чаще всего это не ваш вариант при использовании интерпретированного python. Модули Python могут использовать эту низкоуровневую уловку, если они были предварительно скомпилированы с такими SIMD-принудительными и / или другими опциями l oop (подобно -O3 l oop -unrolling почти fanati c разрешение на преобразование кода). Опять же, не ваш выбор при разработке кода, но мудрый выбор и повторное использование сотен человеко-лет опыта инженерных команд, которые посвятили свой опыт и усилия созданию python модулей. аппаратное обеспечение на макс. Наконец, но не в последнюю очередь, SIMD-оборудование стоит дорого, так как оно решено и реализовано в кремнии при некоторых значительных затратах для перестройки бюджета энергопотребления, тактирования и микропроцессоров процессора, если в неупорядоченном X- конвейерный суперскалярный процессор CIS C по спецификации. Тем не менее, SIMD-ы в принципе могут делать только несколько (с выравниванием векторной (небольшой) ширины) V-FADD, V-FMUL, V-FMADD, некоторые логические операции с тайной направленной шириной, поэтому преобразования машинного кода, которые могут и проходить во время автоматизированного (а не ручного), когда люди, которые действительно могут выполнить эту работу, могут добиться жестокого ускорения для одного конкретного случая и по понятным причинам, как правило, в довольно важных, HP C -подобных и, следовательно, дорогих случаях ) SIMD-принудительная компиляция, довольно узко сфокусирована и ограничена в целом таким преобразованием. В то время как ручное преобразование вычислительной стратегии может привести к введению аппаратных инструкций SIMD с загрузкой сквозной числовой обработки от нескольких дней до ~ 12 минут (автор делал это вручную в течение некоторого времени), такая задача в основном выпала автоматических кодовых преобразователей c, предварительно закодированных в любом из компиляторов, которые по очевидным причинам ограничивают объем и глубину синтаксического анализа и ищут небольшие возможности для SIMD-инъекций возможностей. Таким образом, результаты этого, в принципе, несопоставимы и не конкурируют друг с другом (кто когда-либо хотел бы делать такую ​​тяжелую работу по уходу за волосами всю оставшуюся жизнь, не так ли?)


Это синтаксический сахар numpy[:]?
Ну, не так.
Numpy имеет созданный подход векторизованного кода для массового повторного использования среди python пользовательская база

Шляпа должна быть поднята для numpy авторов, за то, что они открыли эту новую концепцию для массового использования в интерпретируемой иначе python. Повышение производительности может поразить нас, однако основное преимущество заключается не в производительности выполнения операций с векторной / матричной / тензорной формулировками.

Основное повышение заключается в изменении нашего мышления.

Позвольте мне немного обобщить представление. Информатика преподается намного позже, чем люди начинают кодировать. Программирование чаще всего (с яркими и мудрыми и очень редкими исключениями) представляется как следование некоторым правилам синтаксиса, в процессе выражения нашей воли вычислять что-то (будь то число или управление процессом печати и др.). Это заставляет нас начать верить в упрощение, что достаточно просто начать серию шагов, мыслить последовательно, шаг за шагом, переходя от А к Я.

В то время как этого достаточно для начала, рано или поздно кто-то доходит до точки, которая не может быть достигнута в рамках такой простой концепции. Здесь раскручивается банда трюков (будь то переход к управляемым событиями фреймворкам, эмулирующим своего рода управление одновременным выполнением в нескольких потоках событий, или цепочки зависимости функционального программирования, позволяющие нам не думать о выполнении само по себе, но сосредоточимся на функционально переформулированном описании проблемы).

Все это требует резкого изменения нашего ментального взгляда на вычислительную стратегию.

То же самое происходит с эффективным использованием векторизованного код. Сначала вы должны осознать полное изменение парадигмы и начать думать не [SERIAL] (один за другим, шаг, следующий, другой шаг) .


Что еще pythoni c v / s Что важнее всего?

Простите, чтобы я не вмешивался в это. Евангелизация важна для совместного обучения групп целевых групп, которым необходимо делиться культурой работы. За пределами этой области применения эти топи c не приносят никакой дополнительной пользы и склонны искажать наше драгоценное время и фокусироваться на псевдоэлитарных поединках, которые "more" -pythoni c или Most-Pythoni c в одном специфике c SLO C, в то время как искусство ведения умного бизнеса или передовая наука, поддерживаемая современными вычислительными возможностями, далеко не укажем на стилизацию любого отдельного блока SLOC.

Позвольте этим взглядам дать евангелизаторам, которые стараются изо всех сил, пытаться изменить дикую и первоначально расходящуюся толпу, чтобы, по крайней мере, не опустошить а также некоторые опубликованные c работы в более-менее спонтанном потоке разработки дизайнерских идей и их повторяющихся ревизий некоторых будущих пакетов и / или поддержки существующих или унаследованных.


EPILOGUE:

  • Векторизация per se сама вознаграждает, если она способна изменить ментальное представление.
  • Векторизация - это не просто SIM D-инъекция
  • Векторизация - это не просто - numpy (numba, и другие инструменты могут использовать эту концепцию по тем же причинам умного исполнения, которые numpy "заимствовал" у FORTRAN / HP C не так ли?)
  • Векторизация помогает уйти от чистого [SERIAL] размышления о вычислительной стратегии, когда операции такого же типа должны выполнить "по всему" вектору, "по всей" всей матрице, "через" весь тензор
  • Векторизация может позволить несколько умных трюков в самосвернутых или пошаговых трюках микро-стратегии связанных вычислений, где интеллектуальная реорганизация доступа к памяти может помочь лучше повторно использовать предварительно кэшированные значения (на скоростях ~ 100 раз быстрее, чем повторная загрузка их снова и снова из основного ОЗУ) - не стеснялась читать все от Мастеров - @ Divakar или @ hpaulj , чтобы увидеть примеры, показывающие реальные возможности сделать это до пределов
  • Vectorisatio n - это общий принцип, но его эффекты зависят от фактической работоспособности и сообразительности используемой платформы (не является автоматическим c свойством синтаксиса - решает реализация)
  • Векторизация является более мощной, чем больше вы можете математически переформулировать рассматриваемую вычислительную стратегию, тем больше это не просто oop -avoider :o) Можно заставить numpy работать векторизованно над вектором объектов, так что не только становится доступным фокусирование на число, но эффекты повторного использования интеллектуального кэша и других мощностей numpy (унаследованных от его отцов FORTRAN) останутся менее суперэффективными, поскольку они в чистом, с выравниванием ячеек памяти, оптимизированной строкой кэша, с обработкой чисел
  • Векторизация не является чем-то новым - Thinking Machines создали векторные машины еще в 1980-х годах, и CD C впервые разработали векторные процессоры примерно за два десятилетия до них, так что ничего нового под солнцем, но выше объясняется эффективность Автоматическое (машинно-управляемое) преобразование кода в вектор определяет уровень повышения производительности при обработке результатов.
  • До сих пор векторизация (по состоянию на 2020-04 гг.) не включала автоматическое использование многоядерных / перекрестных базовое выполнение на NUMA-ресурсах (если авторы пакетов не скрывают многоядерные рабочие разделения над NUMA-площадками от вашего пользовательского представления, что не так-то просто сделать, не так ли?), так что не делайте этого переоценить возможности (машинного / NUMA-зависимого) планирования автоматического преобразования кода в локальный, но распределенные по NUMA исполнения фрагментов кода. Затраты на создание этого умного, универсального и автоматически не по силам моего воображения (и если есть некоторые инвесторы, которые будут спонсировать это, они, скорее всего, не захотят «делиться» плодами своих инвестиций в общем публичном использовании. будут?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...