Итак, у меня есть следующий код, который мне кажется очень простым:
#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 инструкций.
По данным векторизации в компиляторах intel:
Существуют регистры SIMD (одна команда с несколькими данными) длиной 128 байт. так что если sizeof (int) 4
затем 4
целые числа могут сидеть в этих регистрах, и одна команда может выполнять на них 4
int
s. (это также зависит от того, выполняется ли на этих int
с, здесь это правда. Более того, каждый элемент массива в LHS зависит от другого элемента другого массива.)
если есть 8 int
Затем необходимо две инструкции (вместо 8 без векторизации).
но если 5 (или 6 или 7) int
s тогда есть, что также потребует двух инструкций. который might
быть не лучше чем без векторизационного кода.
дальнейшее чтение ССЫЛКА НА САЙТ.
Других решений пока нет …