Как стать автором
Обновить

Комментарии 19

НЛО прилетело и опубликовало эту надпись здесь
Смотрел но не нашел.
Можно конечно составить из нескольких вызовов простых функций но будет явно медленнее. Даже на интринсиках будет медленнее.
> Даже на интринсиках будет медленнее.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории