ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-8113: [C++] Lighter weight variant<> - #8472

Closed
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh
Closed

ARROW-8113: [C++] Lighter weight variant<>#8472
bkietz wants to merge 6 commits into
apache:masterfrom
bkietz:8113-Implement-a-lighter-weigh

Conversation

@bkietz

@bkietzbkietz commented Oct 15, 2020

Copy link
Copy Markdown
Member
  • Unit tests for util::Variant<>
  • Compilation time and code size comparison to ensure this refactoring is beneficial
  • Benchmark comparison to ensure compute and nested parquet are not impacted
  • More docstrings and comments

Locally (release build, no ccache):

$ ninja
ninja: no work to do.
$ export OBJS=`ls src/arrow/CMakeFiles/arrow_objlib.dir/compute/**/*.o`
$ git checkout master && rm $OBJS && time ninja $OBJS
real 0m16.918s
user 2m41.702s
sys 0m2.495s
$ du -h --total $OBJS | tail -n 1
total 7.3M
$ git checkout 8113-Implement-a-lighter-weigh && rm $OBJS && time ninja $OBJS
real 0m14.363s
user 2m19.939s
sys 0m2.125s
$ du -h --total $OBJS | tail -n 1
6.6M total

@bkietz
bkietz requested a review from pitrouOctober 15, 2020 17:51
@github-actions

Copy link
Copy Markdown

Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment threadcpp/src/arrow/util/variant.h Outdated
Comment on lines 208 to 212

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might want to borrow this idiom to disable copy construction for Result<std::unique_ptr<T>>

@emkornfield

Copy link
Copy Markdown
Contributor

drive by comment. just want to make sure we aren't using the same idioms for variant (i.e. they are compatible with C++ std)?

@bkietz

Copy link
Copy Markdown
MemberAuthor

@emkornfield I'm implementing a subset of std::variant's functionality but all members which are present are compatible; if we switch to using std::variant at some point no code will break. We will need to keep the mutable-pointer visit overload since that's non standard, but IMHO that's acceptable overhead

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 2bfbb41 to 1875ff2CompareOctober 19, 2020 18:27
@kszucs
kszucsforce-pushed the 8113-Implement-a-lighter-weigh branch from 1875ff2 to 27560d0CompareOctober 19, 2020 22:33
@wesm

wesm commented Oct 20, 2020

Copy link
Copy Markdown
Member

@bkietz presumably this yields smaller code size, too?

@bkietz

Copy link
Copy Markdown
MemberAuthor

Updated description with build times and code sizes for a release build

@pitrou

Copy link
Copy Markdown
Member

This seems to speed up the compute layer a bit.

  • Before:
ArrayArrayKernel<Add, Int64Type>/32768/100 3781 ns 3780 ns 738685 bytes_per_second=8.07385G/s items_per_second=1083.65M/s null_percent=1 size=32.768k
  • After:
ArrayArrayKernel<Add, Int64Type>/32768/100 3615 ns 3614 ns 777365 bytes_per_second=8.44344G/s items_per_second=1.13326G/s null_percent=1 size=32.768k

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you plan to update this?

@bkietz
bkietzforce-pushed the 8113-Implement-a-lighter-weigh branch from 27560d0 to 40430afCompareNovember 11, 2020 20:21
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou yes but not soon

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 40430af to a03eb14CompareNovember 30, 2020 13:32
@pitrou

Copy link
Copy Markdown
Member

Rebased, I'm writing some micro-benchmarks.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from a03eb14 to c1b3a75CompareNovember 30, 2020 15:34
@pitroupitrou changed the title ARROW-8113: [C++][WIP] Lighter weight variant<>ARROW-8113: [C++] Lighter weight variant<>Nov 30, 2020
@pitrou

Copy link
Copy Markdown
Member

Variant benchmarks:

  • before:
ConstructTrivialVariant 13290 ns 13287 ns 52532 items_per_second=752.595M/s
ConstructNonTrivialVariant 111230 ns 111215 ns 6202 items_per_second=89.916M/s
VisitTrivialVariant 25744 ns 25740 ns 27269 items_per_second=388.497M/s
VisitNonTrivialVariant 24389 ns 24385 ns 28649 items_per_second=410.082M/s
ConstructDatum 102925 ns 102911 ns 7190 items_per_second=97.1714M/s
VisitDatum 6204 ns 6204 ns 112708 items_per_second=1.61199G/s
  • after:
ConstructTrivialVariant 13952 ns 13951 ns 50116 items_per_second=716.811M/s
ConstructNonTrivialVariant 108507 ns 108489 ns 6412 items_per_second=92.1753M/s
VisitTrivialVariant 5848 ns 5847 ns 119628 items_per_second=1.71014G/s
VisitNonTrivialVariant 5973 ns 5972 ns 118440 items_per_second=1.6745G/s
ConstructDatum 98938 ns 98923 ns 7038 items_per_second=101.088M/s
VisitDatum 5566 ns 5565 ns 125741 items_per_second=1.79701G/s

@pitrou

Copy link
Copy Markdown
Member

Compute overhead benchmarks:

  • before:
BM_CastDispatch 971704 ns 971533 ns 698 items_per_second=1054k/s
BM_CastDispatchBaseline 97365 ns 97352 ns 6955 items_per_second=10.5185M/s
BM_AddDispatch 165 ns 165 ns 4232825 items_per_second=6.07671M/s
BM_ExecuteScalarFunctionOnScalar 4666801 ns 4665955 ns 149 items_per_second=2.14318M/s
BM_ExecuteScalarKernelOnScalar 809563 ns 809419 ns 849 items_per_second=12.3545M/s
  • after:
BM_CastDispatch 914006 ns 913869 ns 759 items_per_second=1.12051M/s
BM_CastDispatchBaseline 95985 ns 95973 ns 7287 items_per_second=10.6697M/s
BM_AddDispatch 167 ns 167 ns 4137185 items_per_second=5.99082M/s
BM_ExecuteScalarFunctionOnScalar 4345926 ns 4345337 ns 161 items_per_second=2.30132M/s
BM_ExecuteScalarKernelOnScalar 847525 ns 847411 ns 835 items_per_second=11.8007M/s

@pitrou

Copy link
Copy Markdown
Member

@bkietz Do you know why all Github CI checks are skipped here?

@pitrou

Copy link
Copy Markdown
Member

AppVeyor seems to indicate that MSVC isn't picking up / implementing the copy constructor correctly :-(

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch 2 times, most recently from 16a69ec to 9a725a6CompareDecember 1, 2020 19:55
@pitrou

Copy link
Copy Markdown
Member

@bkietz You may want to review the changes I've done. I think only docs and comments remain to be done.

@pitrou

Copy link
Copy Markdown
Member

I added some docstrings. I think this is ready now.

@pitrou

Copy link
Copy Markdown
Member

Hmm, I forgot to push some changes...

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 9ab2798 to 50cef42CompareDecember 3, 2020 16:46
@bkietz

Copy link
Copy Markdown
MemberAuthor

@pitrou thanks for picking this up! Looks good to me

@pitrou

Copy link
Copy Markdown
Member

Ok, I'll rebase a last time to make sure this doesn't break anything.

@pitrou
pitrouforce-pushed the 8113-Implement-a-lighter-weigh branch from 50cef42 to 168aa54CompareDecember 8, 2020 09:50
@pitroupitrou closed this in 6c831cdDec 8, 2020
@kou

kou commented Dec 9, 2020

Copy link
Copy Markdown
Member

I don't know why but It seems that this causes g++ 9 crash:

https://github.com/ursa-labs/crossbow/runs/1522097163#step:4:1237

during GIMPLE pass: pre
In file included from /usr/include/c++/9/functional:59,
from /arrow/cpp/src/arrow/vendored/string_view.hpp:1480,
from /arrow/cpp/src/arrow/util/string_view.h:25,
from /arrow/cpp/src/arrow/buffer.h:31,
from /arrow/cpp/src/arrow/array/data.h:26,
from /arrow/cpp/src/arrow/array/array_base.h:26,
from /arrow/cpp/src/arrow/array/builder_binary.h:30,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:26,
from /arrow/cpp/src/arrow/compute/kernels/codegen_internal.cc:18:
/usr/include/c++/9/bits/std_function.h: In static member function 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes&& ...) [with _Functor = arrow::compute::internal::MakeFlippedBinaryExec(arrow::compute::ArrayKernelExec)::<lambda(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*)>; _ArgTypes = {arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*}]':
/usr/include/c++/9/bits/std_function.h:298:7: internal compiler error: Segmentation fault
298 | _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
| ^~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-9/README.Bugs> for instructions.
make[2]: *** [src/arrow/CMakeFiles/arrow_objlib.dir/build.make:1610: src/arrow/CMakeFiles/arrow_objlib.dir/compute/kernels/codegen_internal.cc.o] Error 1

We can reproduce this on local:

(cd cpp/examples/minimal_build && docker-compose build static && docker-compose run --rm static)

@kou

kou commented Dec 10, 2020

Copy link
Copy Markdown
Member

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@bkietz@emkornfield@wesm@pitrou@kou