Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

1038 lines
47 KiB
C++

/******************************************************************************
* Copyright (c) Advanced Micro Devices, Inc. All rights reserved.
*
* SPDX-License-Identifier: MIT
*****************************************************************************/
/**
* @file rocshmem_TILE_impl.hpp
* @brief Template implementations for rocSHMEM tile API functions.
*
* This header contains the inline template implementations for the tile API.
* It is included at the end of rocshmem_TILE.hpp to allow template instantiation
* for any conforming tensor types.
*/
#ifndef LIBRARY_INCLUDE_ROCSHMEM_TILE_IMPL_HPP
#define LIBRARY_INCLUDE_ROCSHMEM_TILE_IMPL_HPP
// This file should only be included from rocshmem_TILE.hpp
#ifndef LIBRARY_INCLUDE_ROCSHMEM_TILE_HPP
#error "rocshmem_TILE_impl.hpp should only be included from rocshmem_TILE.hpp"
#endif
// Only provide actual implementation when compiling device code
#ifdef __HIP_DEVICE_COMPILE__
// Forward declarations of type-erased namespace functions
// These are implemented in src/rocshmem_tile_gpu.cpp and provide the actual
// implementations. The extern "C" wrappers for JIT consumers are in
// src/device/rocshmem_wrapper.cc
namespace rocshmem {
// RMA PUT operations
__device__ int rocshmem_ctx_tile_put_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
__device__ int rocshmem_ctx_tile_put_wave_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
__device__ int rocshmem_ctx_tile_put_wg_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
// RMA GET operations
__device__ int rocshmem_ctx_tile_get_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
__device__ int rocshmem_ctx_tile_get_wave_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
__device__ int rocshmem_ctx_tile_get_wg_internal(
rocshmem_ctx_t ctx, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe, uint64_t flags);
// Collective - Allgather
__device__ int rocshmem_tile_allgather_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, uint64_t flags);
__device__ int rocshmem_tile_allgather_wave_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, uint64_t flags);
__device__ int rocshmem_tile_allgather_wg_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, uint64_t flags);
// Collective - Broadcast
__device__ int rocshmem_tile_broadcast_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe_root, uint64_t flags);
__device__ int rocshmem_tile_broadcast_wave_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe_root, uint64_t flags);
__device__ int rocshmem_tile_broadcast_wg_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int pe_root, uint64_t flags);
// Collective - SUM Reduce
__device__ int rocshmem_tile_sum_reduce_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_sum_reduce_wave_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_sum_reduce_wg_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
// Collective - MAX Reduce
__device__ int rocshmem_tile_max_reduce_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_max_reduce_wave_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_max_reduce_wg_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
// Collective - MIN Reduce
__device__ int rocshmem_tile_min_reduce_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_min_reduce_wave_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
__device__ int rocshmem_tile_min_reduce_wg_internal(
rocshmem_team_t team, void* dst_data, const void* src_data,
const size_t* dst_strides, const size_t* src_strides,
const size_t* start_coord, const size_t* boundary,
int ndim, size_t element_size, int root, uint64_t flags);
// Collective wait
__device__ int rocshmem_tile_collective_wait_internal(
rocshmem_team_t team, uint64_t flags);
/******************************************************************************
**************** RMA OPERATIONS - CONTEXT VERSIONS (5) ***********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_put(rocshmem_ctx_t ctx, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
// Extract tensor/tuple properties into arrays
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_put_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_put_wave(rocshmem_ctx_t ctx, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_put_wave_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_put_wg(rocshmem_ctx_t ctx, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_put_wg_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_get(rocshmem_ctx_t ctx, dst_tensor_t dst,
src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_get_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_get_wave(rocshmem_ctx_t ctx, dst_tensor_t dst,
src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_get_wave_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_get_wg(rocshmem_ctx_t ctx, dst_tensor_t dst,
src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int pe,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_ctx_tile_get_wg_internal(ctx, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe, flags);
}
/******************************************************************************
*************** RMA OPERATIONS - DEFAULT CONTEXT WRAPPERS (5) ****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_put(dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary, int pe,
uint64_t flags) {
return rocshmem_ctx_tile_put(ROCSHMEM_CTX_DEFAULT, dst, src, start_coord,
boundary, pe, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_put_wave(dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe, uint64_t flags) {
return rocshmem_ctx_tile_put_wave(ROCSHMEM_CTX_DEFAULT, dst, src,
start_coord, boundary, pe, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_put_wg(dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe, uint64_t flags) {
return rocshmem_ctx_tile_put_wg(ROCSHMEM_CTX_DEFAULT, dst, src, start_coord,
boundary, pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_get(dst_tensor_t dst, src_tensor_t src,
tuple_t start_coord, tuple_t boundary, int pe,
uint64_t flags) {
return rocshmem_ctx_tile_get(ROCSHMEM_CTX_DEFAULT, dst, src, start_coord,
boundary, pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_get_wave(dst_tensor_t dst, src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe, uint64_t flags) {
return rocshmem_ctx_tile_get_wave(ROCSHMEM_CTX_DEFAULT, dst, src, start_coord,
boundary, pe, flags);
}
template <typename src_tensor_t, typename dst_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_get_wg(dst_tensor_t dst, src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe, uint64_t flags) {
return rocshmem_ctx_tile_get_wg(ROCSHMEM_CTX_DEFAULT, dst, src, start_coord,
boundary, pe, flags);
}
/******************************************************************************
*********** COLLECTIVE ALLGATHER - CONTEXT VERSIONS (3) **********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_allgather(rocshmem_ctx_t ctx, rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_allgather_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_allgather_wave(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_allgather_wave_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_allgather_wg(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_allgather_wg_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), flags);
}
/******************************************************************************
******** COLLECTIVE ALLGATHER - DEFAULT CONTEXT WRAPPERS (3) *****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_allgather(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, uint64_t flags) {
return rocshmem_ctx_tile_allgather(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_allgather_wave(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, uint64_t flags) {
return rocshmem_ctx_tile_allgather_wave(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_allgather_wg(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, uint64_t flags) {
return rocshmem_ctx_tile_allgather_wg(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, flags);
}
/******************************************************************************
*********** COLLECTIVE BROADCAST - CONTEXT VERSIONS (3) **********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_broadcast(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_broadcast_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe_root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_broadcast_wave(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_broadcast_wave_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe_root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_broadcast_wg(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_broadcast_wg_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), pe_root, flags);
}
/******************************************************************************
******** COLLECTIVE BROADCAST - DEFAULT CONTEXT WRAPPERS (3) *****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_broadcast(rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
return rocshmem_ctx_tile_broadcast(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, pe_root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_broadcast_wave(rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
return rocshmem_ctx_tile_broadcast_wave(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, pe_root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_broadcast_wg(rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord, tuple_t boundary,
int pe_root, uint64_t flags) {
return rocshmem_ctx_tile_broadcast_wg(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, pe_root, flags);
}
/******************************************************************************
****************** COLLECTIVE WAIT - CONTEXT VERSION (1) *********************
*****************************************************************************/
__device__ inline int rocshmem_ctx_tile_collective_wait(rocshmem_ctx_t ctx,
rocshmem_team_t team,
uint64_t flags) {
// Forward to type-erased bitcode implementation
return rocshmem_tile_collective_wait_internal(team, flags);
}
/******************************************************************************
************* COLLECTIVE WAIT - DEFAULT CONTEXT WRAPPER (1) ******************
*****************************************************************************/
__device__ inline int rocshmem_tile_collective_wait(rocshmem_team_t team,
uint64_t flags) {
return rocshmem_ctx_tile_collective_wait(ROCSHMEM_CTX_DEFAULT, team, flags);
}
/******************************************************************************
******************* SUM REDUCTIONS - CONTEXT VERSIONS (6) ********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_sum_reduce(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_sum_reduce_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_sum_reduce_wave(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_sum_reduce_wave_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_sum_reduce_wg(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_sum_reduce_wg_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
/******************************************************************************
************** SUM REDUCTIONS - DEFAULT CONTEXT WRAPPERS (6) *****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_sum_reduce(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
return rocshmem_ctx_tile_sum_reduce(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_sum_reduce_wave(rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_sum_reduce_wave(ROCSHMEM_CTX_DEFAULT, team, dst,
src, start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_sum_reduce_wg(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_sum_reduce_wg(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
/******************************************************************************
******************* MAX REDUCTIONS - CONTEXT VERSIONS (3) ********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_max_reduce(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_max_reduce_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_max_reduce_wave(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_max_reduce_wave_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_max_reduce_wg(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_max_reduce_wg_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
/******************************************************************************
************** MAX REDUCTIONS - DEFAULT CONTEXT WRAPPERS (3) *****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_max_reduce(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
return rocshmem_ctx_tile_max_reduce(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_max_reduce_wave(rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_max_reduce_wave(ROCSHMEM_CTX_DEFAULT, team, dst,
src, start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_max_reduce_wg(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_max_reduce_wg(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
/******************************************************************************
******************* MIN REDUCTIONS - CONTEXT VERSIONS (3) ********************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_min_reduce(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst, const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_min_reduce_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_min_reduce_wave(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_min_reduce_wave_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_ctx_tile_min_reduce_wg(rocshmem_ctx_t ctx,
rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
using element_t = typename src_tensor_t::element_type;
constexpr int ndim = src_tensor_t::ndim;
size_t dst_strides[ndim];
size_t src_strides[ndim];
size_t start_arr[ndim];
size_t boundary_arr[ndim];
#pragma unroll
for (int i = 0; i < ndim; i++) {
dst_strides[i] = dst.stride(i);
src_strides[i] = src.stride(i);
start_arr[i] = start_coord.get(i);
boundary_arr[i] = boundary.get(i);
}
// Forward to type-erased bitcode implementation
return rocshmem_tile_min_reduce_wg_internal(team, dst.data_handle(), src.data_handle(),
dst_strides, src_strides,
start_arr, boundary_arr,
ndim, sizeof(element_t), root, flags);
}
/******************************************************************************
************** MIN REDUCTIONS - DEFAULT CONTEXT WRAPPERS (3) *****************
*****************************************************************************/
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_min_reduce(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary, int root, uint64_t flags) {
return rocshmem_ctx_tile_min_reduce(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_min_reduce_wave(rocshmem_team_t team,
dst_tensor_t dst,
const src_tensor_t src,
tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_min_reduce_wave(ROCSHMEM_CTX_DEFAULT, team, dst,
src, start_coord, boundary, root, flags);
}
template <typename dst_tensor_t, typename src_tensor_t, typename tuple_t>
__device__ inline int rocshmem_tile_min_reduce_wg(rocshmem_team_t team, dst_tensor_t dst,
const src_tensor_t src, tuple_t start_coord,
tuple_t boundary,
int root, uint64_t flags) {
return rocshmem_ctx_tile_min_reduce_wg(ROCSHMEM_CTX_DEFAULT, team, dst, src,
start_coord, boundary, root, flags);
}
} // namespace rocshmem
#endif // __HIP_DEVICE_COMPILE__
#endif // LIBRARY_INCLUDE_ROCSHMEM_TILE_IMPL_HPP