/*===-------------------------------------------------------------------------- * ATMI (Asynchronous Task and Memory Interface) * * This file is distributed under the MIT License. See LICENSE.txt for details. *===------------------------------------------------------------------------*/ #ifndef INCLUDE_ATMI_RUNTIME_H_ #define INCLUDE_ATMI_RUNTIME_H_ #include "atmi.h" #include "hsa.h" #include #include #ifndef __cplusplus #include #endif #ifdef __cplusplus extern "C" { #endif /** \defgroup context_functions ATMI Context Setup and Finalize * @{ */ /** * @brief Initialize the ATMI runtime environment. * * @detal All ATMI runtime functions will fail if this function is not called * at least once. The user may initialize difference device types at different * regions in the program in order for optimization purposes. * * @retval ::ATMI_STATUS_SUCCESS The function has executed successfully. * * @retval ::ATMI_STATUS_ERROR The function encountered errors. * * @retval ::ATMI_STATUS_UNKNOWN The function encountered errors. */ atmi_status_t atmi_init(); /** * @brief Finalize the ATMI runtime environment. * * @detail ATMI runtime functions will fail if called after finalize. * * @retval ::ATMI_STATUS_SUCCESS The function has executed successfully. * * @retval ::ATMI_STATUS_ERROR The function encountered errors. * * @retval ::ATMI_STATUS_UNKNOWN The function encountered errors. */ atmi_status_t atmi_finalize(); /** @} */ /** \defgroup module_functions ATMI Module * @{ */ /** * @brief Register the ATMI code module from memory on to a specific place * (device). * * @detail Currently, only GPU devices need explicit module registration because * of their specific ISAs that require a separate compilation phase. On the * other * hand, CPU devices execute regular x86 functions that are compiled with the * host program. * * @param[in] module_bytes A memory region that contains the GPU modules * targeting ::AMDGCN platform types. Value cannot be NULL. * * @param[in] module_size Size of module region * * @param[in] place Denotes the execution place (device) on which the module * should be registered and loaded. * * @param[in] on_deserialized_data Callback run on deserialized code object, * before loading it * * @param[in] cb_state void* passed to on_deserialized_data callback * * @retval ::ATMI_STATUS_SUCCESS The function has executed successfully. * * @retval ::ATMI_STATUS_ERROR The function encountered errors. * * @retval ::ATMI_STATUS_UNKNOWN The function encountered errors. * */ atmi_status_t atmi_module_register_from_memory_to_place( void *module_bytes, size_t module_size, atmi_place_t place, atmi_status_t (*on_deserialized_data)(void *data, size_t size, void *cb_state), void *cb_state); /** @} */ /** \defgroup machine ATMI Machine * @{ */ /** * @brief ATMI's device discovery function to get the current machine's * topology. * * @detail The @p atmi_machine_t structure is a tree-based representation of the * compute and memory elements in the current node. Once ATMI is initialized, * this function can be called to retrieve the pointer to this global structure. * * @return Returns a pointer to a global structure of tyoe @p atmi_machine_t. * Returns NULL if ATMI is not initialized. */ atmi_machine_t *atmi_machine_get_info(); /** @} */ /** \defgroup memory_functions ATMI Data Management * @{ */ /** * @brief Allocate memory from the specified memory place. * * @detail This function allocates memory from the specified memory place. If * the memory * place belongs primarily to the CPU, then the memory will be accessible by * other GPUs and CPUs in the system. If the memory place belongs primarily to a * GPU, * then it cannot be accessed by other devices in the system. * * @param[in] ptr The pointer to the memory that will be allocated. * * @param[in] size The size of the allocation in bytes. * * @param[in] place The memory place in the system to perform the allocation. * * @retval ::ATMI_STATUS_SUCCESS The function has executed successfully. * * @retval ::ATMI_STATUS_ERROR The function encountered errors. * * @retval ::ATMI_STATUS_UNKNOWN The function encountered errors. * */ atmi_status_t atmi_malloc(void **ptr, size_t size, atmi_mem_place_t place); /** * @brief Frees memory that was previously allocated. * * @detail This function frees memory that was previously allocated by calling * @p atmi_malloc. It throws an error otherwise. It is illegal to access a * pointer after a call to this function. * * @param[in] ptr The pointer to the memory that has to be freed. * * @retval ::ATMI_STATUS_SUCCESS The function has executed successfully. * * @retval ::ATMI_STATUS_ERROR The function encountered errors. * * @retval ::ATMI_STATUS_UNKNOWN The function encountered errors. * */ atmi_status_t atmi_free(void *ptr); atmi_status_t atmi_memcpy_h2d(hsa_signal_t signal, void *deviceDest, const void *hostSrc, size_t size, hsa_agent_t agent); atmi_status_t atmi_memcpy_d2h(hsa_signal_t sig, void *hostDest, const void *deviceSrc, size_t size, hsa_agent_t agent); /** @} */ #ifdef __cplusplus } #endif #endif // INCLUDE_ATMI_RUNTIME_H_