This patch adds a new Cycles device with similar functionality to the existing GPU devices. Kernel compilation and runtime interaction happen via oneAPI DPC++ compiler and SYCL API. This implementation is primarly focusing on Intel® Arc™ GPUs and other future Intel GPUs. The first supported drivers are 101.1660 on Windows and 22.10.22597 on Linux. The necessary tools for compilation are: - A SYCL compiler such as oneAPI DPC++ compiler or https://github.com/intel/llvm - Intel® oneAPI Level Zero which is used for low level device queries: https://github.com/oneapi-src/level-zero - To optionally generate prebuilt graphics binaries: Intel® Graphics Compiler All are included in Linux precompiled libraries on svn: https://svn.blender.org/svnroot/bf-blender/trunk/lib The same goes for Windows precompiled binaries but for the graphics compiler, available as "Intel® Graphics Offline Compiler for OpenCL™ Code" from https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html, for which path can be set as OCLOC_INSTALL_DIR. Being based on the open SYCL standard, this implementation could also be extended to run on other compatible non-Intel hardware in the future. Reviewed By: sergey, brecht Differential Revision: https://developer.blender.org/D15254 Co-authored-by: Nikita Sirgienko <nikita.sirgienko@intel.com> Co-authored-by: Stefan Werner <stefan.werner@intel.com>
58 lines
1.6 KiB
C++
58 lines
1.6 KiB
C++
/* SPDX-License-Identifier: Apache-2.0
|
|
* Copyright 2021-2022 Intel Corporation */
|
|
|
|
#pragma once
|
|
|
|
#ifdef WITH_ONEAPI
|
|
|
|
# include <stddef.h>
|
|
|
|
/* NOTE(@nsirgien): Should match underlying type in the declaration inside "kernel/types.h"
|
|
* TODO: use kernel/types.h directly. */
|
|
enum DeviceKernel : int;
|
|
|
|
# ifndef CYCLES_KERNEL_ONEAPI_EXPORT
|
|
# ifdef _WIN32
|
|
# if defined(ONEAPI_EXPORT)
|
|
# define CYCLES_KERNEL_ONEAPI_EXPORT extern __declspec(dllexport)
|
|
# else
|
|
# define CYCLES_KERNEL_ONEAPI_EXPORT extern __declspec(dllimport)
|
|
# endif
|
|
# else
|
|
# define CYCLES_KERNEL_ONEAPI_EXPORT
|
|
# endif
|
|
# endif
|
|
|
|
class SyclQueue;
|
|
|
|
typedef void (*OneAPIDeviceIteratorCallback)(const char *id,
|
|
const char *name,
|
|
int num,
|
|
void *user_ptr);
|
|
|
|
typedef void (*OneAPIErrorCallback)(const char *error, void *user_ptr);
|
|
|
|
struct KernelContext {
|
|
/* Queue, associated with selected device */
|
|
SyclQueue *queue;
|
|
/* Pointer to USM device memory with all global/constant allocation on this device */
|
|
void *kernel_globals;
|
|
};
|
|
|
|
/* Use extern C linking so that the symbols can be easily load from the dynamic library at runtime.
|
|
*/
|
|
# ifdef __cplusplus
|
|
extern "C" {
|
|
# endif
|
|
|
|
# define DLL_INTERFACE_CALL(function, return_type, ...) \
|
|
CYCLES_KERNEL_ONEAPI_EXPORT return_type function(__VA_ARGS__);
|
|
# include "kernel/device/oneapi/dll_interface_template.h"
|
|
# undef DLL_INTERFACE_CALL
|
|
|
|
# ifdef __cplusplus
|
|
}
|
|
# endif
|
|
|
|
#endif /* WITH_ONEAPI */
|