Векторизация (как правило, используется термин) относится к операции SIMD (одна инструкция, несколько данных).
Это означает, что одна команда выполняет одну и ту же операцию над несколькими параллельными операндами. Например, для множественного вектора размера N скаляром назовем M числом операндов, размер которых он может работать одновременно. Если это так, то количество команд, которые ему нужно выполнить, составляет приблизительно N/M, где (с чисто скалярными операциями) он должен будет выполнять N операций.
Например, текущий набор инструкций Intel для AVX 2 использует 256-битные регистры. Они могут использоваться для хранения (и управления) набора из 4 операндов по 64 бита или 8 операндов по 32 бит за штуку.
Итак, если вы имеете дело с 32-битными действительными числами с одной точностью, это означает, что одна команда может выполнять 8 операций (умножений в вашем случае) сразу, поэтому (по крайней мере теоретически) вы можете завершите N умножений, используя только команды умножения N/8. По крайней мере теоретически это должно позволить операции завершить примерно в 8 раз быстрее, чем позволяет выполнение одной команды за раз.
Конечно, точная выгода зависит от того, сколько операндов вы поддерживаете в каждой инструкции. Первые попытки Intel поддерживали только 64-разрядные регистры, поэтому для работы с 8 элементами одновременно эти элементы могут составлять всего 8 бит. В настоящее время они поддерживают 256-битные регистры, и они объявили о поддержке 512-битных (и они, возможно, даже отправили это в несколько высокопроизводительных процессоров, но не в обычные потребительские процессоры, по крайней мере пока). Положительное использование этой возможности также может быть нетривиальным, мягко говоря. Инструкции по расписанию, так что у вас на самом деле есть N операндов, доступных и в нужном месте в нужное время, не обязательно простая задача (вообще).
Чтобы положить вещи в перспективу, (теперь древний) Cray 1 получил большую скорость именно таким образом.Его векторный блок работал на наборах из 64 регистров по 64 бит за штуку, поэтому он мог выполнять 64 операции с двойной точностью за такт. На оптимально векторизованном коде он был намного ближе к скорости текущего процессора, чем вы могли ожидать, основываясь исключительно на его (намного более низкой) тактовой частоте. В полной мере воспользоваться этим было не всегда легко (и до сих пор нет).
Имейте в виду, что векторизация не - единственный способ, которым центральный процессор может выполнять операции параллельно. Также существует возможность параллелизма уровня инструкций, который позволяет одному процессору (или одному ядру процессора) выполнять одновременно несколько команд. Большинство современных процессоров включают аппаратное обеспечение (теоретически) для выполнения до 4 инструкций за такт, если инструкции представляют собой сочетание нагрузок, хранилищ и ALU. Они могут довольно регулярно выполнять около двух инструкций за такт в среднем или более в хорошо настроенных циклах, когда память не является узким местом.
Тогда, конечно, есть многопоточность - работает несколько потоков инструкций (по крайней мере логически) отдельных процессоров/ядер.
Таким образом, современный процессор может иметь, скажем, 4 ядра, каждый из которых может выполнять 2 векторных умножения за такт, и каждая из этих инструкций может работать на 8 операндах. Таким образом, по крайней мере теоретически, он может выполнять 4 * 2 * 8 = 64 операции за такт.
Некоторые инструкции имеют лучшую или худшую пропускную способность. Например, пропускная способность FP ниже, чем FMA, или умножается на Intel до Skylake (1 вектор за такт вместо 2). Но логическая логика типа AND или XOR имеет 3 вектора на пропускную способность каждого такта; для построения блока выполнения AND/XOR/OR не требуется много транзисторов, поэтому процессоры реплицируют их. Узкие места на общей ширине трубопровода (фронт-сервер, который декодирует и выходит в нестандартную часть ядра) являются общими при использовании высокопроизводительных инструкций, а не узких мест на конкретном исполнительном устройстве.
Оборудование может быть параллельным. Вы можете xor два 32-битных числа в 1 цикл. Вы можете использовать два 1048576 битовых номера в течение 1 цикла. Просто сожгите еще несколько проводов на чипе. – usr
С помощью современных коротко-векторных SIMD вы используете векторы внутри цикла для обработки целого массива. Старые векторные машины Cray могут настраиваться для большой операции, а затем одна команда будет загружать/управлять/хранить, но это не так, как работают x86 SSE/ARM NEON/PowerPC AltiVec. –