示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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;
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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);
}
示例#8
0
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);
}
示例#9
0
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);
}