Неон на Android ограничен доступом к памяти?
Я запрограммировал подпрограмму для обработки одиночных массивов с плавающей запятой с использованием 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?