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
#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
}\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