cuDDL
Loading...
Searching...
No Matches
helpers.cuh
Go to the documentation of this file.
1#pragma once
2
3#include <cuda_runtime.h>
4
5#include <cuda/std/bit>
6#include <cuda/std/concepts>
7
8#include <cstddef>
9#include <cstdint>
10
11#include <cuddl/cuda_error.hpp>
12
13namespace cuddl::detail {
14
22__host__ __device__ constexpr uint32_t load_256_alignment() noexcept {
23#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 1000
24 return 32U;
25#else
26 return 16U;
27#endif
28}
29
31template <typename QueryScore, typename ReferenceScore>
32__host__ __device__ inline bool
33wide_rows_aligned(QueryScore const* query, ReferenceScore const* reference) noexcept {
34 constexpr uintptr_t mask = load_256_alignment() - 1U;
35 return (reinterpret_cast<uintptr_t>(query) & mask) == 0U &&
36 (reinterpret_cast<uintptr_t>(reference) & mask) == 0U;
37}
38
46template <typename T>
47__device__ __forceinline__ void load_256_global_nc(const T* ptr, T* out) {
48 static_assert(sizeof(T) == 4 || sizeof(T) == 8, "T must be uint32_t or uint64_t");
49
50#if __CUDA_ARCH__ >= 1000
51 if constexpr (sizeof(T) == 8) {
52 asm volatile("ld.global.nc.v4.u64 {%0, %1, %2, %3}, [%4];"
53 : "=l"(out[0]), "=l"(out[1]), "=l"(out[2]), "=l"(out[3])
54 : "l"(ptr));
55 } else {
56 asm volatile("ld.global.nc.v8.u32 {%0, %1, %2, %3, %4, %5, %6, %7}, [%8];"
57 : "=r"(out[0]),
58 "=r"(out[1]),
59 "=r"(out[2]),
60 "=r"(out[3]),
61 "=r"(out[4]),
62 "=r"(out[5]),
63 "=r"(out[6]),
64 "=r"(out[7])
65 : "l"(ptr));
66 }
67#else
68 if constexpr (sizeof(T) == 8) {
69 asm volatile("ld.global.nc.v2.u64 {%0, %1}, [%2];" : "=l"(out[0]), "=l"(out[1]) : "l"(ptr));
70 asm volatile("ld.global.nc.v2.u64 {%0, %1}, [%2];"
71 : "=l"(out[2]), "=l"(out[3])
72 : "l"(ptr + 2));
73 } else {
74 asm volatile("ld.global.nc.v4.u32 {%0, %1, %2, %3}, [%4];"
75 : "=r"(out[0]), "=r"(out[1]), "=r"(out[2]), "=r"(out[3])
76 : "l"(ptr));
77 asm volatile("ld.global.nc.v4.u32 {%0, %1, %2, %3}, [%4];"
78 : "=r"(out[4]), "=r"(out[5]), "=r"(out[6]), "=r"(out[7])
79 : "l"(ptr + 4));
80 }
81#endif
82}
83
84} // namespace cuddl::detail
auto const * query
Definition kernels.cuh:1030
__host__ __device__ bool wide_rows_aligned(QueryScore const *query, ReferenceScore const *reference) noexcept
True when both row bases meet load_256_alignment on the compiled architecture.
Definition helpers.cuh:33
__device__ __forceinline__ void load_256_global_nc(const T *ptr, T *out)
Loads 256 bits from global memory using the non-coherent cache path.
Definition helpers.cuh:47
__host__ __device__ constexpr uint32_t load_256_alignment() noexcept
Byte alignment load_256_global_nc requires on the compiled architecture.
Definition helpers.cuh:22