// 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;
}