Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #define sizeTable 2048
- #define repeatNumber 100
- //
- clock_t startTime = 0;
- clock_t start = 0;
- clock_t end = 0;
- struct vector
- {
- float a;
- float b;
- float c;
- float d;
- };
- struct vector a[sizeTable];
- struct vector b[sizeTable];
- struct vector sum[sizeTable];
- struct vector sub[sizeTable];
- struct vector mul[sizeTable];
- struct vector div_res[sizeTable];
- //SIMD------------------
- void sum_simd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "movaps %1, %%xmm0\n\t"
- "movaps %2, %%xmm1\n\t"
- "addps %%xmm1, %%xmm0\n\t"
- "movaps %%xmm0, %0\n\t"
- : "=m" (*wynik)
- : "m" (a),"m" (b)
- );
- }
- void sub_simd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "movaps %1, %%xmm0\n\t"
- "movaps %2, %%xmm1\n\t"
- "subps %%xmm1, %%xmm0\n\t"
- "movaps %%xmm0, %0\n\t"
- : "=m" (*wynik)
- : "m" (a),"m" (b)
- );
- }
- void div_simd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "movaps %1, %%xmm0\n\t"
- "movaps %2, %%xmm1\n\t"
- "divps %%xmm1, %%xmm0\n\t"
- "movaps %%xmm0, %0\n\t"
- : "=m" (*wynik)
- : "m" (a),"m" (b)
- );
- }
- void mul_simd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "movaps %1, %%xmm0\n\t"
- "movaps %2, %%xmm1\n\t"
- "mulps %%xmm1, %%xmm0\n\t"
- "movaps %%xmm0, %0\n\t"
- : "=m" (*wynik)
- : "m" (a),"m" (b)
- );
- }
- //SISD-------------------------------------------------
- void sum_sisd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "fld %4\n\t" //wrzuc a.a na stos FPU
- "fadd %8\n\t" //dodaj b.a do st0
- "fstp %0\n\t" //przenies st0 do wynik->1
- "fld %5\n\t"
- "fadd %9\n\t"
- "fstp %1\n\t"
- "fld %6\n\t"
- "fadd %10\n\t"
- "fstp %2\n\t"
- "fld %7\n\t"
- "fadd %11\n\t"
- "fstp %3\n\t"
- : "=m" (wynik->a), //0
- "=m" (wynik->b), //1
- "=m" (wynik->c), //2
- "=m" (wynik->d) //3
- : "m" (a.a), //4
- "m" (a.b), //5
- "m" (a.c), //6
- "m" (a.d), //7
- "m" (b.a), //8
- "m" (b.b), //9
- "m" (b.c), //10
- "m" (b.d) //11
- );
- }
- void sub_sisd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "fld %4\n\t"
- "fsub %8 \n\t"
- "fstp %0\n\t"
- "fld %5\n\t"
- "fsub %9\n\t"
- "fstp %1\n\t"
- "fld %6\n\t"
- "fsub %10\n\t"
- "fstp %2\n\t"
- "fld %7\n\t"
- "fsub %11\n\t"
- "fstp %3\n\t"
- : "=m" (wynik->a), //0
- "=m" (wynik->b), //1
- "=m" (wynik->c), //2
- "=m" (wynik->d) //3
- : "m" (a.a), //4
- "m" (a.b), //5
- "m" (a.c), //6
- "m" (a.d), //7
- "m" (b.a), //8
- "m" (b.b), //9
- "m" (b.c), //10
- "m" (b.d) //11
- );
- }
- void mul_sisd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "fld %4\n\t"
- "fmul %8 \n\t"
- "fstp %0\n\t"
- "fld %5\n\t"
- "fmul %9\n\t"
- "fstp %1\n\t"
- "fld %6\n\t"
- "fmul %10\n\t"
- "fstp %2\n\t"
- "fld %7\n\t"
- "fmul %11\n\t"
- "fstp %3\n\t"
- : "=m" (wynik->a), //0
- "=m" (wynik->b), //1
- "=m" (wynik->c), //2
- "=m" (wynik->d) //3
- : "m" (a.a), //4
- "m" (a.b), //5
- "m" (a.c), //6
- "m" (a.d), //7
- "m" (b.a), //8
- "m" (b.b), //9
- "m" (b.c), //10
- "m" (b.d) //11
- );
- }
- void div_sisd(struct vector a, struct vector b, struct vector * wynik){
- asm(
- "fld %4\n\t"
- "fdiv %8 \n\t"
- "fstp %0\n\t"
- "fld %5\n\t"
- "fdiv %9\n\t"
- "fstp %1\n\t"
- "fld %6\n\t"
- "fdiv %10\n\t"
- "fstp %2\n\t"
- "fld %7\n\t"
- "fdiv %11\n\t"
- "fstp %3\n\t"
- : "=m" (wynik->a), //0
- "=m" (wynik->b), //1
- "=m" (wynik->c), //2
- "=m" (wynik->d) //3
- : "m" (a.a), //4
- "m" (a.b), //5
- "m" (a.c), //6
- "m" (a.d), //7
- "m" (b.a), //8
- "m" (b.b), //9
- "m" (b.c), //10
- "m" (b.d) //11
- );
- }
- void SISD(){
- double timeSum = 0,timeSub = 0,timeMul = 0,timeDiv = 0;
- int j, i;
- //usrednianie wyniku----------
- for(j = 0;j<repeatNumber;j++){
- //dodawanie-----------
- for(i = 0;i<sizeTable;i++){
- startTime = clock();
- sum_sisd(a[i],b[i],&sum[i]);
- timeSum += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
- }
- //odjemowanie---------
- for( i = 0;i<sizeTable;i++){
- startTime = clock();
- sub_sisd(a[i],b[i],&sub[i]);
- timeSub += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
- }
- //mnozenie-------------
- for(i = 0;i<sizeTable;i++){
- startTime = clock();
- mul_sisd(a[i],b[i],&mul[i]);
- timeMul += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
- }
- //dzielnie------------
- for(i = 0;i<sizeTable;i++){
- startTime = clock();
- div_sisd(a[i],b[i],&div_res[i]);
- timeDiv += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
- }
- }
- timeSum = timeSum/(float)(repeatNumber*sizeTable);
- timeDiv = timeDiv/(float)(repeatNumber*sizeTable);
- timeMul = timeMul/(float)(repeatNumber*sizeTable);
- timeSub = timeSub/(float)(repeatNumber*sizeTable);
- printf("Liczba liczb: %d\nSredni czas [ms]: \n+ %lf \n- %lf \n* %lf \n/ %lf \n",(4*sizeTable),timeSum,timeSub,timeMul,timeDiv);
- }
- //generator-------------------------------------------------
- void randomGenerator()
- {
- int i=0;
- for ( i; i < sizeTable;i++){
- a[i].a = (float)(rand()%1000000)/100.0f;
- a[i].b = (float)(rand()%1000000)/100.0f;
- a[i].c = (float)(rand()%1000000)/100.0f;
- a[i].d = (float)(rand()%1000000)/100.0f;
- b[i].a = (float)(rand()%1000000)/100.0f;
- b[i].b = (float)(rand()%1000000)/100.0f;
- b[i].c = (float)(rand()%1000000)/100.0f;
- b[i].d = (float)(rand()%1000000)/100.0f;
- }
- }
- //SIMD_cout---------------------------------------------------
- void SIMD_test(){
- double timeSum = 0,timeSub = 0,timeMul = 0,timeDiv = 0;
- int j, i;
- for (j = 0;j<repeatNumber;j++){
- //dodawanie
- for (i = 0;i<sizeTable;i++){
- start=clock();
- sum_simd(a[i],b[i],&sum[i]);
- end=clock();
- timeSum+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
- }
- //odejmowanie
- for (i = 0;i<sizeTable;i++){
- start=clock();
- sub_simd(a[i],b[i],&sub[i]);
- timeSub+= ((double)clock() - start)/CLOCKS_PER_SEC*1000.0;
- }
- //mnozenie
- for (i = 0;i<sizeTable;i++){
- start=clock();
- mul_simd(a[i],b[i],&mul[i]);
- end=clock();
- timeMul+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
- }
- //dzielenie
- for (i = 0;i<sizeTable;i++){
- start=clock();
- div_simd(a[i],b[i],&div_res[i]);
- end=clock();
- timeDiv+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
- }
- }
- timeSum=timeSum/(float)(repeatNumber);
- timeSub=timeSub/(float)(repeatNumber);
- timeMul=timeMul/(float)(repeatNumber);
- timeDiv=timeDiv/(float)(repeatNumber);
- printf("Liczba liczb: %d\nSredni czas [ms]: \n+ %lf \n- %lf \n* %lf \n/ %lf \n",(4*sizeTable),timeSum,timeSub,timeMul,timeDiv);
- }
- int main(void){
- srand(time(NULL));
- randomGenerator();
- printf("Typ obliczen: SIMD\n");
- SIMD_test();
- printf("Typ obliczen: SISD\n");
- SISD();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement