/** * \file dnn/include/megcore.h * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #pragma once #include #include #include "megcore_cdefs.h" #include "megdnn/thin/function.h" #include "megdnn/internal/visibility_prologue.h" namespace megcore { /*! * \brief a callback to dispatch computing task on desired CPU thread * * This is analogous to cuda streams. The default dispatcher on CPU executes in * the caller thread immediately. */ class CPUDispatcher { public: using Task = megdnn::thin_function; using MultiThreadingTask = megdnn::thin_function; virtual ~CPUDispatcher() noexcept; /*! * \brief dispatch a task on the computing thread * \param task the task that would be moved away */ virtual void dispatch(Task&& task) = 0; /*! * \brief dispatch a multithreading task on the computing thread * \param task the task would be moved away * \param parallelism the parallelism of the task. */ virtual void dispatch(MultiThreadingTask&& task, size_t parallelism) = 0; /*! * \brief synchronize the calling thread with the computing thread */ virtual void sync() = 0; /*! * \brief the computing thread number. */ virtual size_t nr_threads() = 0; }; } // namespace megcore using MegcoreCPUDispatcher = megcore::CPUDispatcher; /** * \brief Layer 1: device handle */ struct megcoreDeviceContext; typedef struct megcoreDeviceContext* megcoreDeviceHandle_t; megcoreStatus_t megcoreCreateDeviceHandle( megcoreDeviceHandle_t* handle, megcorePlatform_t platform, int deviceID = -1, unsigned int flags = 0); megcoreStatus_t megcoreDestroyDeviceHandle(megcoreDeviceHandle_t handle); megcoreStatus_t megcoreGetPlatform( megcoreDeviceHandle_t handle, megcorePlatform_t* platform); megcoreStatus_t megcoreGetDeviceID(megcoreDeviceHandle_t handle, int* deviceID); megcoreStatus_t megcoreGetMemAlignment( megcoreDeviceHandle_t handle, size_t* memAlignmentInBytes); megcoreStatus_t megcoreGetDeviceFlags( megcoreDeviceHandle_t handle, unsigned int* flags); megcoreStatus_t megcoreActivate(megcoreDeviceHandle_t handle); megcoreStatus_t megcoreDeactivate(megcoreDeviceHandle_t handle); megcoreStatus_t megcoreMalloc( megcoreDeviceHandle_t handle, void** devPtr, size_t sizeInBytes); megcoreStatus_t megcoreFree(megcoreDeviceHandle_t handle, void* devPtr); /** * \brief Layer 2: computing handle */ struct megcoreComputingContext; typedef struct megcoreComputingContext* megcoreComputingHandle_t; megcoreStatus_t megcoreCreateComputingHandle( megcoreComputingHandle_t* compHandle, megcoreDeviceHandle_t devHandle, unsigned int flags = 0); megcoreStatus_t megcoreCreateComputingHandleWithCPUDispatcher( megcoreComputingHandle_t* compHandle, megcoreDeviceHandle_t devHandle, const std::shared_ptr& dispatcher, unsigned int flags = 0); megcoreStatus_t megcoreDestroyComputingHandle(megcoreComputingHandle_t handle); megcoreStatus_t megcoreGetDeviceHandle( megcoreComputingHandle_t compHandle, megcoreDeviceHandle_t* devHandle); megcoreStatus_t megcoreGetComputingFlags( megcoreComputingHandle_t handle, unsigned int* flags); MegcoreCPUDispatcher* megcoreGetCPUDispatcher(megcoreComputingHandle_t handle); megcoreStatus_t megcoreMemcpy( megcoreComputingHandle_t handle, void* dst, const void* src, size_t sizeInBytes, megcoreMemcpyKind_t kind); megcoreStatus_t megcoreMemset( megcoreComputingHandle_t handle, void* dst, int value, size_t sizeInBytes); megcoreStatus_t megcoreSynchronize(megcoreComputingHandle_t handle); /** * \brief Miscellaneous */ const char* megcoreGetErrorName(megcoreStatus_t status); #include "megdnn/internal/visibility_epilogue.h" // vim: syntax=cpp.doxygen