Комментарии 19
НЛО прилетело и опубликовало эту надпись здесь
Смотрел но не нашел.
Можно конечно составить из нескольких вызовов простых функций но будет явно медленнее. Даже на интринсиках будет медленнее.
Можно конечно составить из нескольких вызовов простых функций но будет явно медленнее. Даже на интринсиках будет медленнее.
> Даже на интринсиках будет медленнее.
Пробовали? Баг зафайлили?
Пробовали? Баг зафайлили?
Были мысли, но после прочтения пропали
НЛО прилетело и опубликовало эту надпись здесь
Не пробовали автоматическую векторизацию в clang? (Или её ещё нет в Apple clang?..)
Ее там нет.
В clang есть векторизация базовых блоков, что вместе с loop unrolling даёт нужный эффект. А вот есть ли она в Apple clang — это другой вопрос.
Хмммм. Странно, что Neon есть, а компилятор для него не осилили. А если пару модулей прогнать gcc (в т.ч. до ассемблерного, а не объектного кода), а остальное родным компилятором? По-крайней мере, это могло бы занять заметно меньше недели.
Идея интересная — попробую.
Попробовал — вот исходный код для тестов
Вот результат — как то не уверен — совсем по другому
Вижуал студия 2008 для x86 смогла векторизировать — но про качество ничего не скажу
Командная строка:
arm-none-eabi-gcc.exe -O3 -S -mfloat-abi=softfp -ftree-vectorizer-verbose=4 -mfpu=neon -funsafe-math-optimizations -ftree-vectorize -c BaseRenderScene_Math2.cpp
Вот результат — как то не уверен — совсем по другому
Вижуал студия 2008 для x86 смогла векторизировать — но про качество ничего не скажу
Командная строка:
arm-none-eabi-gcc.exe -O3 -S -mfloat-abi=softfp -ftree-vectorizer-verbose=4 -mfpu=neon -funsafe-math-optimizations -ftree-vectorize -c BaseRenderScene_Math2.cpp
Latest clang:
pastebin.com/U2eEhcjY
Только первая функция (достаточно чтобы увидеть результат). Изменения исходного кода — добавил квалификатор restrict:
Команды:
pastebin.com/U2eEhcjY
Только первая функция (достаточно чтобы увидеть результат). Изменения исходного кода — добавил квалификатор restrict:
void transformPointNormal4x3Weight_NoW(const Matrix44f * __restrict__ pmat, const Vec4f * __restrict__ pVerticiesNormals, PN *__restrict__ poutPN)
{
const Matrix44f& mat = *pmat;
PN &outPN = *poutPN;
Команды:
./Release/bin/clang -cc1 -triple armv7-apple-darwin9 -target-abi aapcs -emit-llvm -O3 /tmp/aaa.cc
./Release/bin/opt -O3 -tbaa -vectorize -bb-vectorize -bb-vectorize-req-chain-depth=3 /tmp/aaa.ll -S | ./Release/bin/llc -O3
Для меня разница очевидна между ручным и автоматическим вариантов
Мой вариант первой функции получается таким
vldmia r1, { q2 - q3 }
vldmia r0, { q8-q11 }
vmul.f32 q0, q8, d4[0]
vmla.f32 q0, q9, d4[1]
vmla.f32 q0, q10, d5[0]
vmla.f32 q0, q11, d5[1]
vmul.f32 q1, q8, d6[0]
vmla.f32 q1, q9, d6[1]
vmla.f32 q1, q10, d7[0]
fsts s0,[r2]
fsts s1,[r2,#4]
fsts s2,[r2,#8]
fsts s4,[r2,#12]
fsts s5,[r2,#16]
fsts s6,[r2,#20]
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
ARM NEON скининг