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

Три мысли:

1), Если Вы собираетесь сделать что-то другое на основе типов объектов, могло бы иметь смысл перемещать то поведение в те классы. Тогда вместо переключателя или если еще, Вы просто назвали бы childNode. DoSomething ().

2) Выдерживающие сравнение типы будут намного быстрее, чем сравнения строк.

3) В, если еще дизайн, Вы могли бы быть в состоянии использовать в своих интересах переупорядочение тестов. Если объекты "Jill" составляют 90% объектов, проходящих там, теста для них сначала.

152
задан Thomas Geritzma 14 September 2009 в 15:07
поделиться

4 ответа

Многие ЦП имеют наборы команд «вектор» или «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» - это заполнитель для любых встроенных функций, которые ваш компилятор использует для определения векторных инструкций. Обратите внимание, что некоторые компиляторы могут автоматически векторизовать очень простые циклы, подобные этому, которые часто можно включить с помощью параметра компиляции. Более сложные алгоритмы по-прежнему требуют помощи программиста для создания хорошего векторного кода.

180
ответ дан 23 November 2019 в 22:11
поделиться

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

Из wikipedia :

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

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];
}
30
ответ дан 23 November 2019 в 22:11
поделиться

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

10
ответ дан 23 November 2019 в 22:11
поделиться

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

-3
ответ дан 23 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: