parallel_for_for.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2009-2020 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include "parallel_for_for.h"
  4. #include "../sys/regression.h"
  5. namespace embree
  6. {
  7. struct parallel_for_for_regression_test : public RegressionTest
  8. {
  9. parallel_for_for_regression_test(const char* name) : RegressionTest(name) {
  10. registerRegressionTest(this);
  11. }
  12. bool run ()
  13. {
  14. bool passed = true;
  15. /* create vector with random numbers */
  16. size_t sum0 = 0;
  17. size_t K = 0;
  18. const size_t M = 1000;
  19. std::vector<std::vector<size_t>* > array2(M);
  20. for (size_t i=0; i<M; i++) {
  21. const size_t N = rand() % 1024;
  22. K+=N;
  23. array2[i] = new std::vector<size_t>(N);
  24. for (size_t j=0; j<N; j++)
  25. sum0 += (*array2[i])[j] = rand();
  26. }
  27. /* array to test global index */
  28. std::vector<atomic<size_t>> verify_k(K);
  29. for (size_t i=0; i<K; i++) verify_k[i].store(0);
  30. /* add all numbers using parallel_for_for */
  31. std::atomic<size_t> sum1(0);
  32. parallel_for_for( array2, size_t(1), [&](std::vector<size_t>* v, const range<size_t>& r, size_t k) -> size_t
  33. {
  34. size_t s = 0;
  35. for (size_t i=r.begin(); i<r.end(); i++) {
  36. s += (*v)[i];
  37. verify_k[k++]++;
  38. }
  39. sum1 += s;
  40. return sum1;
  41. });
  42. passed &= (sum0 == sum1);
  43. /* check global index */
  44. for (size_t i=0; i<K; i++)
  45. passed &= (verify_k[i] == 1);
  46. /* delete vectors again */
  47. for (size_t i=0; i<array2.size(); i++)
  48. delete array2[i];
  49. return passed;
  50. }
  51. };
  52. parallel_for_for_regression_test parallel_for_for_regression("parallel_for_for_regression_test");
  53. }