Skip to content

Commit fac284a

Browse files
committed
Introduce traccc::alpaka::queue and traccc::alpaka::vecmem_objects.
Meant as an example/guidance for Ryan Cross.
1 parent 369caa9 commit fac284a

File tree

7 files changed

+346
-0
lines changed

7 files changed

+346
-0
lines changed

device/alpaka/CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ traccc_add_alpaka_library( traccc_alpaka alpaka TYPE SHARED
3030
"include/traccc/alpaka/utils/make_prefix_sum_buff.hpp"
3131
"src/utils/make_prefix_sum_buff.cpp"
3232
"src/utils/get_device_info.cpp"
33+
"include/traccc/alpaka/utils/queue.hpp"
34+
"src/utils/queue.cpp"
35+
"src/utils/get_queue.hpp"
36+
"src/utils/get_queue.cpp"
37+
"include/traccc/alpaka/utils/vecmem_objects.hpp"
38+
"src/utils/vecmem_objects.cpp"
3339
# Clusterization
3440
"include/traccc/alpaka/clusterization/clusterization_algorithm.hpp"
3541
"src/clusterization/clusterization_algorithm.cpp"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
#pragma once
10+
11+
// System include(s).
12+
#include <cstddef>
13+
#include <limits>
14+
#include <memory>
15+
16+
namespace traccc::alpaka {
17+
18+
/// Owning wrapper around @c ::alpaka::Queue
19+
class queue {
20+
21+
public:
22+
/// Invalid/default device identifier
23+
static constexpr std::size_t INVALID_DEVICE =
24+
std::numeric_limits<std::size_t>::max();
25+
26+
/// Construct a new stream (possibly for a specified device)
27+
explicit queue(std::size_t device = INVALID_DEVICE);
28+
29+
/// Move constructor
30+
queue(queue&& parent) noexcept;
31+
32+
/// Destructor
33+
~queue();
34+
35+
/// Move assignment
36+
queue& operator=(queue&& rhs) noexcept;
37+
38+
/// Access a typeless pointer to the managed @c ::alpaka::Queue object
39+
void* alpakaQueue();
40+
/// Access a typeless pointer to the managed @c ::alpaka::Queue object
41+
const void* alpakaQueue() const;
42+
43+
/// Wait for all queued tasks from the stream to complete
44+
void synchronize();
45+
46+
private:
47+
/// Type holing the implementation
48+
struct impl;
49+
/// Smart pointer to the implementation
50+
std::unique_ptr<impl> m_impl;
51+
52+
}; // class queue
53+
54+
} // namespace traccc::alpaka
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
#pragma once
10+
11+
// Local include(s).
12+
#include "traccc/alpaka/utils/queue.hpp"
13+
14+
// VecMem include(s).
15+
#include <vecmem/memory/memory_resource.hpp>
16+
#include <vecmem/utils/copy.hpp>
17+
18+
namespace traccc::alpaka {
19+
20+
/// Helper class for instantiating the correct vecmem objects for the way
21+
/// the @c traccc::alpaka library was built.
22+
class vecmem_objects {
23+
24+
public:
25+
/// Constructor from a queue
26+
explicit vecmem_objects(queue& q);
27+
/// Move constructor
28+
vecmem_objects(vecmem_objects&&) noexcept;
29+
/// Destructor
30+
~vecmem_objects();
31+
32+
/// Move assignment
33+
vecmem_objects& operator=(vecmem_objects&&) noexcept;
34+
35+
/// The host memory resource to use
36+
vecmem::memory_resource& host_mr() const;
37+
/// The device memory resource to use
38+
vecmem::memory_resource& device_mr() const;
39+
/// The shared/managed memory resource to use
40+
vecmem::memory_resource& shared_mr() const;
41+
42+
/// The (synchronous) copy object to use
43+
vecmem::copy& copy() const;
44+
/// The asynchronous copy object to use
45+
vecmem::copy& async_copy() const;
46+
47+
private:
48+
/// Type holing the implementation
49+
struct impl;
50+
/// Smart pointer to the implementation
51+
std::unique_ptr<impl> m_impl;
52+
53+
}; // class vecmem_objects
54+
55+
} // namespace traccc::alpaka

device/alpaka/src/utils/get_queue.cpp

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
// Local include(s).
10+
#include "get_queue.hpp"
11+
12+
// System include(s).
13+
#include <cassert>
14+
15+
namespace traccc::alpaka::details {
16+
17+
Queue& get_queue(queue& q) {
18+
19+
assert(q.alpakaQueue() != nullptr);
20+
return *(reinterpret_cast<Queue*>(q.alpakaQueue()));
21+
}
22+
23+
const Queue& get_queue(const queue& q) {
24+
25+
assert(q.alpakaQueue() != nullptr);
26+
return *(reinterpret_cast<const Queue*>(q.alpakaQueue()));
27+
}
28+
29+
} // namespace traccc::alpaka::details

device/alpaka/src/utils/get_queue.hpp

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
#pragma once
10+
11+
// Local include(s).
12+
#include "traccc/alpaka/utils/queue.hpp"
13+
#include "utils.hpp"
14+
15+
namespace traccc::alpaka::details {
16+
17+
/// Helper function for getting a @c Queue out of @c queue (non-const)
18+
Queue& get_queue(queue& q);
19+
20+
/// Helper function for getting a @c Queue out of @c queue (const)
21+
const Queue& get_queue(const queue& q);
22+
23+
} // namespace traccc::alpaka::details

device/alpaka/src/utils/queue.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
// Local include(s).
10+
#include "traccc/alpaka/utils/queue.hpp"
11+
12+
#include "utils.hpp"
13+
14+
// Alpaka include(s).
15+
#include <alpaka/alpaka.hpp>
16+
17+
namespace traccc::alpaka {
18+
19+
struct queue::impl {
20+
21+
/// Constructor
22+
/// @param device The device to create the queue for
23+
explicit impl(std::size_t device)
24+
: m_queue(::alpaka::getDevByIdx(::alpaka::Platform<Acc>{}, device)) {}
25+
26+
/// The real Alpaka queue object
27+
Queue m_queue;
28+
29+
}; // struct queue::impl
30+
31+
queue::queue(std::size_t device) : m_impl{std::make_unique<impl>(device)} {}
32+
33+
queue::queue(queue&&) noexcept = default;
34+
35+
queue::~queue() = default;
36+
37+
queue& queue::operator=(queue&& rhs) noexcept = default;
38+
39+
void* queue::alpakaQueue() {
40+
41+
return &(m_impl->m_queue);
42+
}
43+
44+
const void* queue::alpakaQueue() const {
45+
46+
return &(m_impl->m_queue);
47+
}
48+
49+
void queue::synchronize() {
50+
51+
::alpaka::wait(m_impl->m_queue);
52+
}
53+
54+
} // namespace traccc::alpaka
+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/**
2+
* traccc library, part of the ACTS project (R&D line)
3+
*
4+
* (c) 2025 CERN for the benefit of the ACTS project
5+
*
6+
* Mozilla Public License Version 2.0
7+
*/
8+
9+
// Local include(s).
10+
#include "traccc/alpaka/utils/vecmem_objects.hpp"
11+
12+
#include "get_queue.hpp"
13+
14+
// VecMem include(s).
15+
#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED)
16+
#include <vecmem/memory/cuda/device_memory_resource.hpp>
17+
#include <vecmem/memory/cuda/host_memory_resource.hpp>
18+
#include <vecmem/memory/cuda/managed_memory_resource.hpp>
19+
#include <vecmem/utils/cuda/async_copy.hpp>
20+
#include <vecmem/utils/cuda/copy.hpp>
21+
#elif defined(ALPAKA_ACC_GPU_HIP_ENABLED)
22+
#include <vecmem/memory/hip/device_memory_resource.hpp>
23+
#include <vecmem/memory/hip/host_memory_resource.hpp>
24+
#include <vecmem/memory/hip/managed_memory_resource.hpp>
25+
#include <vecmem/utils/hip/copy.hpp>
26+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
27+
#include <vecmem/memory/sycl/device_memory_resource.hpp>
28+
#include <vecmem/memory/sycl/host_memory_resource.hpp>
29+
#include <vecmem/memory/sycl/shared_memory_resource.hpp>
30+
#include <vecmem/utils/sycl/async_copy.hpp>
31+
#include <vecmem/utils/sycl/copy.hpp>
32+
#else
33+
#include <vecmem/memory/host_memory_resource.hpp>
34+
#include <vecmem/utils/copy.hpp>
35+
#endif
36+
37+
namespace traccc::alpaka {
38+
39+
struct vecmem_objects::impl {
40+
41+
/// Constructor
42+
explicit impl([[maybe_unused]] queue& q)
43+
:
44+
#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED) || defined(ALPAKA_ACC_GPU_HIP_ENABLED)
45+
m_host_mr(),
46+
m_device_mr(::alpaka::getNativeHandle(
47+
::alpaka::getDev(details::get_queue(q)))),
48+
m_shared_mr(),
49+
m_copy(),
50+
m_async_copy(::alpaka::getNativeHandle(details::get_queue(q)))
51+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
52+
m_queue(::alpaka::getNativeHandle(details::get_queue(q))),
53+
m_host_mr(&m_queue),
54+
m_device_mr(&m_queue),
55+
m_shared_mr(&m_queue),
56+
m_copy(&m_queue),
57+
m_async_copy(&m_queue)
58+
#else
59+
m_host_mr(),
60+
m_device_mr(),
61+
m_shared_mr(),
62+
m_copy(),
63+
m_async_copy()
64+
#endif
65+
{
66+
}
67+
68+
#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED)
69+
vecmem::cuda::host_memory_resource m_host_mr;
70+
vecmem::cuda::device_memory_resource m_device_mr;
71+
vecmem::cuda::managed_memory_resource m_shared_mr;
72+
vecmem::cuda::copy m_copy;
73+
vecmem::cuda::async_copy m_async_copy;
74+
#elif defined(ALPAKA_ACC_GPU_HIP_ENABLED)
75+
vecmem::hip::host_memory_resource m_host_mr;
76+
vecmem::hip::device_memory_resource m_device_mr;
77+
vecmem::hip::managed_memory_resource m_shared_mr;
78+
vecmem::hip::copy m_copy;
79+
vecmem::hip::copy m_async_copy;
80+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
81+
::sycl::queue m_queue;
82+
vecmem::sycl::host_memory_resource m_host_mr;
83+
vecmem::sycl::device_memory_resource m_device_mr;
84+
vecmem::sycl::shared_memory_resource m_shared_mr;
85+
vecmem::sycl::copy m_copy;
86+
vecmem::sycl::async_copy m_async_copy;
87+
#else
88+
vecmem::host_memory_resource m_host_mr;
89+
vecmem::host_memory_resource m_device_mr;
90+
vecmem::host_memory_resource m_shared_mr;
91+
vecmem::copy m_copy;
92+
vecmem::copy m_async_copy;
93+
#endif
94+
95+
}; // struct vecmem_objects::impl
96+
97+
vecmem_objects::vecmem_objects(queue& q) : m_impl{std::make_unique<impl>(q)} {}
98+
99+
vecmem_objects::vecmem_objects(vecmem_objects&&) noexcept = default;
100+
101+
vecmem_objects::~vecmem_objects() = default;
102+
103+
vecmem_objects& vecmem_objects::operator=(vecmem_objects&&) noexcept = default;
104+
105+
vecmem::memory_resource& vecmem_objects::host_mr() const {
106+
return m_impl->m_host_mr;
107+
}
108+
109+
vecmem::memory_resource& vecmem_objects::device_mr() const {
110+
return m_impl->m_device_mr;
111+
}
112+
113+
vecmem::memory_resource& vecmem_objects::shared_mr() const {
114+
return m_impl->m_shared_mr;
115+
}
116+
117+
vecmem::copy& vecmem_objects::copy() const {
118+
return m_impl->m_copy;
119+
}
120+
121+
vecmem::copy& vecmem_objects::async_copy() const {
122+
return m_impl->m_async_copy;
123+
}
124+
125+
} // namespace traccc::alpaka

0 commit comments

Comments
 (0)