Skip to content
Snippets Groups Projects
Commit 38f71bda authored by Berenger Bramas's avatar Berenger Bramas
Browse files

Update shared array to make remove potential bugs

parent 0f08af2e
No related branches found
No related tags found
2 merge requests!21Bugfix/nansampling,!3Bugfix/event manager show html
...@@ -30,7 +30,7 @@ public: ...@@ -30,7 +30,7 @@ public:
} }
shared_array(const size_t inDim, std::function<void(ValueType*)> inInitFunc) shared_array(const size_t inDim, std::function<void(ValueType*)> inInitFunc)
: shared_array(inDim), hasBeenShared(false){ : shared_array(inDim){
setInitFunction(inInitFunc); setInitFunction(inInitFunc);
} }
...@@ -40,7 +40,7 @@ public: ...@@ -40,7 +40,7 @@ public:
delete[] values[idxThread]; delete[] values[idxThread];
} }
delete[] values; delete[] values;
if(hasBeenMerged){ if(hasBeenMerged == false){
// TODO remove when bug solved // TODO remove when bug solved
std::cerr << "A shared array has not been merged.... might be a bug" << std::endl; std::cerr << "A shared array has not been merged.... might be a bug" << std::endl;
} }
...@@ -68,7 +68,7 @@ public: ...@@ -68,7 +68,7 @@ public:
} }
void mergeParallel(){ void mergeParallel(){
#pragma omp parallel /*#pragma omp parallel
{ {
int mergeFlag = 1; int mergeFlag = 1;
while(mergeFlag < currentNbThreads) mergeFlag <<= 1; while(mergeFlag < currentNbThreads) mergeFlag <<= 1;
...@@ -96,7 +96,16 @@ public: ...@@ -96,7 +96,16 @@ public:
} }
#pragma omp barrier #pragma omp barrier
} }
} }*/
for(int idxThread = 1 ; idxThread < currentNbThreads ; ++idxThread){
if(values[idxThread]){
ValueType* __restrict__ dest = values[0];
const ValueType* __restrict__ src = values[idxThread];
for( size_t idxVal = 0 ; idxVal < dim ; ++idxVal){
dest[idxVal] += src[idxVal];
}
}
}
hasBeenMerged = true; hasBeenMerged = true;
} }
...@@ -131,8 +140,13 @@ public: ...@@ -131,8 +140,13 @@ public:
omp_set_lock(&locker); omp_set_lock(&locker);
values[omp_get_thread_num()] = myValue; values[omp_get_thread_num()] = myValue;
omp_unset_lock(&locker); omp_unset_lock(&locker);
return myValue;
} }
return values[omp_get_thread_num()];
omp_set_lock(&locker);
ValueType* myValue = values[omp_get_thread_num()];
omp_unset_lock(&locker);
return myValue;
} }
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment