Учебник для начинающих программирования вектора
Векторное программирование является парадигмой программирования что использование vImage для получения выигрыша в производительности. Это приложение объясняет, как векторное программирование в состоянии достигнуть таких преимуществ по традиционному скалярному программированию.
С программированием вектора на многократные элементы данных (такие как числа) можно управлять как один единый блок – вектор. Вектор может считаться массивом, содержащим несколько элементов, но в отличие от массива от традиционного (или скаляр) программирование, на все элементы вектора можно управлять в единственной инструкции (в противоположность работе на один элемент матрицы за один раз, как в программировании скаляра).
Для лучше понимания значения использования векторов необходимо знать, как скалярный код обрабатывается CPU. Как правило, когда Вы программируете в языке программирования (например, C), компилятор преобразовывает операторы программирования, найденные в Ваших файлах исходного кода к ряду инструкций по сборке, которые может понять CPU. Эти инструкции обычно состоят из добавления, вычитания, или умножения двух чисел вместе и хранения результата где-нибудь в памяти. Рисунок a-1 показывает, как компилятор мог обработать скалярный код.
Как показано на рисунке a-1, для умножения каждого элемента массива на 2 необходимо выполнить итерации через массив и умножить каждый отдельный элемент на 2. Вы видите предложенный ассемблерный код, произведенный в числе вправо. (Примечание: Этот ассемблерный код преднамеренно неточен, чтобы более легко проиллюстрировать это понятие).
Программирование вектора работает так же. Компилятор преобразовывает операторы программирования в ряд инструкций по сборке для выполнения арифметики. Основное различие - то, что данные могут храниться в новом типе данных, названном a vector
. Рисунок a-2 показывает предыдущую работу, но сделанное использование векторизовало код.
При использовании векторизованного кода, для достижения той же цели умножения всех чисел в векторе 2 специальные операторы существуют, которые позволяют Вам делать это в одной единственной инструкции. Этот пример использование vec_mul
как наш оператор векторного умножения. Векторный оператор называет изменение с процессора на процессор. Этот оператор умножает все элементы в векторе, числом (здесь, 2). Это отличается от скалярного примера, выполняющего итерации через массив и умножающего каждое число на 2.
При исследовании ассемблерного кода, произведенного векторной версией, Вы заметите, что конечный результат является тем же, но с менее ассемблерным кодом, чем скалярная версия.
Эта оптимизация может казаться незначительной в этом тривиальном примере, но при считании операций пикселя на пиксель часто используемыми в подпрограммах обработки изображений (и много уровней арифметики включенный), увеличение производительности может быть значительным.
Несмотря на эффективность векторного программирования, на практике может быть трудно реализовать. Кроме привыкания к новым включенным типам данных, необходимо переписать алгоритмы с параллелизмом данных в памяти. Вы также хотите рассмотреть, какие типы векторных процессоров Вы планируете поддерживать, потому что будут наиболее вероятно отличаться код и процесс сборки.
vImage платформа создается поверх подпрограмм программирования вектора для нескольких различной архитектуры, позволяя ему абстрагировать нюансы специфичного для аппаратных средств векторного программирования. Это не только спасает Вас программирующий время, но также и позволяет Вам развертывать программное обеспечение на различных архитектурах системы (включая тех без векторного процессора, таких как архитектура G3) с тем же кодом.