Я пытаюсь ускорить умножение матриц C++ на Android, но реализованные мною SIMD-инструкции кажутся далекими от идеала и не могут превзойти время вычислений наивной реализации (я тестировал это на Samsung S21 и Сяоми Поко Ф1). Я был бы очень признателен, если бы вы указали, что я делаю не так. Спасибо!
Вот минимальные представления моих классов Matrix44f и Vector4f:
class alignas(16) Matrix44f {
public:
Vector4f mRows[4];
};
class alignas(16) Vector4f {
public:
float x, y, z, w;
};
Реализация SIMD:
Matrix44f operator*(const Matrix44f& pM1, const Matrix44f& pM2)
{
Matrix44f matRes;
float32x4_t m2_row0 = vld1q_f32(&pM2.mRows[0][0]);
float32x4_t m2_row1 = vld1q_f32(&pM2.mRows[1][0]);
float32x4_t m2_row2 = vld1q_f32(&pM2.mRows[2][0]);
float32x4_t m2_row3 = vld1q_f32(&pM2.mRows[3][0]);
float32x4_t m1_row, result;
for (int i = 0; i < 4; ++i)
{
m1_row = vld1q_f32(&pM1.mRows[0]);
result = vmulq_n_f32(m2_row0, vgetq_lane_f32(m1_row, 0));
result = vfmaq_n_f32(result, m2_row1, vgetq_lane_f32(m1_row, 1));
result = vfmaq_n_f32(result, m2_row2, vgetq_lane_f32(m1_row, 2));
result = vfmaq_n_f32(result, m2_row3, vgetq_lane_f32(m1_row, 3));
vst1q_f32(&matRes.mRows[0], result);
}
return matRes;
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... oid-with-c
Умножение матриц SIMD 4x4 на Android с помощью C++ ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение