Files
TheRock/rocm-systems/shared/kpack/runtime/include/rocm_kpack/kpack.h
T
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

311 lines
11 KiB
C

// Copyright (c) 2025 Advanced Micro Devices, Inc.
// SPDX-License-Identifier: MIT
#ifndef ROCM_KPACK_H
#define ROCM_KPACK_H
#include "kpack_export.h"
#include "kpack_types.h"
#ifdef __cplusplus
extern "C" {
#endif
//
// Archive Lifecycle
//
// Open a kpack archive for reading
//
// Opens the kpack file at the specified path, validates the header,
// and parses the table of contents (TOC).
//
// Args:
// path: Path to the .kpack file
// archive: Output parameter for archive handle
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if path is NULL or archive is NULL
// KPACK_ERROR_FILE_NOT_FOUND if file doesn't exist
// KPACK_ERROR_INVALID_FORMAT if file is not a valid kpack
// KPACK_ERROR_UNSUPPORTED_VERSION if version is not supported
// KPACK_ERROR_OUT_OF_MEMORY if allocation fails
// KPACK_ERROR_IO_ERROR on read failures
// KPACK_ERROR_MSGPACK_PARSE_FAILED if TOC parsing fails
KPACK_API kpack_error_t kpack_open(const char* path, kpack_archive_t* archive);
// Close archive and free all resources
//
// Must not be called while other threads are using the archive.
// After this call, the archive handle is invalid.
//
// Args:
// archive: Archive handle from kpack_open()
KPACK_API void kpack_close(kpack_archive_t archive);
//
// Discovery and Querying
//
// All query functions return pointers to memory owned by the archive.
// Returned pointers are valid until kpack_close() is called.
//
// Get number of architectures available in the archive
//
// Args:
// archive: Archive handle
// count: Output parameter for number of architectures
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if any pointer is NULL
KPACK_API kpack_error_t kpack_get_architecture_count(kpack_archive_t archive,
size_t* count);
// Get architecture name by index
//
// Returns a pointer to an architecture string owned by the archive.
// The pointer is valid until kpack_close() is called.
//
// Args:
// archive: Archive handle
// index: Index in range [0, count)
// arch: Output parameter for architecture string
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if pointers are NULL or index out of range
KPACK_API kpack_error_t kpack_get_architecture(kpack_archive_t archive,
size_t index, const char** arch);
// Get number of binaries that have kernels in the archive
//
// Args:
// archive: Archive handle
// count: Output parameter for number of binaries
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if any pointer is NULL
KPACK_API kpack_error_t kpack_get_binary_count(kpack_archive_t archive,
size_t* count);
// Get binary name by index
//
// Returns a pointer to a binary path string owned by the archive.
// The pointer is valid until kpack_close() is called.
//
// Args:
// archive: Archive handle
// index: Index in range [0, count)
// binary: Output parameter for binary path string
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if pointers are NULL or index out of range
KPACK_API kpack_error_t kpack_get_binary(kpack_archive_t archive, size_t index,
const char** binary);
//
// Kernel Loading
//
// Load kernel for specific binary and architecture
//
// Decompresses and returns an allocated copy of the kernel data for the
// specified binary and architecture.
//
// Memory Management:
// - The returned pointer MUST be freed by the caller using kpack_free_kernel()
// - The pointer remains valid until freed, regardless of other operations
// on the archive
//
// Thread Safety:
// - Thread-safe when called concurrently on the SAME archive handle
// - Multiple threads can safely call this function simultaneously
//
// Args:
// archive: Archive handle
// binary_name: Binary path (e.g., "lib/libamdhip64.so.6")
// arch: Architecture name (e.g., "gfx942")
// kernel_data: Output parameter for pointer to allocated kernel bytes
// kernel_size: Output parameter for kernel size in bytes
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if any pointer is NULL
// KPACK_ERROR_KERNEL_NOT_FOUND if kernel doesn't exist
// KPACK_ERROR_DECOMPRESSION_FAILED if decompression fails
// KPACK_ERROR_OUT_OF_MEMORY if allocation fails
// KPACK_ERROR_IO_ERROR if file read fails
KPACK_API kpack_error_t kpack_get_kernel(kpack_archive_t archive,
const char* binary_name,
const char* arch, void** kernel_data,
size_t* kernel_size);
// Free kernel data allocated by kpack_get_kernel
//
// Args:
// kernel_data: Pointer returned by kpack_get_kernel, or NULL (no-op)
KPACK_API void kpack_free_kernel(void* kernel_data);
//
// Loader API
//
// These functions provide code object loading for runtime integration.
// They handle metadata parsing, path resolution, and archive management.
//
// Callback type for architecture enumeration
// Return true to continue enumeration, false to stop
typedef bool (*kpack_arch_callback_t)(const char* arch, void* user_data);
//
// Cache Lifecycle
//
// The cache provides thread-safe, high-performance code object loading.
// Environment variables are resolved once at cache creation time.
// Archives are opened lazily and kept open until cache destruction.
//
// Create a kpack cache
//
// The cache resolves environment variables at creation time:
// - ROCM_KPACK_PATH: Override search paths entirely
// - ROCM_KPACK_PATH_PREFIX: Prepend paths to search
// - ROCM_KPACK_DISABLE: If set, all load calls return NOT_IMPLEMENTED
// - ROCM_KPACK_DEBUG: Enable verbose logging to stderr
//
// Thread Safety:
// - This function is NOT thread-safe. Create cache before spawning threads.
// - The returned cache IS thread-safe for concurrent load operations.
//
// Args:
// cache: Output parameter for cache handle
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if cache is NULL
// KPACK_ERROR_OUT_OF_MEMORY if allocation fails
KPACK_API kpack_error_t kpack_cache_create(kpack_cache_t* cache);
// Destroy a kpack cache and release all resources
//
// Closes all cached archives and frees memory.
// Must not be called while other threads are using the cache.
//
// Args:
// cache: Cache handle from kpack_cache_create(), or NULL (no-op)
KPACK_API void kpack_cache_destroy(kpack_cache_t cache);
// Discover the file path of a binary from an address within it
//
// Given a pointer to any address within a loaded shared library or executable,
// returns the file path of that binary. This is used to resolve relative paths
// in kpack metadata.
//
// Platform-specific implementation:
// - Linux: Parses /proc/self/maps (dladdr cannot reliably resolve data
// segments)
// - Windows: Uses GetModuleHandleEx + GetModuleFileName
//
// Args:
// address_in_binary: Any address within the target binary (e.g., from
// __CudaFatBinaryWrapper.binary for HIPK binaries)
// path_out: Buffer to receive the file path
// path_out_size: Size of path_out buffer
// offset_out: Optional output for offset of address within the file (may be
// NULL)
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if address_in_binary or path_out is NULL
// KPACK_ERROR_PATH_DISCOVERY_FAILED if address is not in any known mapping
// KPACK_ERROR_NOT_IMPLEMENTED on unsupported platforms
KPACK_API kpack_error_t
kpack_discover_binary_path(const void* address_in_binary, char* path_out,
size_t path_out_size, size_t* offset_out);
// Load a code object from kpack archives using HIPK metadata
//
// Parses HIPK msgpack metadata, locates the appropriate kpack archive(s),
// and returns the first matching code object for the given architecture list.
//
// Search Algorithm:
// For each architecture in priority order, searches all archives in the path
// list until a match is found. This ensures the highest-priority architecture
// is used even if it's only available in a later archive.
//
// Multi-TU Support:
// Libraries built with -fgpu-rdc have multiple __CudaFatBinaryWrapper
// structures, each corresponding to a different translation unit (TU). The
// co_index parameter identifies which code object to load (0-based). At build
// time, the kpack tooling assigns each code object an index and stores this
// in the wrapper's reserved1 field. At runtime, CLR passes this index through.
//
// Thread Safety:
// - Thread-safe when called with the same cache from multiple threads
// - Archives are cached and reused across calls
//
// Args:
// cache: Cache handle from kpack_cache_create()
// hipk_metadata: Pointer to msgpack-encoded HIPK metadata (from
// __CudaFatBinaryWrapper.binary when magic is HIPK)
// binary_path: Path to the binary containing the HIPK metadata (used to
// resolve relative kpack paths)
// co_index: Code object index for multi-TU binaries (from wrapper reserved1
// field). Use 0 for single-TU binaries.
// arch_list: Array of architecture strings in priority order
// (e.g., ["gfx942:xnack+", "gfx9-4-generic:xnack+"])
// arch_count: Number of entries in arch_list
// code_object_out: Output pointer to allocated code object bytes (caller
// must free via kpack_free_code_object)
// code_object_size_out: Output for size of code object in bytes
//
// Returns:
// KPACK_SUCCESS on success
// KPACK_ERROR_INVALID_ARGUMENT if cache or required pointers are NULL,
// or arch_count is 0
// KPACK_ERROR_INVALID_METADATA if hipk_metadata is not valid msgpack
// KPACK_ERROR_ARCHIVE_NOT_FOUND if no archive found at any search path
// KPACK_ERROR_ARCH_NOT_FOUND if no architecture in arch_list found in
// any archive
// KPACK_ERROR_OUT_OF_MEMORY if allocation fails
// KPACK_ERROR_NOT_IMPLEMENTED if ROCM_KPACK_DISABLE was set at cache creation
KPACK_API kpack_error_t kpack_load_code_object(
kpack_cache_t cache, const void* hipk_metadata, const char* binary_path,
uint32_t co_index, const char* const* arch_list, size_t arch_count,
void** code_object_out, size_t* code_object_size_out);
// Free a code object allocated by kpack_load_code_object
//
// Args:
// code_object: Pointer returned by kpack_load_code_object, or NULL (no-op)
KPACK_API void kpack_free_code_object(void* code_object);
// Enumerate architectures available in a kpack archive
//
// Opens the archive, invokes the callback for each architecture, then closes
// the archive. If the callback returns false, enumeration stops early.
//
// Args:
// archive_path: Path to the kpack archive file
// callback: Function called for each architecture (receives arch string and
// user_data)
// user_data: Opaque pointer passed to callback
//
// Returns:
// KPACK_SUCCESS on success (including early termination via callback)
// KPACK_ERROR_INVALID_ARGUMENT if archive_path or callback is NULL
// KPACK_ERROR_FILE_NOT_FOUND if archive doesn't exist
// Other errors from kpack_open
KPACK_API kpack_error_t kpack_enumerate_architectures(
const char* archive_path, kpack_arch_callback_t callback, void* user_data);
#ifdef __cplusplus
}
#endif
#endif // ROCM_KPACK_H