parallel_any_of.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include <functional>
  5. #include "parallel_reduce.h"
  6. namespace embree
  7. {
  8. template<typename Index, class UnaryPredicate>
  9. __forceinline bool parallel_any_of (Index first, Index last, UnaryPredicate pred)
  10. {
  11. std::atomic_bool ret;
  12. ret = false;
  13. #if defined(TASKING_TBB)
  14. #if TBB_INTERFACE_VERSION >= 12002
  15. tbb::task_group_context context;
  16. tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred,&context](const tbb::blocked_range<size_t>& r) {
  17. if (context.is_group_execution_cancelled()) return;
  18. for (size_t i = r.begin(); i != r.end(); ++i) {
  19. if (pred(i)) {
  20. ret = true;
  21. context.cancel_group_execution();
  22. }
  23. }
  24. });
  25. #else
  26. tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred](const tbb::blocked_range<size_t>& r) {
  27. if (tbb::task::self().is_cancelled()) return;
  28. for (size_t i = r.begin(); i != r.end(); ++i) {
  29. if (pred(i)) {
  30. ret = true;
  31. tbb::task::self().cancel_group_execution();
  32. }
  33. }
  34. });
  35. #endif
  36. #else
  37. ret = parallel_reduce (first, last, false, [pred](const range<size_t>& r)->bool {
  38. bool localret = false;
  39. for (auto i=r.begin(); i<r.end(); ++i) {
  40. localret |= pred(i);
  41. }
  42. return localret;
  43. },
  44. std::bit_or<bool>()
  45. );
  46. #endif
  47. return ret;
  48. }
  49. } // end namespace