PSchedule Schedule :: schedulePartialyEarlyParallel (ActiveList *activeList, const vector<Resource *> *resources, vector<Job *> :: const_iterator minIterator, vector<Job *> :: const_iterator maxIterator, const map<Job *, int> *starts, function<PVectorJobs(PARAMETERS_OF_SELECTING_FUNCTION)> &functionForSelecting) { PSchedule schedule(new Schedule(activeList, resources)); schedule->_type = ScheduleTypeEarlyComposite; vector<Job *> segment1(activeList->jobList()->begin(), minIterator); vector<Job *> segment2(minIterator, maxIterator + 1); vector<Job *> segment3(maxIterator + 1, activeList->jobList()->end()); // segment1 for (Job *job : segment1) { auto iterator = starts->find(job); if (iterator != starts->end()) schedule->_starts[job] = iterator->second; else return PSchedule(nullptr); schedule->reduceResourceRemain(job); } // segment 2 schedule->addJobsOnScheduleViaEarlyParallelDecoder(segment2, functionForSelecting); // segment 3 schedule->addJobsOnScheduleViaEarlyDecoder(&segment3); return schedule; }
TEST(RangeStrideSegmentTest, strongly_typed) { RAJA::TypedRangeStrideSegment<StrongType> segment1( 0, 7, 3); // should produce 0,3,6 ASSERT_EQ(segment1.size(), 3); RAJA::TypedRangeStrideSegment<StrongType> segment2( 0, 13, 3); // should produce 0,3,6,9,12 ASSERT_EQ(segment2.size(), 5); RAJA::TypedRangeStrideSegment<StrongType> segment3( 0, 17, 5); // should produce 0,5,10,15 ASSERT_EQ(segment3.size(), 4); std::vector<int> values(7, 0); RAJA::forall<RAJA::seq_exec>(segment1, [&](StrongType i) { values[*i] = 1; }); ASSERT_EQ(values[0], 1); ASSERT_EQ(values[1], 0); ASSERT_EQ(values[2], 0); ASSERT_EQ(values[3], 1); ASSERT_EQ(values[4], 0); ASSERT_EQ(values[5], 0); ASSERT_EQ(values[6], 1); }
TEST(RangeStrideSegmentTest, sizes_primes) { RAJA::RangeStrideSegment segment1(0, 7, 3); // should produce 0,3,6 ASSERT_EQ(segment1.size(), 3); RAJA::RangeStrideSegment segment2(0, 13, 3); // should produce 0,3,6,9,12 ASSERT_EQ(segment2.size(), 5); RAJA::RangeStrideSegment segment3(0, 17, 5); // should produce 0,5,10,15 ASSERT_EQ(segment3.size(), 4); }
PSchedule Schedule :: schedulePartialyLateParallel (ActiveList *activeList, const vector<Resource *> *resources, vector<Job *> :: const_iterator minIterator, vector<Job *> :: const_iterator maxIterator, const map<Job *, int> *starts, function<PVectorJobs(PARAMETERS_OF_SELECTING_FUNCTION)> &functionForSelecting) { PSchedule schedule(new Schedule(activeList, resources)); schedule->_type = ScheduleTypeLateComposite; vector<Job *> segment1(activeList->jobList()->begin(), minIterator); vector<Job *> segment2(minIterator, maxIterator + 1); vector<Job *> segment3(maxIterator + 1, activeList->jobList()->end()); // segment3 for (Job *job : segment3) { auto iterator = starts->find(job); if (iterator != starts->end()) schedule->_starts[job] = iterator->second; else return PSchedule(nullptr); schedule->reduceResourceRemain(job); } // Move schedule to ending at far time int maxEnd = INT_MIN; for (auto &jobStart : schedule->_starts) { int end = jobStart.second + jobStart.first->duration(); if (end > maxEnd) maxEnd = end; } schedule->shift(activeList->duration() - maxEnd); // segment 2 schedule->addJobsOnScheduleViaLateParallelDecoder(segment2, functionForSelecting); // segment 1 schedule->addJobsOnScheduleViaLateDecoder(&segment1); // Move schedule to starting at zero time int start = INT_MAX; for (auto &jobStart : schedule->_starts) { if (jobStart.second < start) start = jobStart.second; } schedule->shift(-start); return schedule; }
TEST(RangeStrideSegmentTest, sizes_roundoff1) { RAJA::RangeStrideSegment segment2(0, 21, 2); ASSERT_EQ(segment2.size(), 11); RAJA::RangeStrideSegment segment3(0, 21, 4); ASSERT_EQ(segment3.size(), 6); RAJA::RangeStrideSegment segment4(0, 21, 5); ASSERT_EQ(segment4.size(), 5); RAJA::RangeStrideSegment segment5(0, 21, 10); ASSERT_EQ(segment5.size(), 3); RAJA::RangeStrideSegment segment6(0, 21, 20); ASSERT_EQ(segment6.size(), 2); }
TEST(RangeStrideSegmentTest, sizes_reverse_roundoff1) { RAJA::RangeStrideSegment segment2(20, -1, -2); ASSERT_EQ(segment2.size(), 11); RAJA::RangeStrideSegment segment3(20, -1, -4); ASSERT_EQ(segment3.size(), 6); RAJA::RangeStrideSegment segment4(20, -1, -5); ASSERT_EQ(segment4.size(), 5); RAJA::RangeStrideSegment segment5(20, -1, -10); ASSERT_EQ(segment5.size(), 3); RAJA::RangeStrideSegment segment6(20, -1, -20); ASSERT_EQ(segment6.size(), 2); }
TEST(RangeStrideSegmentTest, basic_types) { RAJA::TypedRangeStrideSegment<signed char> segment1(0, 31, 3); ASSERT_EQ(segment1.size(), 11); RAJA::TypedRangeStrideSegment<short> segment2(0, 31, 3); ASSERT_EQ(segment2.size(), 11); RAJA::TypedRangeStrideSegment<int> segment3(0, 31, 3); ASSERT_EQ(segment3.size(), 11); RAJA::TypedRangeStrideSegment<long> segment4(0, 31, 3); ASSERT_EQ(segment3.size(), 11); RAJA::TypedRangeStrideSegment<long long> segment5(0, 31, 3); ASSERT_EQ(segment3.size(), 11); }
TEST(RangeStrideSegmentTest, sizes_no_roundoff) { RAJA::RangeStrideSegment segment1(0, 20, 1); ASSERT_EQ(segment1.size(), 20); RAJA::RangeStrideSegment segment2(0, 20, 2); ASSERT_EQ(segment2.size(), 10); RAJA::RangeStrideSegment segment3(0, 20, 4); ASSERT_EQ(segment3.size(), 5); RAJA::RangeStrideSegment segment4(0, 20, 5); ASSERT_EQ(segment4.size(), 4); RAJA::RangeStrideSegment segment5(0, 20, 10); ASSERT_EQ(segment5.size(), 2); RAJA::RangeStrideSegment segment6(0, 20, 20); ASSERT_EQ(segment6.size(), 1); }
TEST(RangeStrideSegmentTest, sizes_reverse_no_roundoff) { RAJA::RangeStrideSegment segment1(19, -1, -1); ASSERT_EQ(segment1.size(), 20); RAJA::RangeStrideSegment segment2(19, -1, -2); ASSERT_EQ(segment2.size(), 10); RAJA::RangeStrideSegment segment3(19, -1, -4); ASSERT_EQ(segment3.size(), 5); RAJA::RangeStrideSegment segment4(19, -1, -5); ASSERT_EQ(segment4.size(), 4); RAJA::RangeStrideSegment segment5(19, -1, -10); ASSERT_EQ(segment5.size(), 2); RAJA::RangeStrideSegment segment6(19, -1, -20); ASSERT_EQ(segment6.size(), 1); }