1 Востаннє редагувалося FakiNyan (24.12.2014 14:17:16)

Тема: SSE, як перемножити матриці?

Хайо.  Є дві квадратні матриці, що кратні 4. Ну і тре їх помножити.
От просто помножити 4 число, я можу, хехе. Але ж матриці множаться не просто так, що одне число на інше число, а ще й там перекручуються, і результати множення додаються, ну таке.
А отой SSE ж робить лишень з 4 числами відразу, ага? Як мені додати ті 4 числа, що сидять в якомусь регістрі, і отримати одне число, котре можна було б занести кудись?
І ще, як занести другу, третю четвірку чисел матриці в інші регістри, ато зараз лишень перша четвірка чисел заноситься.

float m1[SIZE][SIZE], m2[SIZE][SIZE], mr[SIZE][SIZE];

    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            m1[i][j] = rand()%3+1;
            m2[i][j] = rand()%3+1;
        }
    }
__asm {

        movups xmm0, m1
        movups xmm1, m2
        mulps xmm0, xmm1
        movups mr, xmm0
    };
    displayMatrix(m1);
    displayMatrix(m2);
    displayMatrix(mr);

http://puu.sh/dHGRi/882f412092.png

2

Re: SSE, як перемножити матриці?

Якщо зробите самі - викладайте результат, а я обіцяю завтра почаклувати із цим.

3

Re: SSE, як перемножити матриці?

Подивіться, отут порівляльний набір

4

Re: SSE, як перемножити матриці?

Трохи підкажую вам, а ви спробуйте зробити самі:
http://www.stoimen.com/blog/wp-content/uploads/2012/11/3.-Matrix-Multiplication.png
Тобто те, що ви зробили - невірно, бо рядок треба множити на стовпець і всі елементи одержаного вектору скласти.
Найскладніше тут відтранспонувати матрицю в xmm регістрах для кращої продуктивності.
Транспонування матриці:
http://upload.wikimedia.org/wikipedia/commons/e/e4/Matrix_transpose.gif
Я тобі почитати приніс - http://www.gamedev.ru/code/articles/?id=4238&page=5

Подякували: Chemist-i1

5

Re: SSE, як перемножити матриці?

да то срака якась, в мене є чужий той, лаба чужа, якщо не прокатить, то тре буде розбиратись