Вопрос

Уже несколько раз я сталкивался с этим термином в matlab, fortran...какой - то другой ...но я так и не нашел объяснения, что это значит и что оно делает?Итак, я спрашиваю здесь, что такое векторизация, и что это означает, например, что "цикл векторизован"?

Это было полезно?

Решение

Многие процессоры имеют наборы команд "vector" или "SIMD", которые применяют одну и ту же операцию одновременно к двум, четырем или более фрагментам данных.Современные чипы x86 имеют инструкции SSE, многие чипы PPC имеют инструкции "Altivec", и даже некоторые чипы ARM имеют векторный набор команд, называемый NEON.

"Векторизация" (упрощенно) - это процесс переписывания цикла таким образом, что вместо обработки одного элемента массива N раз, он обрабатывает (скажем) 4 элемента массива одновременно N/ 4 раза.

(Я выбрал 4, потому что это то, что, скорее всего, напрямую поддерживает современное оборудование;термин "векторизация" также используется для описания преобразования программного обеспечения более высокого уровня, где вы могли бы просто полностью абстрагироваться от цикла и просто описать работу с массивами вместо элементов, которые их составляют)


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

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

Развертывание этого цикла превратило бы его во что-то вроде этого:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

С другой стороны, его векторизация приводит к чему-то вроде этого:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Где "addFourThingsAtOnceAndStoreResult" является заполнителем для любых встроенных компонентов, которые ваш компилятор использует для указания векторных инструкций.Обратите внимание, что некоторые компиляторы способны автоматическая векторизация очень простые циклы, подобные этому, которые часто можно включить с помощью опции компиляции.Более сложные алгоритмы по-прежнему требуют помощи программиста для генерации хорошего векторного кода.

Другие советы

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

Из википедии :

Скалярный подход:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

Векторизованный подход:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

Это относится к возможности выполнять одну математическую операцию над списком - или " вектором " - чисел за один шаг. Вы часто видите это с Фортраном, потому что это связано с научными вычислениями, которые связаны с суперкомпьютингом, где впервые появилась векторная арифметика. В настоящее время почти все настольные процессоры предлагают некоторую форму векторизованной арифметики посредством таких технологий, как Intel SSE. Графические процессоры также предлагают форму векторизованной арифметики.

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

В реальном программном приложении я знаю, что оно используется в NUMPY (не уверен в другом).

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

, хотя существует множество объяснений, ЧТО ЗНАЧИТ ВЕКТОРИЗАЦИЯ , ОПРЕДЕЛЕННАЯ НА СТРАНИЦЕ ЧИСЛО ДОКУМЕНТАЦИИ

Векторизация описывает отсутствие какого-либо явного зацикливания, индексации и т. д. в коде - это, конечно, происходит просто за кулисами & # 8221; в оптимизированном, предварительно скомпилированном C-коде. Векторизованный код имеет много преимуществ, среди которых:

<Ол>
  • векторизованный код более лаконичен и удобен для чтения

  • меньшее количество строк кода обычно означает меньше ошибок

  • код более похож на стандартные математические обозначения (облегчая, как правило, правильно кодировать математические конструкты)

  • векторизация приводит к большему количеству & # 8220; Pythonic & # 8221; код. Без Векторизация, наш код будет завален неэффективными и трудно читать для циклов.

  • Векторизация, простыми словами, означает оптимизацию алгоритма, чтобы он мог использовать SIMD-инструкции в процессорах.

    AVX, AVX2 и AVX512 - это наборы команд (intel), которые выполняют одну и ту же операцию над несколькими данными в одной инструкции. например AVX512 означает, что вы можете работать с 16 целочисленными значениями (4 байта) одновременно. Это означает, что если у вас есть вектор из 16 целых чисел, и вы хотите удвоить это значение в каждом целом числе, а затем добавить к нему 10. Вы можете либо загрузить значения в общий регистр [a, b, c] 16 раз и выполнить ту же операцию, либо выполнить ту же операцию, загрузив все 16 значений в SIMD-регистры [xmm, ymm] и выполнить операцию один раз. Это позволяет ускорить вычисление векторных данных.

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

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

    if(x[i] > 100) x[i] += 10; // this will branch execution flow.
    

    или мы можем смоделировать условие в арифметической операции, создав вектор условия c,

    c[i] = x[i] > 100; // storing the condition on masking vector
    x[i] = x[i] + (c[i] & 10) // using mask
    

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

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

    Я хотел бы остановиться на упоминании OpenMP, который позволяет векторизовать код с помощью прагм. Я считаю это хорошей отправной точкой. То же самое можно сказать и об OpenACC.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top