Pull to refresh

Comments 19

UFO just landed and posted this here
Смотрел но не нашел.
Можно конечно составить из нескольких вызовов простых функций но будет явно медленнее. Даже на интринсиках будет медленнее.
> Даже на интринсиках будет медленнее.

Пробовали? Баг зафайлили?
Там использовался GCC, а это совершенно другая история.
Вполне может быть — но потратить время на два варианта я себе позволить не могу. После прочтения статьи решил не рисковать и написал на asm.
UFO just landed and posted this here
Не пробовали автоматическую векторизацию в 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

Latest clang:
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
Для меня разница очевидна между ручным и автоматическим вариантов

Я и не обещал идеального результата. Но ведь просто подобрать нужные опции — это не неделя работы.
К стати, store кусок в автоматическом варианте выглядит более оптимальным
Мой вариант первой функции получается таким

	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] 

Sign up to leave a comment.

Articles

Change theme settings