Fix min, max aggregate functions merge

This commit is contained in:
Maksim Kita 2021-06-15 13:35:23 +03:00
parent 30021f0335
commit 61a5c4f493
4 changed files with 144 additions and 27 deletions

View File

@ -48,42 +48,44 @@ public:
bool isCompilable() const override
{
bool can_be_compiled = Base::isCompilable();
can_be_compiled &= canBeNativeType<Weight>();
/// TODO: FIX
// bool can_be_compiled = Base::isCompilable();
// can_be_compiled &= canBeNativeType<Weight>();
return can_be_compiled;
return false;
}
void compileAdd(llvm::IRBuilderBase & builder, llvm::Value * aggregate_data_ptr, const DataTypes & arguments_types, const std::vector<llvm::Value *> & argument_values) const override
{
llvm::IRBuilder<> & b = static_cast<llvm::IRBuilder<> &>(builder);
// void compileAdd(llvm::IRBuilderBase & builder, llvm::Value * aggregate_data_ptr, const DataTypes & arguments_types, const std::vector<llvm::Value *> & argument_values) const override
// {
/// TODO: FIX
// llvm::IRBuilder<> & b = static_cast<llvm::IRBuilder<> &>(builder);
auto * numerator_type = toNativeType<Numerator>(b);
// auto * numerator_type = toNativeType<Numerator>(b);
auto * numerator_ptr = b.CreatePointerCast(aggregate_data_ptr, numerator_type->getPointerTo());
auto * numerator_value = b.CreateLoad(numerator_type, numerator_ptr);
// auto * numerator_ptr = b.CreatePointerCast(aggregate_data_ptr, numerator_type->getPointerTo());
// auto * numerator_value = b.CreateLoad(numerator_type, numerator_ptr);
const auto & argument = nativeCast(b, arguments_types[0], argument_values[0], numerator_type);
const auto & weight = nativeCast(b, arguments_types[1], argument_values[1], numerator_type);
// const auto & argument = nativeCast(b, arguments_types[0], argument_values[0], numerator_type);
// const auto & weight = nativeCast(b, arguments_types[1], argument_values[1], numerator_type);
llvm::Value * value_weight_multiplication = argument->getType()->isIntegerTy() ? b.CreateMul(argument, weight) : b.CreateFMul(argument, weight);
// llvm::Value * value_weight_multiplication = argument->getType()->isIntegerTy() ? b.CreateMul(argument, weight) : b.CreateFMul(argument, weight);
/// TODO: Fix accuracy
auto * numerator_result_value = numerator_type->isIntegerTy() ? b.CreateAdd(numerator_value, value_weight_multiplication) : b.CreateFAdd(numerator_value, value_weight_multiplication);
b.CreateStore(numerator_result_value, numerator_ptr);
// /// TODO: Fix accuracy
// auto * numerator_result_value = numerator_type->isIntegerTy() ? b.CreateAdd(numerator_value, value_weight_multiplication) : b.CreateFAdd(numerator_value, value_weight_multiplication);
// b.CreateStore(numerator_result_value, numerator_ptr);
auto * denominator_type = toNativeType<Denominator>(b);
// auto * denominator_type = toNativeType<Denominator>(b);
auto * denominator_offset_ptr = b.CreateConstGEP1_32(nullptr, aggregate_data_ptr, sizeof(Numerator));
auto * denominator_ptr = b.CreatePointerCast(denominator_offset_ptr, denominator_type->getPointerTo());
// auto * denominator_offset_ptr = b.CreateConstGEP1_32(nullptr, aggregate_data_ptr, sizeof(Numerator));
// auto * denominator_ptr = b.CreatePointerCast(denominator_offset_ptr, denominator_type->getPointerTo());
auto * weight_cast_to_denominator = nativeCast(b, arguments_types[1], argument_values[1], numerator_type);
// auto * weight_cast_to_denominator = nativeCast(b, arguments_types[1], argument_values[1], numerator_type);
auto * denominator_value = b.CreateLoad(denominator_type, denominator_ptr);
auto * denominator_value_updated = denominator_type->isIntegerTy() ? b.CreateAdd(denominator_value, weight_cast_to_denominator) : b.CreateFAdd(denominator_value, weight_cast_to_denominator);
// auto * denominator_value = b.CreateLoad(denominator_type, denominator_ptr);
// auto * denominator_value_updated = denominator_type->isIntegerTy() ? b.CreateAdd(denominator_value, weight_cast_to_denominator) : b.CreateFAdd(denominator_value, weight_cast_to_denominator);
b.CreateStore(denominator_value_updated, denominator_ptr);
}
// b.CreateStore(denominator_value_updated, denominator_ptr);
// }
#endif

View File

@ -391,16 +391,16 @@ public:
if constexpr (is_less)
{
if (value_src->getType()->isIntegerTy())
should_change_after_comparison = is_signed ? b.CreateICmpSLT(value_dst, value_src) : b.CreateICmpULT(value_dst, value_src);
should_change_after_comparison = is_signed ? b.CreateICmpSLT(value_src, value_dst) : b.CreateICmpULT(value_src, value_dst);
else
should_change_after_comparison = b.CreateFCmpOLT(value_dst, value_src);
should_change_after_comparison = b.CreateFCmpOLT(value_src, value_dst);
}
else
{
if (value_src->getType()->isIntegerTy())
should_change_after_comparison = is_signed ? b.CreateICmpSGT(value_dst, value_src) : b.CreateICmpUGT(value_dst, value_src);
should_change_after_comparison = is_signed ? b.CreateICmpSGT(value_src, value_dst) : b.CreateICmpUGT(value_src, value_dst);
else
should_change_after_comparison = b.CreateFCmpOGT(value_dst, value_src);
should_change_after_comparison = b.CreateFCmpOGT(value_src, value_dst);
}
b.CreateCondBr(b.CreateAnd(has_value_src, b.CreateOr(b.CreateNot(has_value_dst), should_change_after_comparison)), if_should_change, if_should_not_change);

View File

@ -0,0 +1,86 @@
Aggregation using JIT compilation
Simple functions
1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844
732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723
598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875
792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586
3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69
25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086
716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72
59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42
33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555
800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62
20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63
25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16
23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38
14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36
32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7
22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4
170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8
11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8
63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88
29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34
Simple functions if combinator
1704509 4611700827100483880 9223310246721229500 16398241567152875142 62618822667209.71
732797 4611721382223060002 9223355550934604746 16281585268876620522 68472164943295.68
598875 4611701407242345792 9223362250391155632 3577699408183553052 21300140553347.42
792887 4611699550286611812 9223164887726235740 7088177025760385824 56461952267903.89
3807842 4611710821592843606 9223283397553859544 5756765290752687660 58835559208469.4
25703952 4611784761593342388 9223241341744449690 4782279928971192568 65182094768443.91
716829 4611852156092872082 9223361623076951140 8613712481895484190 191445613359755.62
59183 4611730685242027332 9223354909338698162 18369075291092794110 429013599530392
33010362 4611704682869732882 9223092117352620518 9991152681891671022 257099731913529.5
800784 4611752907938305166 9223309994342931384 5251877538869750510 135472890315726.03
20810645 4611712185532639162 9223218900001937412 11803718472901310700 323593455407553
25843850 4611744529689964352 9223346023778617822 127137885677350808 3700925266420.715
23447120 4611796031755620254 9223329309291309758 1841522159325376278 54534534450526.42
14739804 4611762063154116632 9223007205463222212 16302703534054321116 506987919332451.8
32077710 4612033458080771112 9223352444952988904 421072759851674408 13955745719596.793
22446879 4611846229717089436 9223124373140579096 6577134317587565298 224866980668999.47
170282 4611833225706935900 9223371583739401906 15764226366913732386 551447384017691
11482817 4611990575414646848 9223302669582414438 9828522700609834800 378121905921203.2
63469 4612175339998036670 9222961628400798084 17239621485933250238 663164390134376.5
29103473 4611744585914335132 9223035551850347954 12590190375872647672 525927999326314.7
Aggregation without JIT compilation
Simple functions
1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844
732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723
598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875
792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586
3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69
25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086
716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72
59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42
33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555
800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62
20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63
25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16
23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38
14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36
32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7
22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4
170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8
11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8
63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88
29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34
Simple functions if combinator
1704509 4611700827100483880 9223310246721229500 16398241567152875142 62618822667209.71
732797 4611721382223060002 9223355550934604746 16281585268876620522 68472164943295.68
598875 4611701407242345792 9223362250391155632 3577699408183553052 21300140553347.42
792887 4611699550286611812 9223164887726235740 7088177025760385824 56461952267903.89
3807842 4611710821592843606 9223283397553859544 5756765290752687660 58835559208469.4
25703952 4611784761593342388 9223241341744449690 4782279928971192568 65182094768443.91
716829 4611852156092872082 9223361623076951140 8613712481895484190 191445613359755.62
59183 4611730685242027332 9223354909338698162 18369075291092794110 429013599530392
33010362 4611704682869732882 9223092117352620518 9991152681891671022 257099731913529.5
800784 4611752907938305166 9223309994342931384 5251877538869750510 135472890315726.03
20810645 4611712185532639162 9223218900001937412 11803718472901310700 323593455407553
25843850 4611744529689964352 9223346023778617822 127137885677350808 3700925266420.715
23447120 4611796031755620254 9223329309291309758 1841522159325376278 54534534450526.42
14739804 4611762063154116632 9223007205463222212 16302703534054321116 506987919332451.8
32077710 4612033458080771112 9223352444952988904 421072759851674408 13955745719596.793
22446879 4611846229717089436 9223124373140579096 6577134317587565298 224866980668999.47
170282 4611833225706935900 9223371583739401906 15764226366913732386 551447384017691
11482817 4611990575414646848 9223302669582414438 9828522700609834800 378121905921203.2
63469 4612175339998036670 9222961628400798084 17239621485933250238 663164390134376.5
29103473 4611744585914335132 9223035551850347954 12590190375872647672 525927999326314.7

View File

@ -0,0 +1,29 @@
SET compile_aggregate_expressions = 1;
SET min_count_to_compile_aggregate_expression = 0;
SELECT 'Aggregation using JIT compilation';
SELECT 'Simple functions';
SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), avg(WatchID) FROM test.hits
GROUP BY CounterID ORDER BY count() DESC LIMIT 20;
SELECT 'Simple functions if combinator';
WITH (WatchID % 2 == 0) AS predicate
SELECT CounterID, minIf(WatchID,predicate), maxIf(WatchID, predicate), sumIf(WatchID, predicate), avgIf(WatchID, predicate) FROM test.hits
GROUP BY CounterID ORDER BY count() DESC LIMIT 20;
SET compile_aggregate_expressions = 0;
SELECT 'Aggregation without JIT compilation';
SELECT 'Simple functions';
SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), avg(WatchID) FROM test.hits
GROUP BY CounterID ORDER BY count() DESC LIMIT 20;
SELECT 'Simple functions if combinator';
WITH (WatchID % 2 == 0) AS predicate
SELECT CounterID, minIf(WatchID,predicate), maxIf(WatchID, predicate), sumIf(WatchID, predicate), avgIf(WatchID, predicate) FROM test.hits
GROUP BY CounterID ORDER BY count() DESC LIMIT 20;