Умножение матриц SIMD 4x4 на Android с помощью C++Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Умножение матриц SIMD 4x4 на Android с помощью C++

Сообщение Anonymous »

Я пытаюсь ускорить умножение матриц 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»