Что такое "векторизация"?

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

5 ответов


многие процессоры имеют наборы инструкций" вектор "или" 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];
}

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


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

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

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

хотя тонны объяснений там, вот что векторизация ОПРЕДЕЛЯЕТСЯ КАК В СТРАНИЦА ДОКУМЕНТАЦИИ NUMPY

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

  1. векторизованный код больше сжатый и легче читать

  2. меньше строк кода обычно означает меньше ошибок

  3. код больше напоминает стандартную математическую нотацию (что облегчает, как правило, корректное математическое кодирование конструкции)

  4. результаты векторизации в более "подходящие для Python" код. Без векторизация, наш код будет завален неэффективными и трудно читать для петель.


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