Implémentation de RipplingMOO (entralecement + auto-for).
[GPU.git] / WCudaMSE / Tuto_Image / src / cpp / core / 01_Vague / b_moo / VagueMOO.cpp
index 7a1e633..47e7198 100755 (executable)
-#include <iostream>\r
-#include <omp.h>\r
-#include <math.h>\r
-\r
-#include "VagueMOO.h"\r
-#include "VagueMath.h"\r
-\r
-#include "OmpTools.h"\r
-#include "IndiceTools.h"\r
-\r
-using std::cout;\r
-using std::endl;\r
-\r
-/*----------------------------------------------------------------------*\\r
- |*                    Declaration                                     *|\r
- \*---------------------------------------------------------------------*/\r
-\r
-/*--------------------------------------*\\r
- |*            Public                  *|\r
- \*-------------------------------------*/\r
-\r
-/*--------------------------------------*\\r
- |*            Private                 *|\r
- \*-------------------------------------*/\r
-\r
-/*----------------------------------------------------------------------*\\r
- |*                    Implementation                                  *|\r
- \*---------------------------------------------------------------------*/\r
-\r
-/*--------------------------------------*\\r
- |*            Public                  *|\r
- \*-------------------------------------*/\r
-\r
-VagueMOO::VagueMOO(unsigned int w, unsigned int h, float dt)\r
-    {\r
-    // Input\r
-    this->dt = dt;\r
-    this->w=w;\r
-\r
-\r
-    // Tools\r
-    this->t = 0;\r
-    this->isEntrelacement=true;\r
-\r
-\r
-    // OMP (facultatif)\r
-    const int NB_THREADS = OmpTools::setAndGetNaturalGranularity();\r
-    cout << "\n[VAGUE] nbThread = " << NB_THREADS << endl;\r
-    }\r
-\r
-VagueMOO::~VagueMOO(void)\r
-    {\r
-    // rien\r
-    }\r
-\r
-/*--------------------------------------*\\r
- |*            Public                  *|\r
- \*-------------------------------------*/\r
-\r
-void VagueMOO::process(uchar4* ptrTabPixels, int w, int h)\r
-    {\r
-    if (isEntrelacement)\r
-       {\r
-       entrelacementOMP(ptrTabPixels, w, h); // Plus lent\r
-       }\r
-    else\r
-       {\r
-       forAutoOMP(ptrTabPixels, w, h);  // Plus rapide\r
-       }\r
-\r
-    isEntrelacement = !isEntrelacement; // Pour tester que les deux implementations fonctionnent\r
-    }\r
-\r
-void VagueMOO::animationStep()\r
-    {\r
-    t+=dt;\r
-    }\r
-\r
-/*--------------*\\r
- |*    get     *|\r
- \*-------------*/\r
-\r
-float VagueMOO::getT()\r
-    {\r
-    return t;\r
-    }\r
-\r
-float VagueMOO::getDT()\r
-    {\r
-    return dt;\r
-    }\r
-\r
-/*--------------------------------------*\\r
- |*            Private                 *|\r
- \*-------------------------------------*/\r
-\r
-/**\r
- * Code naturel et direct OMP\r
- */\r
-void VagueMOO::forAutoOMP(uchar4* ptrTabPixels, int w, int h)\r
-    {\r
-    VagueMath vagueMath(w,h); // ici pour preparer cuda\r
-\r
-#pragma omp parallel for\r
-    for (int i = 0; i < h; i++)\r
-       {\r
-       for (int j = 0; j < w; j++)\r
-           {\r
-           // int s = i * W + j;\r
-           int s = IndiceTools::toS(w, i, j);    // i[0,H[ j[0,W[  --> s[0,W*H[\r
-\r
-           vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);\r
-           }\r
-       }\r
-    }\r
-\r
-/**\r
- * Code entrainement Cuda\r
- */\r
-void VagueMOO::entrelacementOMP(uchar4* ptrTabPixels, int w, int h)\r
-    {\r
-    VagueMath vagueMath(w,h); // ici pour preparer cuda\r
-\r
-    const int WH = w * h;\r
-\r
-\r
-#pragma omp parallel\r
-       {\r
-       const int NB_THREAD = OmpTools::getNbThread();// dans region parallel\r
-       const int TID = OmpTools::getTid();\r
-       int s = TID; // in [0,...\r
-\r
-       int i;\r
-       int j;\r
-       while (s < WH)\r
-           {\r
-           IndiceTools::toIJ(s, w, &i, &j); // s[0,W*H[ --> i[0,H[ j[0,W[\r
-\r
-           vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);\r
-\r
-           s += NB_THREAD;\r
-           }\r
-       }\r
-    }\r
-\r
-\r
-/*----------------------------------------------------------------------*\\r
- |*                    End                                             *|\r
- \*---------------------------------------------------------------------*/\r
-\r
+#include <iostream>
+#include <omp.h>
+#include <math.h>
+
+#include "VagueMOO.h"
+#include "VagueMath.h"
+
+#include "OmpTools.h"
+#include "IndiceTools.h"
+
+using std::cout;
+using std::endl;
+
+/*----------------------------------------------------------------------*\
+ |*                    Declaration                                     *|
+ \*---------------------------------------------------------------------*/
+
+/*--------------------------------------*\
+ |*            Public                  *|
+ \*-------------------------------------*/
+
+/*--------------------------------------*\
+ |*            Private                 *|
+ \*-------------------------------------*/
+
+/*----------------------------------------------------------------------*\
+ |*                    Implementation                                  *|
+ \*---------------------------------------------------------------------*/
+
+/*--------------------------------------*\
+ |*            Public                  *|
+ \*-------------------------------------*/
+
+VagueMOO::VagueMOO(unsigned int w, unsigned int h, float dt)
+    {
+    // Input
+    this->dt = dt;
+    this->w=w;
+
+
+    // Tools
+    this->t = 0;
+    this->isEntrelacement=true;
+
+
+    // OMP (facultatif)
+    const int NB_THREADS = OmpTools::setAndGetNaturalGranularity();
+    cout << "\n[VAGUE] nbThread = " << NB_THREADS << endl;
+    }
+
+VagueMOO::~VagueMOO(void)
+    {
+    // rien
+    }
+
+/*--------------------------------------*\
+ |*            Public                  *|
+ \*-------------------------------------*/
+
+void VagueMOO::process(uchar4* ptrTabPixels, int w, int h)
+    {
+    if (isEntrelacement)
+       {
+       entrelacementOMP(ptrTabPixels, w, h); // Plus lent
+       }
+    else
+       {
+       forAutoOMP(ptrTabPixels, w, h);  // Plus rapide
+       }
+
+    isEntrelacement = !isEntrelacement; // Pour tester que les deux implementations fonctionnent
+    }
+
+void VagueMOO::animationStep()
+    {
+    t+=dt;
+    }
+
+/*--------------*\
+ |*    get     *|
+ \*-------------*/
+
+float VagueMOO::getT()
+    {
+    return t;
+    }
+
+float VagueMOO::getDT()
+    {
+    return dt;
+    }
+
+/*--------------------------------------*\
+ |*            Private                 *|
+ \*-------------------------------------*/
+
+
+/**
+ * Code entrainement Cuda
+ */
+void VagueMOO::entrelacementOMP(uchar4* ptrTabPixels, int w, int h)
+    {
+    VagueMath vagueMath(w,h); // ici pour preparer cuda
+
+    const int WH = w * h;
+
+#pragma omp parallel
+       {
+       const int NB_THREAD = OmpTools::getNbThread();// dans region parallel
+       const int TID = OmpTools::getTid();
+       int s = TID; // in [0,...
+
+       int i;
+       int j;
+       while (s < WH)
+           {
+           IndiceTools::toIJ(s, w, &i, &j); // s[0,W*H[ --> i[0,H[ j[0,W[
+
+           vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);
+
+           s += NB_THREAD;
+           }
+       }
+    }
+
+/**
+ * Code naturel et direct OMP
+ */
+void VagueMOO::forAutoOMP(uchar4* ptrTabPixels, int w, int h)
+    {
+    VagueMath vagueMath(w,h); // ici pour preparer cuda
+
+#pragma omp parallel for
+    for (int i = 0; i < h; i++)
+       {
+       for (int j = 0; j < w; j++)
+           {
+           // int s = i * W + j;
+           int s = IndiceTools::toS(w, i, j);    // i[0,H[ j[0,W[  --> s[0,W*H[
+
+           vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);
+           }
+       }
+    }
+/*----------------------------------------------------------------------*\
+ |*                    End                                             *|
+ \*---------------------------------------------------------------------*/
+