Skip to content

Commit fcb7faf

Browse files
committed
Introduce traccc::alpaka::queue and traccc::alpaka::vecmem_objects.
Meant as an example/guidance for Ryan Cross.
1 parent 7911e66 commit fcb7faf

File tree

7 files changed

+347
-0
lines changed

7 files changed

+347
-0
lines changed

device/alpaka/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
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"
Lines changed: 54 additions & 0 deletions
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);
31+
32+
/// Destructor
33+
~queue();
34+
35+
/// Move assignment
36+
queue& operator=(queue&& rhs);
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
Lines changed: 55 additions & 0 deletions
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&&);
29+
/// Destructor
30+
~vecmem_objects();
31+
32+
/// Move assignment
33+
vecmem_objects& operator=(vecmem_objects&&);
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

Lines changed: 29 additions & 0 deletions
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

Lines changed: 23 additions & 0 deletions
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

Lines changed: 54 additions & 0 deletions
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+
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&&) = default;
34+
35+
queue::~queue() = default;
36+
37+
queue& queue::operator=(queue&& rhs) = 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
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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/async_copy.hpp>
26+
#include <vecmem/utils/hip/copy.hpp>
27+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
28+
#include <vecmem/memory/sycl/device_memory_resource.hpp>
29+
#include <vecmem/memory/sycl/host_memory_resource.hpp>
30+
#include <vecmem/memory/sycl/shared_memory_resource.hpp>
31+
#include <vecmem/utils/sycl/async_copy.hpp>
32+
#include <vecmem/utils/sycl/copy.hpp>
33+
#else
34+
#include <vecmem/memory/host_memory_resource.hpp>
35+
#include <vecmem/utils/copy.hpp>
36+
#endif
37+
38+
namespace traccc::alpaka {
39+
40+
struct vecmem_objects::impl {
41+
42+
/// Constructor
43+
impl([[maybe_unused]] queue& q)
44+
:
45+
#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED) || defined(ALPAKA_ACC_GPU_HIP_ENABLED)
46+
m_host_mr(),
47+
m_device_mr(::alpaka::getNativeHandle(
48+
::alpaka::getDev(details::get_queue(q)))),
49+
m_shared_mr(),
50+
m_copy(),
51+
m_async_copy(::alpaka::getNativeHandle(details::get_queue(q)))
52+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
53+
m_queue(::alpaka::getNativeHandle(details::get_queue(q))),
54+
m_host_mr(&m_queue),
55+
m_device_mr(&m_queue),
56+
m_shared_mr(&m_queue),
57+
m_copy(&m_queue),
58+
m_async_copy(&m_queue)
59+
#else
60+
m_host_mr(),
61+
m_device_mr(),
62+
m_shared_mr(),
63+
m_copy(),
64+
m_async_copy()
65+
#endif
66+
{
67+
}
68+
69+
#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED)
70+
vecmem::cuda::host_memory_resource m_host_mr;
71+
vecmem::cuda::device_memory_resource m_device_mr;
72+
vecmem::cuda::managed_memory_resource m_shared_mr;
73+
vecmem::cuda::copy m_copy;
74+
vecmem::cuda::async_copy m_async_copy;
75+
#elif defined(ALPAKA_ACC_GPU_HIP_ENABLED)
76+
vecmem::hip::host_memory_resource m_host_mr;
77+
vecmem::hip::device_memory_resource m_device_mr;
78+
vecmem::hip::managed_memory_resource m_shared_mr;
79+
vecmem::hip::copy m_copy;
80+
vecmem::hip::async_copy m_async_copy;
81+
#elif defined(ALPAKA_ACC_SYCL_ENABLED)
82+
::sycl::queue m_queue;
83+
vecmem::sycl::host_memory_resource m_host_mr;
84+
vecmem::sycl::device_memory_resource m_device_mr;
85+
vecmem::sycl::shared_memory_resource m_shared_mr;
86+
vecmem::sycl::copy m_copy;
87+
vecmem::sycl::async_copy m_async_copy;
88+
#else
89+
vecmem::host_memory_resource m_host_mr;
90+
vecmem::host_memory_resource m_device_mr;
91+
vecmem::host_memory_resource m_shared_mr;
92+
vecmem::copy m_copy;
93+
vecmem::copy m_async_copy;
94+
#endif
95+
96+
}; // struct vecmem_objects::impl
97+
98+
vecmem_objects::vecmem_objects(queue& q) : m_impl{std::make_unique<impl>(q)} {}
99+
100+
vecmem_objects::vecmem_objects(vecmem_objects&&) = default;
101+
102+
vecmem_objects::~vecmem_objects() = default;
103+
104+
vecmem_objects& vecmem_objects::operator=(vecmem_objects&&) = default;
105+
106+
vecmem::memory_resource& vecmem_objects::host_mr() const {
107+
return m_impl->m_host_mr;
108+
}
109+
110+
vecmem::memory_resource& vecmem_objects::device_mr() const {
111+
return m_impl->m_device_mr;
112+
}
113+
114+
vecmem::memory_resource& vecmem_objects::shared_mr() const {
115+
return m_impl->m_shared_mr;
116+
}
117+
118+
vecmem::copy& vecmem_objects::copy() const {
119+
return m_impl->m_copy;
120+
}
121+
122+
vecmem::copy& vecmem_objects::async_copy() const {
123+
return m_impl->m_async_copy;
124+
}
125+
126+
} // namespace traccc::alpaka

0 commit comments

Comments
 (0)