Здравствуйте, Sinclair, Вы писали:
V>>Но этого мало, надо смотреть, как код бегает по данным, т.е. возможна ли векторизация в том обходе памяти принципиально?
S>Возможна. Дотнет же её применяет
Это если дотнетный алгоритм ходит по данным точно так же...
V>>Потому что комплятор зачастую никакой векторизации не делает ввиду её невозможности согласно алгоритма, даже если компилит использование более широкого файла MMX/YMM-регистров... использование файла этих регистров не есть векторизация.
S>А что, по-вашему, векторизация?
Почему
по моему?
Соотв., векторизация — это использование векторных команд, например из семейства PCLMUL.
Не обязательно это делать ручками, для Си есть либы для векторных вычислений, вот парочка популярных вхождений АПИ:
https://software.intel.com/content/www/us/en/develop/documentation/mkl-developer-reference-c/top/blas-and-sparse-blas-routines/blas-routines/blas-level-1-routines-and-functions/cblas-axpy.html#cblas-axpy
https://software.intel.com/content/www/us/en/develop/documentation/mkl-developer-reference-c/top/blas-and-sparse-blas-routines/blas-routines/blas-level-1-routines-and-functions/cblas-dot.html#cblas-dot
Ну и рядом там.
Т.е., в чём тут фишка... Иногда под векторные операции выгодно выделять доп. промежуточную память, например, если эта выделенная память позволит применять векторные инструкции по прямому назначению.
Т.е., порой быстрее будет не поэлементно делать все вычисления, а за раз сделать один тип вычислений над массивом данных, затем другой тип вычислений над промежуточным результатом и т.д., т.е. от поэлементных вычислений уходить в матричные/векторные.
Понятно, что если размеры векторов/матриц слишком большие, то начинает сказываться эффект охлаждения кеша, поэтому, в реальности граница подбирается экспериментально, т.е. большое изображение может быть обработано участками.