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. bool ret = false;
  12. #if defined(TASKING_TBB)
  13. #if TBB_INTERFACE_VERSION >= 12002
  14. tbb::task_group_context context;
  15. tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred,&context](const tbb::blocked_range<size_t>& r) {
  16. if (context.is_group_execution_cancelled()) return;
  17. for (size_t i = r.begin(); i != r.end(); ++i) {
  18. if (pred(i)) {
  19. ret = true;
  20. context.cancel_group_execution();
  21. }
  22. }
  23. });
  24. #else
  25. tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred](const tbb::blocked_range<size_t>& r) {
  26. if (tbb::task::self().is_cancelled()) return;
  27. for (size_t i = r.begin(); i != r.end(); ++i) {
  28. if (pred(i)) {
  29. ret = true;
  30. tbb::task::self().cancel_group_execution();
  31. }
  32. }
  33. });
  34. #endif
  35. #else
  36. ret = parallel_reduce (first, last, false, [pred](const range<size_t>& r)->bool {
  37. bool localret = false;
  38. for (auto i=r.begin(); i<r.end(); ++i) {
  39. localret |= pred(i);
  40. }
  41. return localret;
  42. },
  43. std::bit_or<bool>()
  44. );
  45. #endif
  46. return ret;
  47. }
  48. } // end namespace