@@ -264,6 +264,7 @@ auto SampleDistributionEqualIssue(size_t sample_count, size_t set_size,
264
264
// / the QPS as scheduled is equal to the QPS as requested.
265
265
template <TestScenario scenario, TestMode mode>
266
266
std::vector<QueryMetadata> GenerateQueries (
267
+ QuerySampleLibrary* qsl,
267
268
const TestSettingsInternal& settings,
268
269
const LoadableSampleSet& loaded_sample_set, SequenceGen* sequence_gen,
269
270
ResponseDelegate* response_delegate) {
@@ -347,6 +348,29 @@ std::vector<QueryMetadata> GenerateQueries(
347
348
// Choose a single sample to repeat when in performance_issue_same mode
348
349
QuerySampleIndex same_sample = settings.performance_issue_same_index ;
349
350
351
+ // Variables for handling group test
352
+ QuerySampleIndex global_idx = 0 ;
353
+ std::vector<size_t > groups;
354
+ std::vector<size_t > groups_first;
355
+ size_t number_of_groups = 0 ;
356
+ size_t g, group_size;
357
+
358
+ if (settings.use_grouped_qsl ) {
359
+ size_t current_idx = 0 ;
360
+ while (current_idx < loaded_samples.size ())
361
+ {
362
+ size_t current_group = qsl->GroupOf (loaded_samples[current_idx]);
363
+ groups.push_back (current_group);
364
+ groups_first.push_back (current_idx);
365
+ current_idx += qsl->GroupSize (loaded_samples[current_idx]);
366
+ number_of_groups++;
367
+ }
368
+
369
+ }
370
+
371
+ auto grouped_sample_distribution = SampleDistribution<mode>(
372
+ number_of_groups, sample_stride, &sample_rng);
373
+
350
374
while (prev_timestamp < gen_duration || queries.size () < min_queries) {
351
375
if (kIsMultiStream ) {
352
376
QuerySampleIndex sample_i = settings.performance_issue_unique
@@ -393,6 +417,9 @@ std::vector<QueryMetadata> GenerateQueries(
393
417
assert (remainder == 0 );
394
418
}
395
419
}
420
+ } else if (settings.use_grouped_qsl ) {
421
+ g = grouped_sample_distribution (sample_rng);
422
+ group_size = qsl->GroupSize (loaded_samples[groups_first[g]]);
396
423
} else {
397
424
for (auto & s : samples) {
398
425
s = loaded_samples[settings.performance_issue_unique
@@ -403,10 +430,21 @@ std::vector<QueryMetadata> GenerateQueries(
403
430
: sample_distribution (sample_rng)];
404
431
}
405
432
}
406
- queries.emplace_back (samples, timestamp, response_delegate, sequence_gen);
433
+ if (!settings.use_grouped_qsl ) {
434
+ queries.emplace_back (samples, timestamp, response_delegate, sequence_gen);
435
+ } else {
436
+ for (size_t i = 0 ; i < group_size; i++){
437
+ samples[0 ] = loaded_samples[groups_first[g]+i];
438
+ queries.emplace_back (samples, timestamp, response_delegate, sequence_gen);
439
+ }
440
+ }
407
441
prev_timestamp = timestamp;
408
442
if (settings.server_constant_gen && (scenario == TestScenario::Server)){
409
- timestamp += schedule_constant_distribution (schedule_rng);
443
+ if (!settings.use_grouped_qsl ){
444
+ timestamp += schedule_constant_distribution (schedule_rng);
445
+ } else {
446
+ timestamp += group_size * schedule_constant_distribution (schedule_rng);
447
+ }
410
448
} else {
411
449
timestamp += schedule_distribution (schedule_rng);
412
450
}
@@ -453,7 +491,8 @@ std::vector<QueryMetadata> GenerateQueries(
453
491
// no longer generates queries on the fly. Should we reduce the
454
492
// use of templates?
455
493
template <TestScenario scenario, TestMode mode>
456
- PerformanceResult IssueQueries (SystemUnderTest* sut,
494
+ PerformanceResult IssueQueries (SystemUnderTest* sut,
495
+ QuerySampleLibrary* qsl,
457
496
const TestSettingsInternal& settings,
458
497
const LoadableSampleSet& loaded_sample_set,
459
498
SequenceGen* sequence_gen) {
@@ -469,7 +508,7 @@ PerformanceResult IssueQueries(SystemUnderTest* sut,
469
508
// Generate queries.
470
509
auto sequence_id_start = sequence_gen->CurrentSampleId ();
471
510
std::vector<QueryMetadata> queries = GenerateQueries<scenario, mode>(
472
- settings, loaded_sample_set, sequence_gen, &response_logger);
511
+ qsl, settings, loaded_sample_set, sequence_gen, &response_logger);
473
512
474
513
// Calculated expected number of queries
475
514
uint64_t expected_queries =
@@ -644,12 +683,35 @@ std::vector<LoadableSampleSet> GenerateLoadableSets(
644
683
// Generate indices for all available samples in the QSL.
645
684
const size_t qsl_total_count = qsl->TotalSampleCount ();
646
685
std::vector<QuerySampleIndex> samples (qsl_total_count);
647
- for (size_t i = 0 ; i < qsl_total_count; i++) {
648
- samples[i] = static_cast <QuerySampleIndex>(i);
649
- }
686
+ std::vector<QuerySampleIndex> groupIdx (qsl_total_count);
687
+ if (!settings.use_grouped_qsl ){
688
+ for (size_t i = 0 ; i < qsl_total_count; i++) {
689
+ samples[i] = static_cast <QuerySampleIndex>(i);
690
+ }
650
691
651
- // Randomize the order of the samples.
652
- std::shuffle (samples.begin (), samples.end (), qsl_rng);
692
+ // Randomize the order of the samples.
693
+ std::shuffle (samples.begin (), samples.end (), qsl_rng);
694
+ } else {
695
+ // If using grouped qsl, we randomized the groups.
696
+ // The samples within a group mantain their order.
697
+ size_t number_of_groups = qsl->NumberOfGroups ();
698
+ size_t acumCount = 0 , idx = 0 ;
699
+ std::vector<QuerySampleIndex> groups (number_of_groups);
700
+ std::vector<QuerySampleIndex> acumSizes (number_of_groups);
701
+ for (size_t i = 0 ; i < number_of_groups; i++) {
702
+ groups[i] = static_cast <QuerySampleIndex>(i);
703
+ acumSizes[i] = acumCount;
704
+ acumCount += qsl->GroupSize (i);
705
+ }
706
+ std::shuffle (groups.begin (), groups.end (), qsl_rng);
707
+ for (size_t i = 0 ; i < number_of_groups; i++) {
708
+ for (size_t j = 0 ; j < qsl->GroupSize (groups[i]); j++) {
709
+ samples[idx] = acumSizes[groups[i]] + j;
710
+ groupIdx[idx] = groups[i];
711
+ idx++;
712
+ }
713
+ }
714
+ }
653
715
654
716
// Partition the samples into loadable sets.
655
717
const size_t set_size = settings.performance_sample_count ;
@@ -659,12 +721,30 @@ std::vector<LoadableSampleSet> GenerateLoadableSets(
659
721
std::vector<QuerySampleIndex> loadable_set;
660
722
loadable_set.reserve (set_size + set_padding);
661
723
662
- for (auto s : samples) {
663
- loadable_set.push_back (s);
664
- if (loadable_set.size () == set_size) {
665
- result.push_back ({std::move (loadable_set), set_size});
666
- loadable_set.clear ();
667
- loadable_set.reserve (set_size + set_padding);
724
+ if (!settings.use_grouped_qsl ){
725
+ for (auto s : samples) {
726
+ loadable_set.push_back (s);
727
+ if (loadable_set.size () == set_size) {
728
+ result.push_back ({std::move (loadable_set), set_size});
729
+ loadable_set.clear ();
730
+ loadable_set.reserve (set_size + set_padding);
731
+ }
732
+ }
733
+ } else {
734
+ size_t idx = 0 ;
735
+ size_t number_of_groups = qsl->NumberOfGroups ();
736
+ for (size_t i = 0 ; i < number_of_groups; i++) {
737
+ size_t group_size = qsl->GroupSize (groupIdx[idx]);
738
+ if (loadable_set.size () + group_size < set_size) {
739
+ for (size_t j = 0 ; j < group_size; j++) {
740
+ loadable_set.push_back (samples[idx]);
741
+ idx++;
742
+ }
743
+ } else {
744
+ result.push_back ({std::move (loadable_set), loadable_set.size ()});
745
+ loadable_set.clear ();
746
+ loadable_set.reserve (set_size + set_padding);
747
+ }
668
748
}
669
749
}
670
750
@@ -771,7 +851,7 @@ std::pair<PerformanceSummary, PerformanceSummary> FindBoundaries(
771
851
LoadSamplesToRam (qsl, performance_set.set );
772
852
773
853
PerformanceResult u_pr (IssueQueries<scenario, TestMode::PerformanceOnly>(
774
- sut, u_settings, performance_set, sequence_gen));
854
+ sut, qsl, u_settings, performance_set, sequence_gen));
775
855
PerformanceSummary u_perf_summary{sut->Name (), u_settings, std::move (u_pr)};
776
856
777
857
qsl->UnloadSamplesFromRam (performance_set.set );
@@ -823,7 +903,7 @@ PerformanceSummary FindPeakPerformanceBinarySearch(
823
903
});
824
904
825
905
PerformanceResult m_pr (IssueQueries<scenario, TestMode::PerformanceOnly>(
826
- sut, m_settings, performance_set, sequence_gen));
906
+ sut, qsl, m_settings, performance_set, sequence_gen));
827
907
PerformanceSummary m_perf_summary{sut->Name (), m_settings, std::move (m_pr)};
828
908
829
909
std::string tmp;
@@ -868,7 +948,7 @@ void RunPerformanceMode(SystemUnderTest* sut, QuerySampleLibrary* qsl,
868
948
}
869
949
870
950
PerformanceResult pr (IssueQueries<scenario, TestMode::PerformanceOnly>(
871
- sut, settings, performance_set, sequence_gen));
951
+ sut, qsl, settings, performance_set, sequence_gen));
872
952
873
953
// Measure PerfClock/system_clock timer durations for comparison vs
874
954
// external timer.
@@ -991,7 +1071,7 @@ void FindPeakPerformanceMode(SystemUnderTest* sut, QuerySampleLibrary* qsl,
991
1071
LoadSamplesToRam (qsl, base_performance_set.set );
992
1072
993
1073
PerformanceResult base_pr (IssueQueries<scenario, TestMode::PerformanceOnly>(
994
- sut, base_settings, base_performance_set, sequence_gen));
1074
+ sut, qsl, base_settings, base_performance_set, sequence_gen));
995
1075
PerformanceSummary base_perf_summary{sut->Name (), base_settings,
996
1076
std::move (base_pr)};
997
1077
@@ -1113,7 +1193,7 @@ void RunAccuracyMode(SystemUnderTest* sut, QuerySampleLibrary* qsl,
1113
1193
}
1114
1194
1115
1195
PerformanceResult pr (IssueQueries<scenario, TestMode::AccuracyOnly>(
1116
- sut, settings, loadable_set, sequence_gen));
1196
+ sut, qsl, settings, loadable_set, sequence_gen));
1117
1197
1118
1198
{
1119
1199
auto tracer = MakeScopedTracer (
0 commit comments