dlib C++ Library - parallel_for.cpp

// Copyright (C) 2013 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#include "tester.h"
#include <dlib/threads.h>
#include <vector>
#include <sstream>
namespace 
{
 using namespace test;
 using namespace dlib;
 using namespace std;
 dlib::logger dlog("test.parallel_for");
 class assign_element
 {
 public:
 assign_element(
 std::vector<int>& vect_
 ) : vect(vect_){}
 std::vector<int>& vect;
 void go (long i ) 
 {
 DLIB_TEST( 0 <= i && i < (long)vect.size());
 vect[i] = i;
 }
 void operator() (long i ) const
 {
 DLIB_TEST( 0 <= i && i < (long)vect.size());
 vect[i] = i;
 }
 };
 void test_parallel_for(long start)
 {
 std::vector<int> vect(200,0);
 parallel_for(4, start, vect.size(), assign_element(vect));
 for (long i = 0; i < start; ++i)
 {
 DLIB_TEST(vect[i] == 0);
 }
 for (long i = start; i < (long)vect.size(); ++i)
 {
 DLIB_TEST(vect[i] == i);
 }
 }
 void test_parallel_for2(long start)
 {
 std::vector<int> vect(200,0);
 assign_element temp(vect);
 parallel_for(4, start, vect.size(), temp, &assign_element::go);
 for (long i = 0; i < start; ++i)
 {
 DLIB_TEST(vect[i] == 0);
 }
 for (long i = start; i < (long)vect.size(); ++i)
 {
 DLIB_TEST(vect[i] == i);
 }
 }
 struct parfor_test_helper
 {
 mutable std::vector<int> test;
 parfor_test_helper() : test(400,100000)
 {
 }
 void go(long begin, long end)
 {
 for (long i = begin; i < end; ++i)
 test[i] = i;
 }
 void operator()(long begin, long end) const
 {
 for (long i = begin; i < end; ++i)
 test[i] = i;
 }
 void go2(long i)
 {
 test[i] = i;
 }
 };
 struct parfor_test_helper2
 {
 mutable std::vector<int> test;
 parfor_test_helper2() : test(400,100000)
 {
 }
 void operator()(long i) const
 {
 test[i] = i;
 }
 };
 void test_parallel_for_additional()
 {
 {
 parfor_test_helper helper;
 parallel_for(4, 0, helper.test.size(), helper, &parfor_test_helper::go2);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for(4, 10, helper.test.size(), helper, &parfor_test_helper::go2);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked(4, 0, helper.test.size(), helper, &parfor_test_helper::go);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked(4, 10, helper.test.size(), helper, &parfor_test_helper::go);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked(4, 0, helper.test.size(), helper);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked(4, 10, helper.test.size(), helper);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper2 helper;
 parallel_for(4, 0, helper.test.size(), helper);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper2 helper;
 parallel_for(4, 10, helper.test.size(), helper);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_verbose(4, 0, helper.test.size(), helper, &parfor_test_helper::go2);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_verbose(4, 10, helper.test.size(), helper, &parfor_test_helper::go2);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked_verbose(4, 0, helper.test.size(), helper, &parfor_test_helper::go);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked_verbose(4, 10, helper.test.size(), helper, &parfor_test_helper::go);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked_verbose(4, 0, helper.test.size(), helper);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper helper;
 parallel_for_blocked_verbose(4, 10, helper.test.size(), helper);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper2 helper;
 parallel_for_verbose(4, 0, helper.test.size(), helper);
 for (unsigned long i = 0; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 {
 parfor_test_helper2 helper;
 parallel_for_verbose(4, 10, helper.test.size(), helper);
 for (unsigned long i = 0; i < 10; ++i)
 {
 DLIB_CASSERT(helper.test[i] == 100000, helper.test[i]);
 }
 for (unsigned long i = 10; i < helper.test.size(); ++i)
 {
 DLIB_CASSERT(helper.test[i] == (long)i, helper.test[i]);
 }
 }
 }
 class test_parallel_for_routines : public tester
 {
 public:
 test_parallel_for_routines (
 ) :
 tester (
 "test_parallel_for", // the command line argument name for this test
 "Run tests on the parallel_for routines.", // the command line argument description
 0 // the number of command line arguments for this test
 )
 {
 }
 void perform_test (
 )
 {
 test_parallel_for(0);
 test_parallel_for(30);
 test_parallel_for(50);
 test_parallel_for2(0);
 test_parallel_for2(30);
 test_parallel_for2(50);
 test_parallel_for_additional();
 }
 };
 test_parallel_for_routines a;
}

AltStyle によって変換されたページ (->オリジナル) /