summaryrefslogtreecommitdiff
path: root/thirdparty/embree-aarch64/common/sys/barrier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree-aarch64/common/sys/barrier.cpp')
-rw-r--r--thirdparty/embree-aarch64/common/sys/barrier.cpp289
1 files changed, 0 insertions, 289 deletions
diff --git a/thirdparty/embree-aarch64/common/sys/barrier.cpp b/thirdparty/embree-aarch64/common/sys/barrier.cpp
deleted file mode 100644
index 0061d18db2..0000000000
--- a/thirdparty/embree-aarch64/common/sys/barrier.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2009-2020 Intel Corporation
-// SPDX-License-Identifier: Apache-2.0
-
-#include "barrier.h"
-#include "condition.h"
-#include "regression.h"
-#include "thread.h"
-
-#if defined (__WIN32__)
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-namespace embree
-{
- struct BarrierSysImplementation
- {
- __forceinline BarrierSysImplementation (size_t N)
- : i(0), enterCount(0), exitCount(0), barrierSize(0)
- {
- events[0] = CreateEvent(nullptr, TRUE, FALSE, nullptr);
- events[1] = CreateEvent(nullptr, TRUE, FALSE, nullptr);
- init(N);
- }
-
- __forceinline ~BarrierSysImplementation ()
- {
- CloseHandle(events[0]);
- CloseHandle(events[1]);
- }
-
- __forceinline void init(size_t N)
- {
- barrierSize = N;
- enterCount.store(N);
- exitCount.store(N);
- }
-
- __forceinline void wait()
- {
- /* every thread entering the barrier decrements this count */
- size_t i0 = i;
- size_t cnt0 = enterCount--;
-
- /* all threads except the last one are wait in the barrier */
- if (cnt0 > 1)
- {
- if (WaitForSingleObject(events[i0], INFINITE) != WAIT_OBJECT_0)
- THROW_RUNTIME_ERROR("WaitForSingleObjects failed");
- }
-
- /* the last thread starts all threads waiting at the barrier */
- else
- {
- i = 1-i;
- enterCount.store(barrierSize);
- if (SetEvent(events[i0]) == 0)
- THROW_RUNTIME_ERROR("SetEvent failed");
- }
-
- /* every thread leaving the barrier decrements this count */
- size_t cnt1 = exitCount--;
-
- /* the last thread that left the barrier resets the event again */
- if (cnt1 == 1)
- {
- exitCount.store(barrierSize);
- if (ResetEvent(events[i0]) == 0)
- THROW_RUNTIME_ERROR("ResetEvent failed");
- }
- }
-
- public:
- HANDLE events[2];
- atomic<size_t> i;
- atomic<size_t> enterCount;
- atomic<size_t> exitCount;
- size_t barrierSize;
- };
-}
-
-#else
-
-namespace embree
-{
- struct BarrierSysImplementation
- {
- __forceinline BarrierSysImplementation (size_t N)
- : count(0), barrierSize(0)
- {
- init(N);
- }
-
- __forceinline void init(size_t N)
- {
- assert(count == 0);
- count = 0;
- barrierSize = N;
- }
-
- __forceinline void wait()
- {
- mutex.lock();
- count++;
-
- if (count == barrierSize) {
- count = 0;
- cond.notify_all();
- mutex.unlock();
- return;
- }
-
- cond.wait(mutex);
- mutex.unlock();
- return;
- }
-
- public:
- MutexSys mutex;
- ConditionSys cond;
- volatile size_t count;
- volatile size_t barrierSize;
- };
-}
-
-#endif
-
-namespace embree
-{
- BarrierSys::BarrierSys (size_t N) {
- opaque = new BarrierSysImplementation(N);
- }
-
- BarrierSys::~BarrierSys () {
- delete (BarrierSysImplementation*) opaque;
- }
-
- void BarrierSys::init(size_t count) {
- ((BarrierSysImplementation*) opaque)->init(count);
- }
-
- void BarrierSys::wait() {
- ((BarrierSysImplementation*) opaque)->wait();
- }
-
- LinearBarrierActive::LinearBarrierActive (size_t N)
- : count0(nullptr), count1(nullptr), mode(0), flag0(0), flag1(0), threadCount(0)
- {
- if (N == 0) N = getNumberOfLogicalThreads();
- init(N);
- }
-
- LinearBarrierActive::~LinearBarrierActive()
- {
- delete[] count0;
- delete[] count1;
- }
-
- void LinearBarrierActive::init(size_t N)
- {
- if (threadCount != N) {
- threadCount = N;
- if (count0) delete[] count0; count0 = new unsigned char[N];
- if (count1) delete[] count1; count1 = new unsigned char[N];
- }
- mode = 0;
- flag0 = 0;
- flag1 = 0;
- for (size_t i=0; i<N; i++) count0[i] = 0;
- for (size_t i=0; i<N; i++) count1[i] = 0;
- }
-
- void LinearBarrierActive::wait (const size_t threadIndex)
- {
- if (mode == 0)
- {
- if (threadIndex == 0)
- {
- for (size_t i=0; i<threadCount; i++)
- count1[i] = 0;
-
- for (size_t i=1; i<threadCount; i++)
- {
- while (likely(count0[i] == 0))
- pause_cpu();
- }
- mode = 1;
- flag1 = 0;
- __memory_barrier();
- flag0 = 1;
- }
- else
- {
- count0[threadIndex] = 1;
- {
- while (likely(flag0 == 0))
- pause_cpu();
- }
-
- }
- }
- else
- {
- if (threadIndex == 0)
- {
- for (size_t i=0; i<threadCount; i++)
- count0[i] = 0;
-
- for (size_t i=1; i<threadCount; i++)
- {
- while (likely(count1[i] == 0))
- pause_cpu();
- }
-
- mode = 0;
- flag0 = 0;
- __memory_barrier();
- flag1 = 1;
- }
- else
- {
- count1[threadIndex] = 1;
- {
- while (likely(flag1 == 0))
- pause_cpu();
- }
- }
- }
- }
-
- struct barrier_sys_regression_test : public RegressionTest
- {
- BarrierSys barrier;
- std::atomic<size_t> threadID;
- std::atomic<size_t> numFailed;
- std::vector<size_t> threadResults;
-
- barrier_sys_regression_test()
- : RegressionTest("barrier_sys_regression_test"), threadID(0), numFailed(0)
- {
- registerRegressionTest(this);
- }
-
- static void thread_alloc(barrier_sys_regression_test* This)
- {
- size_t tid = This->threadID++;
- for (size_t j=0; j<1000; j++)
- {
- This->barrier.wait();
- This->threadResults[tid] = tid;
- This->barrier.wait();
- }
- }
-
- bool run ()
- {
- threadID.store(0);
- numFailed.store(0);
-
- size_t numThreads = getNumberOfLogicalThreads();
- threadResults.resize(numThreads);
- barrier.init(numThreads+1);
-
- /* create threads */
- std::vector<thread_t> threads;
- for (size_t i=0; i<numThreads; i++)
- threads.push_back(createThread((thread_func)thread_alloc,this));
-
- /* run test */
- for (size_t i=0; i<1000; i++)
- {
- for (size_t i=0; i<numThreads; i++) threadResults[i] = 0;
- barrier.wait();
- barrier.wait();
- for (size_t i=0; i<numThreads; i++) numFailed += threadResults[i] != i;
- }
-
- /* destroy threads */
- for (size_t i=0; i<numThreads; i++)
- join(threads[i]);
-
- return numFailed == 0;
- }
- };
-
- barrier_sys_regression_test barrier_sys_regression_test;
-}
-
-