О vDSP API
vDSP API обеспечивает математические функции для приложений, таких как речь, звук, аудио, и обработка видеоданных, диагностическая медицинская обработка изображений, радарная обработка сигналов, сейсмический анализ и обработка научной информации.
Функции vDSP воздействуют на типы данных real и сложные типы данных. Функции включают преобразования типа данных, быстрые преобразования Фурье (FFTs), и операции вектора к скаляру и от вектора к вектору.
Функции vDSP были реализованы двумя способами: как векторизованный код, использующий векторные инструкции (SSE3, например) в процессоре, и как не делающий скалярный код. vDSP API использует надлежащую версию в зависимости от данных параметров и векторные возможности процессора.
Заголовочный файл vDSP.h
определяет нестандартные типы данных, используемые функциями vDSP и символами, принятыми как параметры флага функциям vDSP. Сам vDSP API является частью vecLib, который поочередно является частью Ускорять платформы в OS X. Таким образом, когда фактически включая заголовок в Вашем коде, необходимо всегда использовать заголовок платформы зонтика (#include <Accelerate/Accelerate.h>
).
Соглашения о вызовах
В этом разделе описываются соглашения о вызовах, используемые с vDSP, функционирует и обсуждает использование шагов адреса.
Передача параметров
Большинство функций vDSP предоставлено входными данными и производит выходные данные. Все такие параметры данных, или вектор или скаляр, передаются ссылкой; т.е. вызывающие стороны передают указатели на ячейки памяти, из которых считаны входные данные и в которые выходные данные записан.
Другие типы аргумента передали функциям vDSP, включайте:
Шаги адреса, говорящие функцию, как продвинуться через данные ввода и вывода. Примеры шага включают каждый элемент, любой элемент, каждый третий элемент, и т.д.
Флаги, влияющие на поведение функции в некотором роде. Примеры включают вперед по сравнению с обратными направленными флагами для дискретных преобразований Фурье.
Количества элемента, говорящие функциям сколько элементов обрабатывать.
Шаги адреса, флаги и количества элемента являются целочисленными значениями и, в отличие от данных ввода и вывода, эти значения передаются функции непосредственно, не ссылкой. Например, вектор умножают команду, vDSP_vmul
, указатели вектора использования, адресуйте шаги и количества элемента:
void vDSP_vmul( |
float *input_1, /* input vector 1 */ |
SInt32 stride_1, /* address stride for input vector 1 */ |
float *input_2, /* input vector 2 */ |
SInt32 stride_2, /* address stride for input vector 2 */ |
float *result, /* output vector */ |
SInt32 strideResult, /* address stride for output vector */ |
UInt32 size /* real output count */ |
); |
Типичный вызов к vDSP_vmul
иллюстрирует, как данные ввода и вывода передаются ссылкой, тогда как шаги адреса, флаги и элемент считают передачу непосредственно:
/* Multiply sequential values of two 1,024-point vectors */ |
float a[1024], b[1024], c[1024]; |
vDSP_vmul( a, 1, b, 1, c, 1, 1024 ); |
Указание шагов адреса
Как отмечалось ранее, шаги адреса говорят функции, как продвинуться через данные ввода и вывода: каждый элемент, каждый второй элемент, каждый третий элемент, и т.д. Хотя обычно положительный, шаги адреса могут быть указаны как отрицательные для большинства функций vDSP. Разработчики должны знать, однако, что отрицательные шаги адреса могут часто изменять арифметическую операцию функции, таким образом, рекомендуется экспериментирование с входными значениями, приводящими к известным результатам.
При работе на действительные векторы шаги адреса 1 адресуют каждый элемент, шаги адреса 2 адресов любой элемент, и т.д. Для некоторых функций адресуйте шаги 1 для результата действительных векторов в превосходящей производительности по шагам немодуля, потому что более длинные шаги требуют, чтобы те функции отступили к использованию скалярного режима инструкции CPU. Использование комплекса разделения приводит к подобным выигрышам в производительности для комплексных векторов.
При работе на комплексные векторы существует два формата для хранения каждого комплексного числа в векторном элементе: комплекс разделения и чередованный комплекс.
С комплексными векторами разделения ( DSPSplitComplex
и DSPDoubleSplitComplex
типы), действительные части элементов в векторе сохранены в одном массиве, и мнимые части сохранены в отдельном массиве. Таким образом, как с действительными массивами, шагом адреса 1 адреса каждый элемент. Большинство функций использует комплексные векторы разделения.
С чередованными комплексными векторами ( DSPComplex
и DSPDoubleComplex
типы), комплексные числа сохранены как упорядоченные пары плавающей точки, или дважды оценивает. Поэтому шаг 2 указан для обработки каждого векторного элемента; шаг 4 указан для обработки любого элемента; и т.д.
Возвращаемые значения
Повторение резюме vDSP_vmul
, строка определения показывает vDSP_vmul
иметь тип void
; т.е. это не обеспечивает возвращаемого значения для вызывающей стороны:
void vDSP_vmul(a, i, b, j, c, k, n) |
Все данные, возвращенные этими функциями, сделаны встроенные посредством перезаписи аргументов Array, в этом случае, параметра c
.
Именование и соглашения типа данных
Функции в vDSP API начинаются с a vDSP_
префикс. В этом пространстве имен vDSP API содержит многократные варианты функций в зависимости от того, используют ли они числа двойной точности или одинарная точность. Эти варианты может отличить их суффикс.
Суффикс | Значение |
---|---|
никакой суффикс | Числа одинарной точности с плавающей точкой использования. |
| Числа с плавающей точкой двойной точности использования |
Например, vDSP_fft2d_zip
и vDSP_fft2d_zipD
функции эквивалентны за исключением того, что прежние работы со значениями одинарной точности и последний со значениями двойной точности, чередованными в едином массиве.
vDSP API основывается на стандарте C целочисленные и типы данных с плавающей точкой. Это определяет четыре дополнительных типа данных для представления векторных элементов:
DSPComplex
— Упорядоченная параfloat
значения, сохраненные как упакованная структура данных. Функции без суффикса могут взять этот тип.DSPDoubleComplex
— Упорядоченная параdouble
значения, сохраненные как упакованная структура данных. Функции с aD
суффикс может взять этот тип.DSPSplitComplex
— Упорядоченная параfloat
значения, сохраненные как пара указателей в массив действительных частей и массив мнимых частей. Функции без суффикса и az
в начале последней части имени обычно берут этот тип.DSPDoubleSplitComplex
— Упорядоченная параdouble
значения, сохраненные как пара указателей в массив действительных частей и массив мнимых частей. Функции с aD
суффикс и az
в начале последней части имени обычно берут этот тип.