Graphite  0.5.0
GPU-accelerated graph optimization framework
Loading...
Searching...
No Matches
utils.hpp
Go to the documentation of this file.
1
2#pragma once
3#include <array>
4#include <graphite/vector.hpp>
5#include <thrust/device_vector.h>
6#include <thrust/universal_vector.h>
7
8namespace graphite {
9
10template <typename T>
11void prefetch_vector_on_device_async(const thrust::universal_vector<T> &vec,
12 int device_id, cudaStream_t stream) {
13// Prefetch the vector to the device
14// std::cout << "Prefetching vector of size " << vec.size() << " to device " <<
15// device_id << std::endl;
16#if !defined(_WIN32) && !defined(__WSL2__)
17 cudaMemPrefetchAsync(vec.data().get(), vec.size() * sizeof(T), device_id,
18 stream);
19#endif
20}
21
22template <typename T>
23void prefetch_vector_on_device_async(const managed_vector<T> &vec,
24 int device_id, cudaStream_t stream) {
25// Prefetch the vector to the device
26// std::cout << "Prefetching vector of size " << vec.size() << " to device " <<
27// device_id << std::endl;
28#if !defined(_WIN32) && !defined(__WSL2__)
29 cudaMemPrefetchAsync(vec.data().get(), vec.size() * sizeof(T), device_id,
30 stream);
31#endif
32}
33
34template <typename T>
35void prefetch_vector_on_host(const thrust::universal_vector<T> &vec,
36 cudaStream_t stream) {
37// Prefetch the vector to the host
38// std::cout << "Prefetching vector of size " << vec.size() << " to host" <<
39// std::endl;
40#if !defined(_WIN32) && !defined(__WSL2__)
41 cudaMemPrefetchAsync(vec.data().get(), vec.size() * sizeof(T),
42 cudaCpuDeviceId, stream);
43 cudaStreamSynchronize(stream);
44#endif
45}
46
47template <typename T>
48void prefetch_vector_on_host(const managed_vector<T> &vec,
49 cudaStream_t stream) {
50// Prefetch the vector to the host
51// std::cout << "Prefetching vector of size " << vec.size() << " to host" <<
52// std::endl;
53#if !defined(_WIN32) && !defined(__WSL2__)
54 cudaMemPrefetchAsync(vec.data().get(), vec.size() * sizeof(T),
55 cudaCpuDeviceId, stream);
56 cudaStreamSynchronize(stream);
57#endif
58}
59
60template <typename T>
61void print_device_vector(const thrust::device_vector<T> &vec) {
62 std::vector<T> host_vec(vec.size());
63 thrust::copy(vec.begin(), vec.end(), host_vec.begin());
64 for (const auto &val : host_vec) {
65 std::cout << val << " ";
66 }
67 std::cout << std::endl;
68}
69
70template <typename T> void print_device_vector(const T *vec, size_t size) {
71 std::vector<T> host_vec(size);
72 cudaMemcpy(host_vec.data(), vec, size * sizeof(T), cudaMemcpyDeviceToHost);
73 for (const auto &val : host_vec) {
74 std::cout << val << " ";
75 }
76 std::cout << std::endl;
77}
78
79template <typename H> class HandleManager {
80private:
81 std::vector<H> handles;
82 H last_handle;
83
84public:
85 HandleManager() : last_handle(0) {}
86
87 H get() {
88 if (handles.empty()) {
89 return last_handle++;
90 } else {
91 H handle = handles.back();
92 handles.pop_back();
93 return handle;
94 }
95 }
96
97 void release(H handle) { handles.push_back(handle); }
98
99 void clear() {
100 handles.clear();
101 last_handle = 0;
102 }
103};
104
105} // namespace graphite
Definition utils.hpp:79
The top-level namespace for Graphite.
Definition eigen_solver.cpp:4