Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.39 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct vector
  5. {
  6.     float a,b,c,d;
  7. }vector;
  8.  
  9.  
  10. float wyznacznik(vector matrix1, vector matrix2, vector matrix3, vector matrix4, vector vecOne)
  11. {
  12.     vector wynik, wynik2;
  13.  
  14.  
  15.  
  16. //               I               II
  17. //         +-------------+ +-------------+
  18. // detM1 = |(a0*b1-a1*b0)|*|(c2*d3-c3*d2)| +
  19. //         |(a2*b0-a0*b2)|*|(c1*d3-c3*d1)| +  
  20. //         |(a0*b3-a3*b0)|*|(c1*d2-c2*d1)| +
  21. //         |(a1*b2-a2*b1)|*|(c0*d3-c3*d0)| +
  22. //         +-------------+ +-------------+
  23. //               III              IV
  24. //         +-------------+ +-------------+
  25. //         |(a2*b3-a3*b2)|*|(c0*d1-c1*d0)| +
  26. //         |(a3*b1-a1*b3)|*|(c0*d2-c2*d0)|
  27. //          (0* 0 - 0 *0 )* (0 * 0 - 0* 0)                  
  28. //          (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
  29.  
  30.  
  31.     asm(
  32.  
  33. // obliczenie A' * B'
  34.  
  35.         "movups %1, %%xmm0;"
  36.         "movups %2, %%xmm1;"
  37.         "shufps $0x48, %%xmm0, %%xmm0;"
  38.         "shufps $0xb1, %%xmm1, %%xmm1;"
  39.         "mulps %%xmm1, %%xmm0;"
  40.  
  41. //obliczenie A" * B":
  42.  
  43.         "movups %1, %%xmm1;"
  44.         "movups %2, %%xmm2;"
  45.         "shufps $0xb1, %%xmm1, %%xmm1;"
  46.         "shufps $0x48, %%xmm2, %%xmm2;"
  47.         "mulps %%xmm2, %%xmm1;"
  48.  
  49. // obliczenie (A' * B') - (A" * B")
  50.  
  51.         "subps %%xmm1, %%xmm0;"
  52.  
  53. //obliczenie C' * D'
  54.  
  55.         "movups %3, %%xmm1;"
  56.         "movups %4, %%xmm2;"
  57.         "shufps $0x16, %%xmm1, %%xmm1;"
  58.         "shufps $0xef, %%xmm2, %%xmm2;"
  59.         "mulps %%xmm2, %%xmm1;"
  60.  
  61. // obliczenie C" * D"
  62.  
  63.         "movups %3, %%xmm2;"
  64.         "movups %4, %%xmm3;"
  65.         "shufps $0xef, %%xmm2, %%xmm2;"
  66.         "shufps $0x16, %%xmm3, %%xmm3;"
  67.         "mulps %%xmm3, %%xmm2;"
  68.  
  69. // obliczenie (C' * D') - (C" * D")
  70.         "subps %%xmm2, %%xmm1;" //wynik w xmm1
  71.  
  72. //  obliczenie((A' * B') - (A" * B")) * ((C' * D') - (C" * D")) i wyprowadzenie wyniku do zmiennej wynik
  73.         "mulps %%xmm1, %%xmm0;"
  74.         "movups %%xmm0, %0;"
  75.  
  76.     :"=g"(wynik)
  77.     :"g"(matrix1),"g"(matrix2),"g"(matrix3),"g"(matrix4) //a b c d
  78.     );
  79.  
  80.  
  81. // wstawienie zer w odpowiednie miejsca macierzy
  82.     matrix1.a = 0;
  83.     matrix2.a = 0;
  84.     matrix3.d = 0;
  85.     matrix4.d = 0;
  86.  
  87.     // printf("to ja\n");
  88.     // printf("    | %.0f %.0f %.0f %.0f | \n", matrix1.a, matrix1.b, matrix1.c, matrix1.d);
  89.     // printf("    | %.0f %.0f %.0f %.0f | \n", matrix2.a, matrix2.b, matrix2.c, matrix2.d);
  90.     // printf("    | %.0f %.0f %.0f %.0f | \n", matrix3.a, matrix3.b, matrix3.c, matrix3.d);
  91.     // printf("    | %.0f %.0f %.0f %.0f | \n", matrix4.a, matrix4.b, matrix4.c, matrix4.d);
  92.  
  93. // Te same operacje ale z zastosowaniem mask takich aby w odpowiednich miejscach były zera
  94. //               III              IV
  95. //         +-------------+ +-------------+
  96. //         |(a2*b3-a3*b2)|*|(c0*d1-c1*d0)| +
  97. //         |(a3*b1-a1*b3)|*|(c0*d2-c2*d0)|
  98. //          (0* 0 - 0 *0 )* (0 * 0 - 0* 0)                  
  99. //          (0* 0 - 0 *0 )* (0 * 0 - 0* 0)
  100. // 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
  101.     asm(
  102.    
  103.         "movups %1, %%xmm0;"
  104.         "movups %2, %%xmm1;"
  105.         "shufps $0x0e, %%xmm0, %%xmm0;"
  106.         "shufps $0x07, %%xmm1, %%xmm1;"
  107.         "mulps %%xmm1, %%xmm0;"
  108.  
  109.         "movups %1, %%xmm1;"
  110.         "movups %2, %%xmm2;"
  111.         "shufps $0x07, %%xmm1, %%xmm1;"
  112.         "shufps $0x0e, %%xmm2, %%xmm2;"
  113.         "mulps %%xmm2, %%xmm1;"
  114.  
  115.         "subps %%xmm1, %%xmm0;"
  116.  
  117.         "movups %3, %%xmm1;"
  118.         "movups %4, %%xmm2;"
  119.         "shufps $0xf0, %%xmm1, %%xmm1;"
  120.         "shufps $0xf9, %%xmm2, %%xmm2;"
  121.         "mulps %%xmm2, %%xmm1;"
  122.  
  123.         "movups %3, %%xmm2;"
  124.         "movups %4, %%xmm3;"
  125.         "shufps $0xf9, %%xmm2, %%xmm2;"
  126.         "shufps $0xf0, %%xmm3, %%xmm3;"
  127.         "mulps %%xmm3, %%xmm2;"
  128.  
  129.  
  130.  
  131.         "subps %%xmm2, %%xmm1;"
  132.         "mulps %%xmm1, %%xmm0;"
  133.    
  134.         "movups %%xmm0, %0;"
  135.  
  136.     :"=g"(wynik2)
  137.     :"g"(matrix1),"g"(matrix2),"g"(matrix3),"g"(matrix4) //a b c d
  138.     );
  139.    
  140.  
  141.     return wynik.a + wynik.b + wynik.c + wynik.d + wynik2.a + wynik2.b + wynik2.c + wynik2.d;
  142. };
  143.  
  144.  
  145. int main()
  146. {
  147.     vector macierz[5];
  148.  
  149.     float dane [4][4] = {{3, 1, 2, 1},
  150.                    {2, 4, 2, 7},
  151.                    {2, 5, 3, 7},
  152.                    {2, 4, 4, 6}};
  153.     printf("\n\n");
  154.  
  155.     for(int i=0; i<4; i++)
  156.     {
  157.         macierz[i].a = dane[i][0];
  158.         macierz[i].b = dane[i][1];
  159.         macierz[i].c = dane[i][2];
  160.         macierz[i].d = dane[i][3];
  161.  
  162.         printf("    | %.0f %.0f %.0f %.0f | \n", macierz[i].a, macierz[i].b, macierz[i].c, macierz[i].d);
  163.     }
  164.  
  165.     macierz[4].a = 0;
  166.     macierz[4].b = 0;
  167.     macierz[4].c = 0;
  168.     macierz[4].d = 0;
  169.    
  170.     float det = wyznacznik(macierz[0],macierz[1],macierz[2],macierz[3], macierz[4]);
  171.  
  172.     printf("\n\n   det|M| = %.3f \n\n",det);
  173.  
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement