1) Технически hayesti уже ответил на ваш вопрос (вкладыши/hoirzontal инструкции на SSE/AVX из vgather на AVX2 сделает это возможным). Но обратите внимание также, что как GCC4.9, так и ICC будут векторизовать данный фрагмент кода (поэтому нет необходимости в intrinsics/hand-encoding для реального произвольного доступа), хотя для GCC вам, вероятно, понадобится #pragma omp simd, и вам также может понадобиться -vec-threshold0 для ICC на машинах SSE.
2) Практически, если у вас есть векторизовать данный код «как есть», он никогда не будет очень хорошая скорость вверх, потому что вам нужно «ammortize» большие накладные расходы (латентность) из vgather или vinsert -s с достаточным векторным вычислением (которого у вас нет в вашем примере) для векторизации «прибыльный». И не нужно говорить, что вам также понадобятся соответствующие подсчеты цикла и т. Д.
Я только что проверил оценку статической стоимости модели для векторизованной версии вашего кода, используя один из выводов report (или «Intel Vectorization Advisor») ICC.
- Для SSE генерации кода это было: 0.5x (т.е. замедление)
- Для AVX генерации кода это было: 1.1x скорость вверх (как верхняя граница)
- Для AVX2 генерация кода это было: 1.3x - 1.4x ускорение (как верхняя граница).
Итак, помните, что все эти скоростные окна являются оптимистические верхние границы, предоставляемые очень хороший оптимизирующий компилятор (я не знаю, если GCC будет лучше или хуже). В зависимости от ваших макетов индексов, размера матрицы и общего баланса латентности, а также некоторых других причин - вы часто будете ниже, чем 1.4x, даже для AVX2, вряд ли ожидая значительных ускорений. Чтобы сделать такой шаблон доступа действительно прибыльным, вам нужны дополнительные (векторизованные) вычисления с X [k] в теле цикла, чтобы амортизировать накладные расходы (в отличие от простого копирования данных из одного места в другое).
В то же время есть хорошие новости. Для краткосрочного будущего AVX-512 машины (KNL Xeon Phi, некоторые будущие Xeon) производительность vgather, скорее всего, изменится/улучшится, так что даже простая копия данных может дать дополнительные ускорения, но в любом случае это не то, что вы будете наблюдать на сегодняшних машинах AVX/AVX2.
Очень последнее примечание: если вы имеете дело с разреженной матрицей (и именно поэтому вы рассказываете о данных косвенных ссылках), то, возможно, вы можете подумать о формате хранения сжатых строк с разреженной информацией и, как результат, в разных компромиссов SIMD, хотя это слишком далеко от первоначального вопроса.
Возможно, нет, но это зависит от типа X и значений M и N (это может быть просто возможно для небольших значений M, N). –
Я не совсем понимаю, как имеет смысл перебирать как размеры x, так и y сразу, но, возможно, вы решаете какую-то искусственную математическую проблему. – Lundin
Какой набор векторных инструкций? – harold