]> git.leopard-lacewing.eu Git - bacc.git/commitdiff
[src] doppelte geschwindigkeit
authorPeter Schaefer <peter.schaefer@tuwien.ac.at>
Fri, 3 Aug 2012 10:48:35 +0000 (12:48 +0200)
committerPeter Schaefer <peter.schaefer@tuwien.ac.at>
Fri, 3 Aug 2012 10:48:35 +0000 (12:48 +0200)
src/mex_build_V.cpp
src/test_sol.m

index d02a66b675c64ec35f619ea721edb53bccb1794e..00e0d56a8fd003017006808b981807422abed310 100644 (file)
@@ -211,19 +211,24 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
        double d[3] = { 0, 0, 0 };\r
        double dt[3] = { 0, 0, 0 };\r
 \r
-#define V_MINROW_PER_WORKER 3\r
+#define MINSIZE_PER_WORKER 3\r
+#define MAX_WORKER 10\r
 \r
        int actualNumberOfThreads = omp_get_max_threads();\r
+\r
+       if(MAX_WORKER<actualNumberOfThreads)\r
+               actualNumberOfThreads = MAX_WORKER;\r
+\r
        int firstRow = 0, lastRow = -1;\r
        int targetSize = em * (em + 1) / (2 * actualNumberOfThreads);\r
 \r
-       if (targetSize < V_MINROW_PER_WORKER) {\r
-               actualNumberOfThreads = (int) em * (em + 1) / (2 * V_MINROW_PER_WORKER);\r
+       if (targetSize < MINSIZE_PER_WORKER) {\r
+               actualNumberOfThreads = (int) em * (em + 1) / (2 * MINSIZE_PER_WORKER);\r
                if (actualNumberOfThreads < 1) {\r
                        actualNumberOfThreads = 1;\r
                        targetSize = em;\r
                } else {\r
-                       targetSize = V_MINROW_PER_WORKER;\r
+                       targetSize = MINSIZE_PER_WORKER;\r
                }\r
        }\r
 #ifdef DEBUG\r
@@ -234,13 +239,12 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
 #endif\r
 \r
 //Ausrechnen\r
-#ifndef DEBUG\r
 #ifdef PARALLEL\r
 #pragma omp parallel private(i,j,k,tmp,x,y,xa,xb,ya,yb,d,dt,rx, rxa, rxb, ry, rya, ryb,lastRow,firstRow) shared(C,E,ctypeO,ctypeP,em,targetSize,actualNumberOfThreads)\r
        {\r
-#pragma omp parallel for\r
-#endif\r
+#pragma omp for\r
 #endif\r
+\r
        for (i = 0; i < actualNumberOfThreads; ++i) {\r
                firstRow = (int) sqrt(2*i*targetSize);\r
                if (i == actualNumberOfThreads - 1) {\r
@@ -352,17 +356,22 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
                                        }\r
 \r
                                }\r
-\r
+#ifdef PARALLEL\r
+#pragma omp critical\r
+#endif\r
                                A[(k * em) + j] = 1. / (4 * M_PI) * tmp;\r
                                if (k != j)\r
                                        A[(j * em) + k] = 1. / (4 * M_PI) * tmp;\r
+#ifdef PARALLEL\r
+#pragma omp end critical\r
+#endif\r
                        }\r
                }\r
        }\r
-#ifndef DEBUG\r
+\r
 #ifdef PARALLEL\r
 }\r
 #endif\r
-#endif\r
+\r
        return;\r
 }\r
index 16bf4e48d04a33c1e1b68fe340d8bfc0e0bf7432..2a8e9739901b9b4e79d2827b8c65e595d5cd4f47 100644 (file)
@@ -9,7 +9,7 @@ mex mex_build_V.cpp slpRectangle.cpp CFLAGS="\$CFLAGS -fopenmp" CXXFLAGS="\$CXXF
 % Test ausführen
 
 %Anzahl der Schritte
-steps = 15;
+steps = 16;
 
 %Art der Berechnungen
 type = [1];