Open3D (C++ API)
0.19.0
Toggle main menu visibility
Loading...
Searching...
No Matches
cpp
open3d
utility
ParallelScan.h
Go to the documentation of this file.
1
// ----------------------------------------------------------------------------
2
// - Open3D: www.open3d.org -
3
// ----------------------------------------------------------------------------
4
// Copyright (c) 2018-2024 www.open3d.org
5
// SPDX-License-Identifier: MIT
6
// ----------------------------------------------------------------------------
7
8
#pragma once
9
10
#include <tbb/parallel_for.h>
11
#include <tbb/parallel_scan.h>
12
13
namespace
open3d
{
14
namespace
utility
{
15
16
namespace
{
17
template
<
class
Tin,
class
Tout>
18
class
ScanSumBody {
19
Tout sum;
20
const
Tin* in;
21
Tout*
const
out;
22
23
public
:
24
ScanSumBody(Tout* out_,
const
Tin* in_) : sum(0), in(in_), out(out_) {}
25
Tout get_sum()
const
{
return
sum; }
26
27
template
<
class
Tag>
28
void
operator()(
const
tbb::blocked_range<size_t>& r, Tag) {
29
Tout temp = sum;
30
for
(
size_t
i = r.begin(); i < r.end(); ++i) {
31
temp = temp + in[i];
32
if
(Tag::is_final_scan()) out[i] = temp;
33
}
34
sum = temp;
35
}
36
ScanSumBody(ScanSumBody& b, tbb::split) : sum(0), in(b.in), out(b.out) {}
37
void
reverse_join(ScanSumBody& a) { sum = a.sum + sum; }
38
void
assign(ScanSumBody& b) { sum = b.sum; }
39
};
40
}
// namespace
41
42
template
<
class
Tin,
class
Tout>
43
void
InclusivePrefixSum
(
const
Tin* first,
const
Tin* last, Tout* out) {
44
ScanSumBody<Tin, Tout> body(out, first);
45
size_t
n = std::distance(first, last);
46
tbb::parallel_scan(tbb::blocked_range<size_t>(0, n), body);
47
}
48
49
}
// namespace utility
50
}
// namespace open3d
open3d::utility
Definition
Dispatch.h:91
open3d::utility::InclusivePrefixSum
void InclusivePrefixSum(const Tin *first, const Tin *last, Tout *out)
Definition
ParallelScan.h:43
open3d
Definition
PinholeCameraIntrinsic.cpp:16
Generated by
1.17.0