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 исполнения фрагментов кода. Затраты на создание этого умного, универсального и автоматически не по силам моего воображения (и если есть некоторые инвесторы, которые будут спонсировать это, они, скорее всего, не захотят «делиться» плодами своих инвестиций в общем публичном использовании. будут?)