//===------------- target_interface.h - Target interfaces --------- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains interfaces that must be implemented by each target. // //===----------------------------------------------------------------------===// #ifndef _OMPTARGET_TARGET_INTERFACE_H_ #define _OMPTARGET_TARGET_INTERFACE_H_ #include "target_impl.h" // Calls to the NVPTX layer (assuming 1D layout) EXTERN int GetThreadIdInBlock(); EXTERN int GetBlockIdInKernel(); EXTERN int GetNumberOfBlocksInKernel(); EXTERN int GetNumberOfThreadsInBlock(); EXTERN unsigned GetWarpId(); EXTERN unsigned GetLaneId(); // Atomics extern DEVICE uint32_t __kmpc_atomic_add(uint32_t *, uint32_t); extern DEVICE uint32_t __kmpc_atomic_inc(uint32_t *, uint32_t); extern DEVICE uint32_t __kmpc_atomic_max(uint32_t *, uint32_t); extern DEVICE uint32_t __kmpc_atomic_exchange(uint32_t *, uint32_t); extern DEVICE uint32_t __kmpc_atomic_cas(uint32_t *, uint32_t, uint32_t); static_assert(sizeof(unsigned long long) == sizeof(uint64_t), ""); extern DEVICE unsigned long long __kmpc_atomic_exchange(unsigned long long *, unsigned long long); extern DEVICE unsigned long long __kmpc_atomic_add(unsigned long long *, unsigned long long); // Locks EXTERN void __kmpc_impl_init_lock(omp_lock_t *lock); EXTERN void __kmpc_impl_destroy_lock(omp_lock_t *lock); EXTERN void __kmpc_impl_set_lock(omp_lock_t *lock); EXTERN void __kmpc_impl_unset_lock(omp_lock_t *lock); EXTERN int __kmpc_impl_test_lock(omp_lock_t *lock); EXTERN void __kmpc_impl_threadfence(); EXTERN void __kmpc_impl_threadfence_block(); EXTERN void __kmpc_impl_threadfence_system(); EXTERN double __kmpc_impl_get_wtick(); EXTERN double __kmpc_impl_get_wtime(); EXTERN void __kmpc_impl_unpack(uint64_t val, uint32_t &lo, uint32_t &hi); EXTERN uint64_t __kmpc_impl_pack(uint32_t lo, uint32_t hi); EXTERN __kmpc_impl_lanemask_t __kmpc_impl_lanemask_lt(); EXTERN __kmpc_impl_lanemask_t __kmpc_impl_lanemask_gt(); EXTERN uint32_t __kmpc_impl_smid(); EXTERN __kmpc_impl_lanemask_t __kmpc_impl_activemask(); EXTERN int32_t __kmpc_impl_shfl_sync(__kmpc_impl_lanemask_t Mask, int32_t Var, int32_t SrcLane); EXTERN int32_t __kmpc_impl_shfl_down_sync(__kmpc_impl_lanemask_t Mask, int32_t Var, uint32_t Delta, int32_t Width); EXTERN void __kmpc_impl_syncthreads(); EXTERN void __kmpc_impl_syncwarp(__kmpc_impl_lanemask_t Mask); // Kernel initialization EXTERN void __kmpc_impl_target_init(); // Memory EXTERN void *__kmpc_impl_malloc(size_t); EXTERN void __kmpc_impl_free(void *); // Barrier until num_threads arrive. EXTERN void __kmpc_impl_named_sync(uint32_t num_threads); #endif // _OMPTARGET_TARGET_INTERFACE_H_