Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


etc:common_activities:intel_students_cup:tour2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
etc:common_activities:intel_students_cup:tour2 [2007/11/04 00:56] jcmvbkbcetc:common_activities:intel_students_cup:tour2 [2008/01/03 02:32] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Исследование вопроса ====== ====== Исследование вопроса ======
  
-[[tour2_tasks|Текущие задачи]]+  * [[tour2_tasks|Текущие задачи]] 
 +  * [[algo_details|Детали алгоритма]]
  
 ===== План ===== ===== План =====
Line 151: Line 152:
  LIBS_ALL   = $(LIBS)  LIBS_ALL   = $(LIBS)
 </file> </file>
 +
  
 ==== Менее очевидные шаги ==== ==== Менее очевидные шаги ====
Line 260: Line 262:
   * возможно подскажет где что можно ещё распараллелить;   * возможно подскажет где что можно ещё распараллелить;
  
-Установил icc в Fedora 7 (только компилятор). Пришлось дополнительно yum install compat-libstdc++-33.i386 +[[icc|Результаты]]
- +
-Результаты забавные: +
-  * замена -O2 на -O0 в Makefile дает время 54.252/кадр. +
-  * возврат -O2 (и добавление -lirc на линковке) дает 40.606/кадр. +
-  * оптимизация под SSE3 (-axT, -limf -lsvml) дает массу сообщений о векторизованных циклах и время 25.237/кадр. +
- +
- +
-Разбираюсь с профилированием и PGO. +
- +
-Изменения в Makefile: +
-<file> +
-diff -ruN src-org/Makefile src-icc/Makefile +
---- src-org/Makefile    2007-09-17 17:43:08.000000000 +0400 +
-+++ src-icc/Makefile    2007-11-03 22:28:21.000000000 +0300 +
-@@ -53,22 +53,23 @@ +
- +
- OBJ = .o +
- +
--CC         = gcc +
-+CC         = icc +
- CPLAT      = +
- CPROC      = +
- CINC       = -I$(SRC_DIR) +
- CDEFS      = +
- COBJ       = -c -o$(OBJ_DIR)/$@ +
--CDEFOPT    = -O2 +
-+CDEFOPT    = -O3 -axT +
- COPT       = +
- CFLAGS     = +
- CFLAGS_ALL = $(CFLAGS) $(CINC) $(CDEFS) $(CDEFOPT) $(CPROC) $(CPLAT) +
- +
- LD         = g++ +
--LDPLAT     = +
--LDFLAGS    = +
-+LDPLAT     = +
-+LDFLAGS    = -L/opt/intel/cc/10.0.023/lib +
- LDOUTOPT   = -o "$(OUT_DIR)/$(BENCHMARK)" +
--LIBS       = -lm -lc +
-+LIBS       = -lm -lc -lirc -limf -lsvml +
-+# -lompstub -lomp_db -lguide +
- LIBS_ALL   = $(LIBS) +
- +
- endif +
-</file>+
  
 === Использование Integrated Performance Primitives === === Использование Integrated Performance Primitives ===
Line 359: Line 317:
   rm -f main.o stupid   rm -f main.o stupid
 fast: ipp_main.o fast: ipp_main.o
-  g++ -L/opt/intel/ipp/5.2/ia32/sharedlib ipp_main.o -lguide -lippcore -lippvm -o fast+  g++ -L/opt/intel/ipp/5.2/ia32/sharedlib ipp_main.o -lippcore -lippvm -o fast
  
 ipp_main.o: main.cpp ipp_main.o: main.cpp
Line 416: Line 374:
  LDOUTOPT   = -o "$(OUT_DIR)/$(BENCHMARK)"  LDOUTOPT   = -o "$(OUT_DIR)/$(BENCHMARK)"
 -LIBS       = -lm -lc -LIBS       = -lm -lc
-+LIBS       = -lm -lc -lippcore -lippvm -lguide++LIBS       = -lm -lc -lippcore -lippvm
  LIBS_ALL   = $(LIBS)  LIBS_ALL   = $(LIBS)
  
Line 448: Line 406:
 Результат -- 10.044/кадр, 0.7% отличий. Понижение точности до 11 бит дает 9.139/кадр, 1% отличий. Однако, по-простецки с openmp оно дружить не захотело -- segfault. Результат -- 10.044/кадр, 0.7% отличий. Понижение точности до 11 бит дает 9.139/кадр, 1% отличий. Однако, по-простецки с openmp оно дружить не захотело -- segfault.
  
 +
 +zps.
 +Максимальный результат:
 +diff -ruN src-org src-ipp
 +<code>
 +diff src-org/Makefile src-ipp/Makefile
 +59c59
 +< CINC       = -I$(SRC_DIR)
 +---
 +> CINC       = -I$(SRC_DIR) -I/opt/intel/ipp/5.2/ia32/include
 +62c62,63
 +< CDEFOPT    = -O2
 +---
 +> #CDEFOPT    = -O2
 +> CDEFOPT    = -g
 +64c65
 +< CFLAGS     =
 +---
 +> CFLAGS     = -O3 -ffast-math -ffinite-math-only -fno-math-errno -funsafe-math-optimizations -fno-trapping-math -march=pentium4m 
 +69c70
 +< LDFLAGS    = 
 +---
 +> LDFLAGS    = -g -pg -ax -fprofile-arcs -ftest-coverage -L/opt/intel/ipp/5.2/ia32/sharedlib
 +71c72
 +< LIBS       = -lm -lc
 +---
 +> LIBS       = -lm -lc -lippcore -lippvm -lguide -lipps -lippm
 +diff src-org/sunset.cpp src-ipp/sunset.cpp
 +48c48,51
 +
 +---
 +> #include <ippvm.h>
 +> #include <ipps.h>
 +> #include <ippm.h>
 +> #include <iostream>
 +307c310,311
 +<                 float   OT, KX1, KY1;
 +---
 +>                 float   *OT, *KX1, *KY1;
 +>                 float   kx1, ky1, ot; // zps
 +339a344,346
 +>             free(OT);
 +>             free(KX1);
 +>             free(KY1); 
 +357c364,366
 +
 +---
 +>         OT           = (float*)malloc(iWaveHarmNum * sizeof(float));     
 +>         KX1          = (float*)malloc(iWaveHarmNum * sizeof(float));     
 +>         KY1          = (float*)malloc(iWaveHarmNum * sizeof(float));     
 +362a372
 +>         
 +657a668,669
 +>     ippsMulC_32f(flOmega, flTime, OT, iWaveHarmNum);
 +>     float xxx[iAngleHarmNum];
 +663c675
 +<         private(currentthread, OT, KX1, KY1) \
 +---
 +>         private(currentthread, OT, KX1, KY1, kx1, ky1, ot) \
 +679a692
 +>     
 +732c745,749
 +< */
 +---
 +> *///              std::cerr << "NKMAX: "<< NKMAX << std::endl;
 +>                  
 +>                 ippsMulC_32f(flK, flDecartX[i][j], KX1, NKMAX);
 +>                 ippsMulC_32f(flK, flDecartY[i][j], KY1, NKMAX);
 +
 +735,738c752,755
 +<                     OT  = flOmega[t] * flTime;
 +<                     KX1 = flK[t] * flDecartX[i][j];
 +<                     KY1 = flK[t] * flDecartY[i][j];
 +
 +---
 +>                     kx1 = KX1[t];
 +>                     ky1 = KY1[t];
 +>                     ot =  OT[t];
 +>                     int len = t * iAngleHarmNum;
 +741,745c758,761
 +<                         iSinIndex1 = t * iAngleHarmNum + l;
 +<                         flArgSin[currentthread].aptr[iSinIndex1] = OT - 
 +<                             KX1 * flAzimuthCosFi[l] - KY1 * flAzimuthSinFi[l] +
 +<                             flRandomPhase[t*iAngleHarmNum + l];
 +<                     } /* end for l */
 +---
 +>                         iSinIndex1 = len + l;
 +>                         flArgSin[currentthread].aptr[iSinIndex1] = ot -
 +>                            kx1*flAzimuthCosFi[l] - ky1*flAzimuthSinFi[l] + flRandomPhase[iSinIndex1];
 +>                    } /* end for l */
 +747c763,776
 +
 +---
 +> #if 0
 +>                 float * dest;
 +>                 for(t = 0; t < NKMAX; t++)
 +>                 
 +>                     dest = &flArgSin[currentthread].aptr[t*iAngleHarmNum];
 +>                     kx1 = KX1[t];
 +>                     ky1 = KY1[t];
 +>                     ippmLComb_vv_32f(flAzimuthCosFi, 4,kx1, flAzimuthSinFi, 4,ky1, xxx, 4, iAngleHarmNum);
 +>                     ippsSubCRev_32f(xxx,OT[t],dest, iAngleHarmNum);
 +>                     
 +>                 } /* end for t */
 +>                 dest = NULL;
 +> #endif
 +> //                ippsAdd_32f_I(flRandomPhase, flArgSin[currentthread].aptr, iWaveMeshSize);
 +750,752c779,783
 +<                 #pragma ivdep
 +<                 for(t=0; t<iWaveMeshSize; t++)
 +<                     pFlTmp[t] = (float)sinf(pFlTmp[t]);
 +---
 +> ippsSin_32f_A21(pFlTmp,pFlTmp,iWaveMeshSize);
 +
 +>                 //#pragma ivdep
 +>                 //for(t=0; t<iWaveMeshSize; t++)
 +>                 //    pFlTmp[t] = (float)sinf(pFlTmp[t]);
 +758a790,801
 +> #if 0
 +>                           
 +>                   const float *pr[]={flAmplitudeX,flAmplitudeY};
 +>                   float __r[2];
 +
 +>                   ippmDotProduct_vav_32f_L(pr,0,4,pFlTmp,4,__r,iWaveMeshSize,2);
 +
 +>                   flDerivX = __r[0];
 +>                   flDerivY = __r[1];
 +>                 }
 +> #endif
 +> #if 1
 +767a811
 +> #endif
 +Только в src-ipp: .sunset.cpp.swp
 +</code>
 +
 +результат:
 +<code bash>
 +Frame 1 of 16 ... frame time 8.534
 +Frame 2 of 16 ... frame time 8.508
 +Frame 3 of 16 ... frame time 8.167
 +Frame 4 of 16 ... frame time 8.538
 +Frame 5 of 16 ... frame time 8.467
 +Frame 6 of 16 ... frame time 8.302
 +Frame 7 of 16 ... frame time 8.565
 +Frame 8 of 16 ... frame time 8.425
 +Frame 9 of 16 ... frame time 8.549
 +Frame 10 of 16 ... frame time 8.398
 +Frame 11 of 16 ... frame time 8.425
 +Frame 12 of 16 ... frame time 8.595
 +Frame 13 of 16 ... frame time 8.419
 +Frame 14 of 16 ... frame time 8.312
 +Frame 15 of 16 ... frame time 8.471
 +Frame 16 of 16 ... frame time 8.417
 +=================================
 +Timing:
 +        Total time is 135.098 sec., average frame time is 8.444 sec.
 +
 +Correctness check:
 +        Max RGB difference is 11.
 +        Number of different color pixels is 3564 (0.7%).
 +
 +</code>
 +
 +{{:intel:result_kel.txt|Результаты работы на конфигурации P4(2,6)Windows}}:\\
 +Лучший из полученных результатов:
 +<code bash>
 +Frame 1 of 16 ... frame time 3.591
 +Frame 2 of 16 ... frame time 3.492
 +Frame 3 of 16 ... frame time 3.497
 +Frame 4 of 16 ... frame time 3.499
 +Frame 5 of 16 ... frame time 3.485
 +Frame 6 of 16 ... frame time 3.492
 +Frame 7 of 16 ... frame time 3.494
 +Frame 8 of 16 ... frame time 3.492
 +Frame 9 of 16 ... frame time 3.523
 +Frame 10 of 16 ... frame time 3.491
 +Frame 11 of 16 ... frame time 3.496
 +Frame 12 of 16 ... frame time 3.495
 +Frame 13 of 16 ... frame time 3.494
 +Frame 14 of 16 ... frame time 3.492
 +Frame 15 of 16 ... frame time 3.503
 +Frame 16 of 16 ... frame time 3.495
 +=================================
 +Timing:
 +        Total time is 56.036 sec., average frame time is 3.502 sec.
 +
 +Correctness check:
 +        Max RGB difference is 20.
 +        Number of different color pixels is 5437 (1.1%).
 +</code>
 +Достигнут:\\
 +  указанием ключа fast при компилляции
 +  заменой дублирующих вычислений в циклах в очевидных местах
 +  выносом вычисления синусов и косинусов (ipp) полярных координат
 +
 +==== Совсем неочевидные/исследовательские шаги ====
 +  * [[tab_sin|Табличный синус]] (плавающие числа) -- тупиковая ветвь.
 +  * Целочисленная реализация алгоритма расчета вектора нормали -- выигрыша по скорости нет, по точности -- проигрыш. Тупиковая ветвь.
 +  * [[harm_reduction|Уменьшение количества гармоник]] -- тупиковая ветвь.
etc/common_activities/intel_students_cup/tour2.1194126975.txt.gz · Last modified: 2008/01/03 02:32 (external edit)