Graphite
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// Based on method from Boost
106// https://www.boost.org/doc/libs/latest/libs/container_hash/doc/html/hash.html#ref_hash_combine
107
108size_t mix(size_t x) {
109 x ^= x >> 32;
110 x *= 0xe9846af9b1a615d;
111 x ^= x >> 32;
112 x *= 0xe9846af9b1a615d;
113 x ^= x >> 28;
114 return x;
115}
116
117template <typename T> void hash_combine(size_t &seed, T const &v) {
118 seed = mix(seed + 0x9e3779b9 + std::hash<T>{}(v));
119}
120
121} // namespace graphite
Definition utils.hpp:79