Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct vector
- {
- float a,b,c,d;
- }vector;
- float wyznacznik(vector matrix1, vector matrix2, vector matrix3, vector matrix4, vector vecOne)
- {
- vector wynik, wynik2;
- // I II
- // +-------------+ +-------------+
- // detM1 = |(a0*b1-a1*b0)|*|(c2*d3-c3*d2)| +
- // |(a2*b0-a0*b2)|*|(c1*d3-c3*d1)| +
- // |(a0*b3-a3*b0)|*|(c1*d2-c2*d1)| +
- // |(a1*b2-a2*b1)|*|(c0*d3-c3*d0)| +
- // +-------------+ +-------------+
- // III IV
- // +-------------+ +-------------+
- // |(a2*b3-a3*b2)|*|(c0*d1-c1*d0)| +
- // |(a3*b1-a1*b3)|*|(c0*d2-c2*d0)|
- // (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
- // (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
- asm(
- // obliczenie A' * B'
- "movups %1, %%xmm0;"
- "movups %2, %%xmm1;"
- "shufps $0x48, %%xmm0, %%xmm0;"
- "shufps $0xb1, %%xmm1, %%xmm1;"
- "mulps %%xmm1, %%xmm0;"
- //obliczenie A" * B":
- "movups %1, %%xmm1;"
- "movups %2, %%xmm2;"
- "shufps $0xb1, %%xmm1, %%xmm1;"
- "shufps $0x48, %%xmm2, %%xmm2;"
- "mulps %%xmm2, %%xmm1;"
- // obliczenie (A' * B') - (A" * B")
- "subps %%xmm1, %%xmm0;"
- //obliczenie C' * D'
- "movups %3, %%xmm1;"
- "movups %4, %%xmm2;"
- "shufps $0x16, %%xmm1, %%xmm1;"
- "shufps $0xef, %%xmm2, %%xmm2;"
- "mulps %%xmm2, %%xmm1;"
- // obliczenie C" * D"
- "movups %3, %%xmm2;"
- "movups %4, %%xmm3;"
- "shufps $0xef, %%xmm2, %%xmm2;"
- "shufps $0x16, %%xmm3, %%xmm3;"
- "mulps %%xmm3, %%xmm2;"
- // obliczenie (C' * D') - (C" * D")
- "subps %%xmm2, %%xmm1;" //wynik w xmm1
- // obliczenie((A' * B') - (A" * B")) * ((C' * D') - (C" * D")) i wyprowadzenie wyniku do zmiennej wynik
- "mulps %%xmm1, %%xmm0;"
- "movups %%xmm0, %0;"
- :"=g"(wynik)
- :"g"(matrix1),"g"(matrix2),"g"(matrix3),"g"(matrix4) //a b c d
- );
- // wstawienie zer w odpowiednie miejsca macierzy
- matrix1.a = 0;
- matrix2.a = 0;
- matrix3.d = 0;
- matrix4.d = 0;
- // printf("to ja\n");
- // printf(" | %.0f %.0f %.0f %.0f | \n", matrix1.a, matrix1.b, matrix1.c, matrix1.d);
- // printf(" | %.0f %.0f %.0f %.0f | \n", matrix2.a, matrix2.b, matrix2.c, matrix2.d);
- // printf(" | %.0f %.0f %.0f %.0f | \n", matrix3.a, matrix3.b, matrix3.c, matrix3.d);
- // printf(" | %.0f %.0f %.0f %.0f | \n", matrix4.a, matrix4.b, matrix4.c, matrix4.d);
- // Te same operacje ale z zastosowaniem mask takich aby w odpowiednich miejscach były zera
- // III IV
- // +-------------+ +-------------+
- // |(a2*b3-a3*b2)|*|(c0*d1-c1*d0)| +
- // |(a3*b1-a1*b3)|*|(c0*d2-c2*d0)|
- // (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
- // (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
- // w miejsach gdzie są zera ważne jest by była ta sama zmienna wtedy nawet jesli tam wypełnimy czyms innym to i tak będzie zero
- asm(
- "movups %1, %%xmm0;"
- "movups %2, %%xmm1;"
- "shufps $0x0e, %%xmm0, %%xmm0;"
- "shufps $0x07, %%xmm1, %%xmm1;"
- "mulps %%xmm1, %%xmm0;"
- "movups %1, %%xmm1;"
- "movups %2, %%xmm2;"
- "shufps $0x07, %%xmm1, %%xmm1;"
- "shufps $0x0e, %%xmm2, %%xmm2;"
- "mulps %%xmm2, %%xmm1;"
- "subps %%xmm1, %%xmm0;"
- "movups %3, %%xmm1;"
- "movups %4, %%xmm2;"
- "shufps $0xf0, %%xmm1, %%xmm1;"
- "shufps $0xf9, %%xmm2, %%xmm2;"
- "mulps %%xmm2, %%xmm1;"
- "movups %3, %%xmm2;"
- "movups %4, %%xmm3;"
- "shufps $0xf9, %%xmm2, %%xmm2;"
- "shufps $0xf0, %%xmm3, %%xmm3;"
- "mulps %%xmm3, %%xmm2;"
- "subps %%xmm2, %%xmm1;"
- "mulps %%xmm1, %%xmm0;"
- "movups %%xmm0, %0;"
- :"=g"(wynik2)
- :"g"(matrix1),"g"(matrix2),"g"(matrix3),"g"(matrix4) //a b c d
- );
- return wynik.a + wynik.b + wynik.c + wynik.d + wynik2.a + wynik2.b + wynik2.c + wynik2.d;
- };
- int main()
- {
- vector macierz[5];
- float dane [4][4] = {{3, 1, 2, 1},
- {2, 4, 2, 7},
- {2, 5, 3, 7},
- {2, 4, 4, 6}};
- printf("\n\n");
- for(int i=0; i<4; i++)
- {
- macierz[i].a = dane[i][0];
- macierz[i].b = dane[i][1];
- macierz[i].c = dane[i][2];
- macierz[i].d = dane[i][3];
- printf(" | %.0f %.0f %.0f %.0f | \n", macierz[i].a, macierz[i].b, macierz[i].c, macierz[i].d);
- }
- macierz[4].a = 0;
- macierz[4].b = 0;
- macierz[4].c = 0;
- macierz[4].d = 0;
- float det = wyznacznik(macierz[0],macierz[1],macierz[2],macierz[3], macierz[4]);
- printf("\n\n det|M| = %.3f \n\n",det);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement