Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
cbmroot
Manage
Activity
Members
Labels
Plan
Wiki
Redmine
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Computing
cbmroot
Commits
282f8dbb
Commit
282f8dbb
authored
1 year ago
by
Felix Weiglhofer
Committed by
Dominik Smith
1 year ago
Browse files
Options
Downloads
Patches
Plain Diff
algo::Unpack: Replace ParallelSetup-struct with local variables. (Suggested by D. Smith)
parent
762a0281
No related branches found
Branches containing commit
No related tags found
Tags containing commit
Loading
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
algo/unpack/Unpack.cxx
+84
-97
84 additions, 97 deletions
algo/unpack/Unpack.cxx
algo/unpack/Unpack.h
+7
-23
7 additions, 23 deletions
algo/unpack/Unpack.h
with
91 additions
and
120 deletions
algo/unpack/Unpack.cxx
+
84
−
97
View file @
282f8dbb
...
...
@@ -26,18 +26,14 @@ namespace cbm::algo
CbmDigiTimeslice
&
digiTs
=
result
.
first
;
UnpackMonitorData
&
monitor
=
result
.
second
;
ParallelInit
(
*
timeslice
);
if
(
DetectorEnabled
(
fles
::
SubsystemIdentifier
::
STS
))
{
xpu
::
scoped_timer
t1
(
"STS"
);
xpu
::
t_add_bytes
(
fParallelStsSetup
.
sizeBytes
);
ParallelMsLoop
(
fParallelStsSetup
,
digiTs
.
fData
.
fSts
.
fDigis
,
monitor
.
fSts
,
*
timeslice
,
fAlgoSts
,
0x20
);
ParallelMsLoop
(
fles
::
SubsystemIdentifier
::
STS
,
digiTs
.
fData
.
fSts
.
fDigis
,
monitor
.
fSts
,
*
timeslice
,
fAlgoSts
,
0x20
);
}
if
(
DetectorEnabled
(
fles
::
SubsystemIdentifier
::
RPC
))
{
xpu
::
scoped_timer
t1
(
"TOF"
);
xpu
::
t_add_bytes
(
fParallelTofSetup
.
sizeBytes
);
ParallelMsLoop
(
fParallelTofSetup
,
digiTs
.
fData
.
fTof
.
fDigis
,
monitor
.
fTof
,
*
timeslice
,
fAlgoTof
,
0x00
);
ParallelMsLoop
(
fles
::
SubsystemIdentifier
::
RPC
,
digiTs
.
fData
.
fTof
.
fDigis
,
monitor
.
fTof
,
*
timeslice
,
fAlgoTof
,
0x00
);
}
// --- Component loop
...
...
@@ -98,6 +94,86 @@ namespace cbm::algo
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
std
::
pair
<
size_t
,
size_t
>
Unpack
::
ParallelInit
(
const
fles
::
Timeslice
&
ts
,
fles
::
SubsystemIdentifier
sysId
,
std
::
vector
<
u16
>&
msEqIds
,
std
::
vector
<
fles
::
MicrosliceDescriptor
>&
msDesc
,
std
::
vector
<
const
u8
*>&
msContent
)
{
size_t
numMs
=
0
;
size_t
sizeBytes
=
0
;
for
(
uint64_t
comp
=
0
;
comp
<
ts
.
num_components
();
comp
++
)
{
auto
systemId
=
static_cast
<
fles
::
SubsystemIdentifier
>
(
ts
.
descriptor
(
comp
,
0
).
sys_id
);
if
(
systemId
==
sysId
)
{
const
u64
numMsInComp
=
ts
.
num_microslices
(
comp
);
const
u16
componentId
=
ts
.
descriptor
(
comp
,
0
).
eq_id
;
sizeBytes
+=
ts
.
size_component
(
comp
);
numMs
+=
numMsInComp
;
for
(
u64
mslice
=
0
;
mslice
<
numMsInComp
;
mslice
++
)
{
uint64_t
msByteSize
=
ts
.
descriptor
(
comp
,
mslice
).
size
;
msEqIds
.
push_back
(
componentId
);
msDesc
.
push_back
(
ts
.
descriptor
(
comp
,
mslice
));
msContent
.
push_back
(
ts
.
content
(
comp
,
mslice
));
}
}
}
return
{
numMs
,
sizeBytes
};
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
template
<
class
Digi
,
class
UnpackAlgo
,
class
Monitor
>
void
Unpack
::
ParallelMsLoop
(
const
fles
::
SubsystemIdentifier
sysId
,
std
::
vector
<
Digi
>&
digisOut
,
std
::
vector
<
Monitor
>&
monitorOut
,
const
fles
::
Timeslice
&
ts
,
const
std
::
map
<
u16
,
UnpackAlgo
>&
algos
,
u8
sys_ver
)
{
xpu
::
scoped_timer
t_
(
fles
::
to_string
(
sysId
));
std
::
vector
<
u16
>
msEqIds
;
// equipment ids of microslices
std
::
vector
<
fles
::
MicrosliceDescriptor
>
msDesc
;
// microslice descriptors
std
::
vector
<
const
u8
*>
msContent
;
// pointer to microslice content
auto
[
numMs
,
sizeBytes
]
=
ParallelInit
(
ts
,
sysId
,
msEqIds
,
msDesc
,
msContent
);
std
::
vector
<
std
::
vector
<
Digi
>>
msDigis
(
numMs
);
// unpacked digis per microslice
std
::
vector
<
Monitor
>
monitor
(
numMs
);
// unpacking monitoring data per microslice
xpu
::
t_add_bytes
(
sizeBytes
);
xpu
::
push_timer
(
"Unpack"
);
#pragma omp parallel for schedule(dynamic)
for
(
size_t
i
=
0
;
i
<
numMs
;
i
++
)
{
auto
result
=
algos
.
at
(
msEqIds
[
i
])(
msContent
[
i
],
msDesc
[
i
],
ts
.
start_time
());
msDigis
[
i
]
=
std
::
move
(
result
.
first
);
monitor
[
i
]
=
std
::
move
(
result
.
second
);
}
xpu
::
pop_timer
();
size_t
nDigisTotal
=
0
;
for
(
const
auto
&
digis
:
msDigis
)
{
nDigisTotal
+=
digis
.
size
();
}
xpu
::
push_timer
(
"Resize"
);
digisOut
.
resize
(
nDigisTotal
);
xpu
::
pop_timer
();
xpu
::
push_timer
(
"Merge"
);
#pragma omp parallel for schedule(dynamic)
for
(
unsigned
int
i
=
0
;
i
<
numMs
;
i
++
)
{
unsigned
int
offset
=
0
;
for
(
unsigned
int
x
=
0
;
x
<
i
;
x
++
)
offset
+=
msDigis
[
x
].
size
();
std
::
copy
(
msDigis
[
i
].
begin
(),
msDigis
[
i
].
end
(),
digisOut
.
begin
()
+
offset
);
}
xpu
::
pop_timer
();
monitorOut
=
std
::
move
(
monitor
);
}
// ----------------------------------------------------------------------------
// ----------------- Microslice loop ------------------------------------------
template
<
class
Digi
,
class
UnpackAlgo
,
class
MonitorData
>
void
Unpack
::
MsLoop
(
const
fles
::
Timeslice
*
timeslice
,
std
::
map
<
uint16_t
,
UnpackAlgo
>&
algoMap
,
const
uint64_t
comp
,
...
...
@@ -313,95 +389,6 @@ namespace cbm::algo
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
void
Unpack
::
ParallelInit
(
const
fles
::
Timeslice
&
timeslice
)
{
xpu
::
scoped_timer
t
(
"ParallelInit"
);
fParallelStsSetup
=
{};
fParallelTofSetup
=
{};
for
(
uint64_t
comp
=
0
;
comp
<
timeslice
.
num_components
();
comp
++
)
{
auto
systemId
=
static_cast
<
fles
::
SubsystemIdentifier
>
(
timeslice
.
descriptor
(
comp
,
0
).
sys_id
);
switch
(
systemId
)
{
case
fles
::
SubsystemIdentifier
::
STS
:
ParallelInitComponent
(
fParallelStsSetup
,
timeslice
,
comp
);
break
;
case
fles
::
SubsystemIdentifier
::
RPC
:
ParallelInitComponent
(
fParallelTofSetup
,
timeslice
,
comp
);
break
;
default:
break
;
}
}
fParallelStsSetup
.
msDigis
.
resize
(
fParallelStsSetup
.
numMs
);
fParallelStsSetup
.
msMonitorData
.
resize
(
fParallelStsSetup
.
numMs
);
fParallelTofSetup
.
msDigis
.
resize
(
fParallelTofSetup
.
numMs
);
fParallelTofSetup
.
msMonitorData
.
resize
(
fParallelTofSetup
.
numMs
);
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
template
<
class
Digi
,
class
Monitor
>
void
Unpack
::
ParallelInitComponent
(
ParallelSetup
<
Digi
,
Monitor
>&
setup
,
const
fles
::
Timeslice
&
timeslice
,
u64
component
)
{
auto
&
msDesc
=
setup
.
msDescriptors
;
auto
&
msEqIds
=
setup
.
msEquipmentIds
;
auto
&
msContent
=
setup
.
msContent
;
u64
numMsInComp
=
timeslice
.
num_microslices
(
component
);
u16
componentId
=
timeslice
.
descriptor
(
component
,
0
).
eq_id
;
setup
.
sizeBytes
+=
timeslice
.
size_component
(
component
);
setup
.
numMs
+=
numMsInComp
;
for
(
u64
mslice
=
0
;
mslice
<
numMsInComp
;
mslice
++
)
{
uint64_t
msByteSize
=
timeslice
.
descriptor
(
component
,
mslice
).
size
;
msEqIds
.
push_back
(
componentId
);
msDesc
.
push_back
(
timeslice
.
descriptor
(
component
,
mslice
));
msContent
.
push_back
(
timeslice
.
content
(
component
,
mslice
));
}
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
template
<
class
Digi
,
class
UnpackAlgo
,
class
Monitor
>
void
Unpack
::
ParallelMsLoop
(
ParallelSetup
<
Digi
,
Monitor
>&
setup
,
std
::
vector
<
Digi
>&
digisOut
,
std
::
vector
<
Monitor
>&
monitorOut
,
const
fles
::
Timeslice
&
ts
,
const
std
::
map
<
u16
,
UnpackAlgo
>&
algos
,
u8
sys_ver
)
{
const
auto
&
msContent
=
setup
.
msContent
;
const
auto
&
msDesc
=
setup
.
msDescriptors
;
const
auto
&
msEqIds
=
setup
.
msEquipmentIds
;
auto
&
monitor
=
setup
.
msMonitorData
;
auto
&
msDigis
=
setup
.
msDigis
;
size_t
numMs
=
msDigis
.
size
();
xpu
::
push_timer
(
"Unpack"
);
#pragma omp parallel for schedule(dynamic)
for
(
size_t
i
=
0
;
i
<
numMs
;
i
++
)
{
auto
result
=
algos
.
at
(
msEqIds
[
i
])(
msContent
[
i
],
msDesc
[
i
],
ts
.
start_time
());
msDigis
[
i
]
=
std
::
move
(
result
.
first
);
monitor
[
i
]
=
std
::
move
(
result
.
second
);
}
xpu
::
pop_timer
();
size_t
nDigisTotal
=
0
;
for
(
const
auto
&
digis
:
msDigis
)
{
nDigisTotal
+=
digis
.
size
();
}
xpu
::
push_timer
(
"Resize"
);
digisOut
.
resize
(
nDigisTotal
);
xpu
::
pop_timer
();
xpu
::
push_timer
(
"Merge"
);
#pragma omp parallel for schedule(dynamic)
for
(
unsigned
int
i
=
0
;
i
<
numMs
;
i
++
)
{
unsigned
int
offset
=
0
;
for
(
unsigned
int
x
=
0
;
x
<
i
;
x
++
)
offset
+=
msDigis
[
x
].
size
();
std
::
copy
(
msDigis
[
i
].
begin
(),
msDigis
[
i
].
end
(),
digisOut
.
begin
()
+
offset
);
}
xpu
::
pop_timer
();
monitorOut
=
std
::
move
(
monitor
);
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
template
<
class
Digi
>
...
...
This diff is collapsed.
Click to expand it.
algo/unpack/Unpack.h
+
7
−
23
View file @
282f8dbb
...
...
@@ -130,18 +130,6 @@ namespace cbm::algo
return
std
::
find
(
fSubIds
.
begin
(),
fSubIds
.
end
(),
subId
)
!=
fSubIds
.
end
();
}
private
:
// types
template
<
class
Digi
,
class
Monitor
>
struct
ParallelSetup
{
size_t
numMs
=
0
;
//< number of microslices to unpack
size_t
sizeBytes
=
0
;
// total size of microslices in bytes
std
::
vector
<
u16
>
msEquipmentIds
;
//< equipment ids of microslices
std
::
vector
<
fles
::
MicrosliceDescriptor
>
msDescriptors
;
//< microslice descriptors
std
::
vector
<
const
u8
*>
msContent
;
//< pointer to microslice content
std
::
vector
<
std
::
vector
<
Digi
>>
msDigis
;
//< unpacked digis per microslice
std
::
vector
<
Monitor
>
msMonitorData
;
//< unpacking monitoring data per microslice
};
private
:
// methods
/** @brief Microslice loop **/
template
<
class
Digi
,
class
UnpackAlgo
,
class
MonitorData
>
...
...
@@ -149,16 +137,15 @@ namespace cbm::algo
const
uint16_t
eqId
,
std
::
vector
<
Digi
>*
digis
,
UnpackMonitorData
&
monitor
,
std
::
vector
<
MonitorData
>*
monitorMs
,
uint8_t
sys_ver
);
/** Init parallel unpacker */
void
ParallelInit
(
const
fles
::
Timeslice
&
timeslice
);
template
<
class
Digi
,
class
Monitor
>
void
ParallelInitComponent
(
ParallelSetup
<
Digi
,
Monitor
>&
setup
,
const
fles
::
Timeslice
&
timeslice
,
u64
component
);
/** @brief Parallel microslice loop **/
template
<
class
Digi
,
class
UnpackAlgo
,
class
Monitor
>
void
ParallelMsLoop
(
ParallelSetup
<
Digi
,
Monitor
>&
setup
,
std
::
vector
<
Digi
>&
digisOut
,
std
::
vector
<
Monitor
>&
monitor
,
const
fles
::
Timeslice
&
ts
,
const
std
::
map
<
u16
,
UnpackAlgo
>&
algos
,
u8
sys_ver
);
void
ParallelMsLoop
(
const
fles
::
SubsystemIdentifier
sysId
,
std
::
vector
<
Digi
>&
digisOut
,
std
::
vector
<
Monitor
>&
monitor
,
const
fles
::
Timeslice
&
ts
,
const
std
::
map
<
u16
,
UnpackAlgo
>&
algos
,
u8
sys_ver
);
std
::
pair
<
size_t
,
size_t
>
ParallelInit
(
const
fles
::
Timeslice
&
ts
,
fles
::
SubsystemIdentifier
sysId
,
std
::
vector
<
u16
>&
eqIds
,
std
::
vector
<
fles
::
MicrosliceDescriptor
>&
msDesc
,
std
::
vector
<
const
u8
*>&
msContent
);
/** @brief Sort Digis and add bytes to timer for throughput */
template
<
class
Digi
>
...
...
@@ -196,9 +183,6 @@ namespace cbm::algo
{
fles
::
SubsystemIdentifier
::
RICH
,
100
},
{
fles
::
SubsystemIdentifier
::
RPC
,
40
},
{
fles
::
SubsystemIdentifier
::
T0
,
0
},
{
fles
::
SubsystemIdentifier
::
TRD
,
1300
},
{
fles
::
SubsystemIdentifier
::
TRD2D
,
-
510
}};
/** @brief Parallel STS Setup */
ParallelSetup
<
sts
::
Digi
,
UnpackStsMonitorData
>
fParallelStsSetup
=
{};
ParallelSetup
<
CbmTofDigi
,
UnpackTofMonitorData
>
fParallelTofSetup
=
{};
};
}
// namespace cbm::algo
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment