Я запрограммировал подпрограмму для обработки одиночных массивов с плавающей запятой с использованием Neon на платформе Android, в частности Samsung S4, и обнаружил, что мои подпрограммы Neon ограничены доступом к данным массива. Ради интереса, фрагмент ниже:
Неон
m1 = vmulq_f32(*(float32x4_t *)&ey[i][j],*(float32x4_t *)&caey[i][j]);
m2 = vsubq_f32(*(float32x4_t *)&hz[i-1][j],*(float32x4_t *)&hz[i][j]);
m3 = vmulq_f32(*(float32x4_t *)&cbey[i][j],m2);
m4 = vaddq_f32(m1,m3);
vst1q_f32(&ey[i*je+j],m4);
Серийный
ey[i][j] = caey[i][j] * ey[i][j] + cbey[i][j] * ( hz[i-1][j] - hz[i][j] );
Построен на телефоне Android с использованием C4droid gcc, а также AIDE-JNI. Приведенный выше встроенный код Neon требует немного больше времени для обработки, чем последовательный эквивалент. При замене данных массива фиктивными константами с плавающей запятой код работает почти в 4 раза быстрее, чем последовательный код с данными массива, хотя, конечно, это приведет к бессмысленным результатам (это подтверждает, что проблема производительности связана с доступом к данным). Мой эквивалентный код SSE и AVX на других платформах обеспечивает хорошее ускорение.
Я пробовал эквивалентные массивы 1D и предварительную выборку данных с помощью __builtin_prefetch , но не могу ускорить доступ к данным для встроенных функций Neon.
Есть ли что-нибудь еще, что я могу попробовать улучшить производительность доступа к данным на телефоне Android?
i
иj
, выравнивание строки кэша и т. д.), немного сложно сказать. Разборку цикла NEON тоже стоит посмотреть, просто чтобы убедиться, что компилятор не делает ничего особенно глупого. Однако, поскольку вы фактически ничего не делаете, кроме доступа к памяти (сами вычисления довольно тривиальны), возможно, вы уже насыщаете полосу пропускания L2 благодаря автоматической предварительной выборке, и в этом случае вам некуда деваться. - person Notlikethat   schedule 15.12.2014pld
заполнит строки кэша. Ваш размер/геометрия линии L1/L2 и скорость DDR будут иметь значение. Вам нужно выполнить предварительную выборку каждого из пяти элементов, и кажется, что предыдущий массивhz
уже может быть в вашем кеше. Вы также можете попробовать-ffast-math
, так как я думаю, что плавающая точка ARM не на 100% совместима с IEEE, и компилятор часто будет вставлять некоторые педантичные проверки; но действительно нужно смотреть на ассемблере. Связано: Неоновый поплавок. - person artless noise   schedule 15.12.2014-ffast-math
. - person artless noise   schedule 15.12.2014