Мне еще предстоит увидеть, как GCC или Intel C ++ автоматически векторизуют все, кроме очень простых циклов, даже если дан код алгоритмов, которые можно (и были после того, как я переписал их вручную с использованием встроенных функций SSE).
Часть этого является консервативной - особенно когда сталкиваются с возможным наложением указателей, для компилятора C / C ++ может быть очень трудно «доказать» себе, что векторизация будет безопасной, даже если вы, как программист, знаете, что это. Большинство компиляторов (разумно) предпочитают не оптимизировать код, а не рисковать его некомпиляцией. Это одна из областей, где языки более высокого уровня имеют реальное преимущество перед C, по крайней мере, теоретически (я говорю теоретически, поскольку на самом деле я не знаю о каких-либо автоматических векторизациях компиляторов ML или Haskell).
Другая часть этого - просто аналитические ограничения - большинство исследований в векторизации, насколько я понимаю, связано с оптимизацией классических численных задач (скажем, гидродинамики), которые были хлебом и маслом для большинства векторных машин раньше, чем несколько лет назад (когда между CUDA / OpenCL, Altivec / SSE и STI Cell в коммерческих системах стали широко доступны векторные программы в различных формах.
Маловероятно, что вектору, написанному для скалярного процессора, будет легко векторизовать компилятор. К счастью, многие вещи, которые вы можете сделать, чтобы компилятору было легче понять, как его векторизовать, такие как разбиение на циклы и частичное развертывание цикла, также (как правило) помогают повысить производительность на современных процессорах, даже если компилятор не понимает, как векторизовать его.