/// \file tile.cuh /// \brief Tiled memory access helpers for coalesced global memory I/O. /// /// `tile::Memory` represents a contiguous memory region where multiple /// threads cooperatively load/store elements. The three factory methods /// determine the thread group: /// - `thread()` - single thread (no tiling). /// - `warp()` - all threads in a warp cooperate. /// - `cta()` - all threads in the CTA cooperate. #pragma once #include #include namespace device::tile { /** * \brief Represents a contiguous memory region for cooperative tiled access. * * Each instance is parameterized by an element type `T` and bound to a * specific thread id (`tid`) within a group of `tsize` threads. * * \tparam T The storage element type (e.g. `AlignedVector, 4>`). */ template struct Memory { public: SGL_DEVICE constexpr Memory(uint32_t tid, uint32_t tsize) : tid(tid), tsize(tsize) {} /// \brief Create a Memory accessor for a single thread (no cooperation). SGL_DEVICE static constexpr Memory thread() { return Memory{0, 1}; } /// \brief Create a Memory accessor distributed across warp threads. SGL_DEVICE static Memory warp(int warp_threads = kWarpThreads) { return Memory{static_cast(threadIdx.x % warp_threads), static_cast(warp_threads)}; } /// \brief Create a Memory accessor distributed across all CTA threads. SGL_DEVICE static Memory cta(int cta_threads = blockDim.x) { return Memory{static_cast(threadIdx.x), static_cast(cta_threads)}; } /// \brief Load one element from `ptr` at the position assigned to this thread. /// \param ptr Base pointer (cast to `const T*`). /// \param offset Optional tile offset (multiplied by `tsize`). SGL_DEVICE T load(const void* ptr, int64_t offset = 0) const { return static_cast(ptr)[tid + offset * tsize]; } /// \brief Store one element to `ptr` at the position assigned to this thread. SGL_DEVICE void store(void* ptr, T val, int64_t offset = 0) const { static_cast(ptr)[tid + offset * tsize] = val; } /// \brief Check whether this thread's element index is within bounds. SGL_DEVICE bool in_bound(int64_t element_count, int64_t offset = 0) const { return tid + offset * tsize < element_count; } private: uint32_t tid; uint32_t tsize; }; } // namespace device::tile