Как анализатор SLP решает, что следует оценивать его моделью затрат? - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над оптимизацией нового прохода для LLVM IR, и это зависит от того, как работает векторизатор SLP.

https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp.

Я знаю, что SLP имеет несколько шагов, прежде чем векторизовать кодсам.Он собирает начальные числа кандидатов (инструкции хранилища), он строит дерево, формирующее супер узлы с этими кандидатами из инструкций хранилища, пока не достигнет инструкций загрузки или значений const.После этого он пересекает дерево, используя функцию costModel, накапливая стоимость векторизации каждого суперузла.К концу, если стоимость отрицательна, код векторизован.

Итак, у меня есть два примера игрушек:

Кулак легко векторизован:

a[i]   = b[i]  *c[i]   + a[i];
a[i+1] = b[i+1]*c[i+1] + a[i+1];
a[i+2] = b[i+2]*c[i+2] + a[i+2];
a[i+3] = b[i+3]*c[i+3] + a[i+3];

во-вторых, нет:

a[i]   = b[i]  *c[i]   + a[i-1];
a[i+1] = b[i+1]*c[i+1] + a[i];
a[i+2] = b[i+2]*c[i+2] + a[i+1];
a[i+3] = b[i+3]*c[i+3] + a[i+2];

Я понимаю, почему второй код не является векторизованным, но я не могу понять, как SLP проверяет его.Я выполнил некоторую отладку, и это не модель затратЭти инструкции не идут в дерево.

К сожалению, понимание такого рода кода все еще выходит за рамки моих возможностей и плохо документировано, поэтому мне нужна помощь кого-то, кто лучше знает, как работает инфракрасная инфраструктура LLVM.

Спасибо

...