LINUX.ORG.RU

Где в шланге проход векторизации

 ,


0

3

upd: да, продуплил, это и правда opt делает. теперь надо рыть код opt'а

Кто-нибудь знает где в этой помойке коде шланга проход векторизации? или это вообще opt делает?

ну например когда читаем из двух массивов по 4 элемента и их перемножаем, чтоб получить

  %1 = bitcast i32* %a to <4 x i32>*
  %2 = load <4 x i32>, <4 x i32>* %1, align 4, !tbaa !1
  %3 = bitcast i32* %b to <4 x i32>*
  %4 = load <4 x i32>, <4 x i32>* %3, align 4, !tbaa !1
  %5 = mul nsw <4 x i32> %4, %2
  %6 = bitcast i32* %a to <4 x i32>*
  store <4 x i32> %5, <4 x i32>* %6, align 4, !tbaa !1

вместо

  %1 = load i32, i32* %a, align 4, !tbaa !1
  %2 = load i32, i32* %b, align 4, !tbaa !1
  %3 = mul nsw i32 %2, %1
  store i32 %3, i32* %a, align 4, !tbaa !1
  %4 = getelementptr inbounds i32, i32* %a, i64 1
  %5 = load i32, i32* %4, align 4, !tbaa !1
  %6 = getelementptr inbounds i32, i32* %b, i64 1
  %7 = load i32, i32* %6, align 4, !tbaa !1
  %8 = mul nsw i32 %7, %5
  store i32 %8, i32* %4, align 4, !tbaa !1
.......

Очень лень спрашивать в рассылке потому что там скорость реакции как у морской черепахи в пустыне. А в коде шланга искать что-либо бесполезно.

cast DELIRIUM, можт ты знаешь

★★★★★

ЕМНИП в древних версиях типа 3.4, или 3.6, это шланг делал. Ща вроде да, в opt. Про рассылку ты зря, обычно отвечают быстро. Банально, например, я бы твой вопрос в рассылке увидел бы раньше, чем тут) ну код шланга на мой взгляд не помойка ни разу, а как раз образец хорошо структурированного и документированного проекта. Сейчас там всвязи с реструктуризацией вкупе с переездом на git, наблюдается некий разброд и шатание, но это временно. А ещё помимо рассылки есть IRC, там после 6 вечера по мск отвечают очень быстро(большинство разработчиков появляются в us business hours).

DELIRIUM ★★★★★ ()
Ответ на: комментарий от DELIRIUM

код шланга на мой взгляд не помойка ни разу, а как раз образец хорошо структурированного и документированного проекта

вот имхо код бэка (самого llvm) - это да, прям идеальная структура для проекта такого размера. а шланг - это треш угар и содомия. там блин разделения архитектур нет от слова совсем. это писец какой-то. файлы по 50 классов на овер 9000 строк.

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

ЕМНИП в древних версиях типа 3.4, или 3.6, это шланг делал. Ща вроде да, в opt

да, это SLP Vectorizer. я просто оттупил как раз потому что в версии 3.8 это шланг делает (системная в бубунте), а в 4.0 (под которую пишу) это вынесли в opt.

А ещё помимо рассылки есть IRC

слуш, а скинь адрес

upcFrost ★★★★★ ()
Последнее исправление: upcFrost (всего исправлений: 2)

на сколько я знаю большая часть всех оптимизаций и трансформации кода занимается LLVM библиотека, а не clang тот же opt просто конфигурит какие оптимизации использовать.

Int64 ★★ ()
Ответ на: комментарий от Int64

это да. но вопрос кто и как ее вызывает. раньше шланг ее дергал сам, да и код был в нем же. теперь ее вынесли в отдельный класс и влили в состав основного LLVM

upcFrost ★★★★★ ()
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от Int64

да я сам оттупил. выше уже отписал почему - код перенесли между 3.8 и 4.0. у меня системная 3.8, а разработка как раз под четвертую ветку. потому сижу и вижу что какая-то фигня когда генерю IR для бэка (собственно пишу-то бэк, в шланге так, название архитектуры и еще по мелочи)

upcFrost ★★★★★ ()
Последнее исправление: upcFrost (всего исправлений: 1)

Вот таблица проходов https://github.com/llvm-mirror/llvm/blob/release_40/lib/Passes/PassRegistry.def

Вот сами проходы векторизации https://github.com/llvm-mirror/llvm/tree/release_40/lib/Transforms/Vectorize

Вот дока по типом векторизации http://llvm.org/docs/Vectorizers.html

Включалась раньше как-то так

#include <llvm/InitializePasses.h>
#include <llvm/PassRegistry.h>

llvm::PassRegistry &registry = *llvm::PassRegistry::getPassRegistry();

llvm::initializeVectorization(registry);

сейчас, насколько я понял, шланг включает его через PassBuilder http://llvm.org/doxygen/PassBuilder_8cpp_source.html

в

PassBuilder::buildModuleOptimizationPipeline

это предположение идёт отсюда https://clang.llvm.org/doxygen/BackendUtil_8cpp_source.html

EmitAssemblyHelper::EmitAssemblyWithNewPassManager
anonymous ()