2013-04-01 6 views
2

В helpful but somewhat dated ноября 2006 года статью о векторизации кода с vDSP, автор делает заявление:Использует шаг 1, который по-прежнему критичен для производительности vDSP сегодня?

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

Это все еще актуально сегодня? Даже на новинках Intel процессоров с их более способными векторными свойствами?

Я спрашиваю, потому что я нахожусь в процессе написания некоторых матрицы математических процедур, и только начал идти по пути их всех переключения использовать Fortran -кака столбцов упорядоченности в стремлении быть более легко совместимы с MATLAB, BLAS и LAPACK. Но теперь я нахожу некоторые из моих звонков vDSP необходимости работать над векторами, которые больше не являются смежным ...

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

Мое наиболее часто называемое vDSP рутинное прямо сейчас vDSP_distancesq в случае, которое имеет значение.

ответ

3

Да.

В тех случаях, когда есть веские основания, мы (группа Vector и Numerics от Apple) можем добавлять оптимизации для некоторых других шагов. Например, для нескольких шагов на некоторых моделях процессоров мы будем загружать векторные блоки как обычно, но затем использовать различные команды перестановки для извлечения только любого другого элемента. Это приведет к тому, что код будет не таким быстрым, как код с единичным шагом, но будет быстрее, чем текущий код. Это не часто делается, потому что часто есть другие подходы, которые лучше, например, копирование данных с шагами в блок-шаговый буфер, выполнение нескольких операций vDSP в буфере и копирование данных обратно.

Дело, которое вы описываете, похоже, не является хорошим кандидатом для специализации для безуспешных шагов. Если вы выполняете несколько операций vDSP_distancesq по последовательным столбцам массива, было бы лучше сделать их параллельно (несколько столбцов одновременно) вместо последовательного (все один столбец, затем весь другой столбец ...). Если вы выполняете только отдельные операции vDSP_distancesq в изолированных столбцах, есть и другие проблемы.Операции столбцов на матрицах печально известны для проблем с кешем, особенно если количество байтов на строку кратно значительной мощности двух. Операция может быть связана с нагрузками на память, поэтому запись специализированного кода для оптимизации вычислений может не иметь усиления.

4

Все еще верно. AFAIK (с SSE4.x, и я не думаю, что AVX меняет это). Инструкции по загрузке памяти SSE загружают только смежные блоки.

Вы можете вставить в векторном виде рисунок с шагом 2, хотя требуются некоторые дополнительные операции перетасовки.

Это действительно вопрос об установке в одной строке кеша, чтобы сразу загрузить весь регистр SSE из кеша. (И количество операций с памятью -> кеширование еще более критично для производительности).

Чтобы поддерживать SSE с разбросом по сбору, это не SIMD-инструкции, которые нуждаются в большом обновлении, но кэш и контроллеры памяти.

+0

Я ожидал столько же, но я не хотел отказываться от идеи использования более широко совместимого макета в памяти без предварительного запроса. Спасибо за быстрый ответ! Я думаю, теперь мне нужно выяснить план C ... –

+0

Именно поэтому 'gemm' и' gemv' принимают только массивы с (малым) шагом = 1? Я всегда задавался вопросом, почему этого не хватало для (малого) шага> 1. Я понял удар производительности, но для небольших шагов, например, 2 или 3, это должно быть возможно и все равно что-то получить. – alfC