Компилятор Intel не может векторизовать этот простой цикл?

Итак, у меня есть следующий код, который мне кажется очень простым:

#define MODS_COUNT 5

int start1 = <calc at runtime>;
int start2 = <calc at runtime>;

for (int j=0; j<MODS_COUNT; j++) // loop 5 times doing simple addition.
logModifiers[start1 +  j] += logModsThis[start2 + j];

Этот цикл является частью внешнего цикла (не уверен, если это имеет значение)

Компилятор говорит:
message : loop was not vectorized: vectorization possible but seems inefficient.

Почему этот цикл не может быть векторизован? это кажется очень простым для меня. Как я могу форсировать векторизацию и самостоятельно проверять производительность?

У меня Intel C ++ Compiler 2013, обновление 3.

Полный код здесь, если кому-то интересно: http://pastebin.com/Z6H5ZejW

Изменить: я понимаю, что компилятор решил, что это неэффективно. Я прошу:

Почему это неэффективно?

Как я могу заставить его, чтобы я мог сравнять себя?

Edit2: если я изменю его на 4 вместо 5, он будет векторизован. Что делает 5 неэффективными? Я думал, что это можно сделать в 2 инструкциях, первая делает 4, а вторая «нормальная» делает 1, а не 5 инструкций.

6

Решение

По данным векторизации в компиляторах intel:

Существуют регистры SIMD (одна команда с несколькими данными) длиной 128 байт. так что если sizeof (int) 4 затем 4 целые числа могут сидеть в этих регистрах, и одна команда может выполнять на них 4 ints. (это также зависит от того, выполняется ли на этих intс, здесь это правда. Более того, каждый элемент массива в LHS зависит от другого элемента другого массива.)

если есть 8 intЗатем необходимо две инструкции (вместо 8 без векторизации).

но если 5 (или 6 или 7) ints тогда есть, что также потребует двух инструкций. который might быть не лучше чем без векторизационного кода.

дальнейшее чтение ССЫЛКА НА САЙТ.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]