[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,222 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements C wrappers around the sycl runtime library. +// +//===--===// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include Hardcode84 wrote: Most of those includes are not being used and can be removed (map, mutex, vector, atomic) https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,222 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements C wrappers around the sycl runtime library. +// +//===--===// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 + +namespace { + +template +auto catchAll(F &&func) { + try { +return func(); + } catch (const std::exception &e) { +fprintf(stdout, "An exception was thrown: %s\n", e.what()); +fflush(stdout); +abort(); + } catch (...) { +fprintf(stdout, "An unknown exception was thrown\n"); +fflush(stdout); +abort(); + } +} + +#define L0_SAFE_CALL(call) \ + { \ +ze_result_t status = (call); \ +if (status != ZE_RESULT_SUCCESS) { \ + fprintf(stdout, "L0 error %d\n", status); \ + fflush(stdout); \ + abort(); \ +} \ + } + +} // namespace + +static sycl::device getDefaultDevice() { + static sycl::device syclDevice; + static bool isDeviceInitialised = false; + if(!isDeviceInitialised) { + auto platformList = sycl::platform::get_platforms(); + for (const auto &platform : platformList) { +auto platformName = platform.get_info(); +bool isLevelZero = platformName.find("Level-Zero") != std::string::npos; +if (!isLevelZero) + continue; + +syclDevice = platform.get_devices()[0]; +isDeviceInitialised = true; +return syclDevice; + } +throw std::runtime_error("getDefaultDevice failed"); Hardcode84 wrote: Just side comment, SYCL itself uses exceptions to report errors, so it's not possible to disable them completely and that's `catchAll` wrapper is for. https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,222 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements C wrappers around the sycl runtime library. +// +//===--===// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 + +namespace { + +template +auto catchAll(F &&func) { + try { +return func(); + } catch (const std::exception &e) { +fprintf(stdout, "An exception was thrown: %s\n", e.what()); +fflush(stdout); +abort(); + } catch (...) { +fprintf(stdout, "An unknown exception was thrown\n"); +fflush(stdout); +abort(); + } +} + +#define L0_SAFE_CALL(call) \ + { \ +ze_result_t status = (call); \ +if (status != ZE_RESULT_SUCCESS) { \ + fprintf(stdout, "L0 error %d\n", status); \ + fflush(stdout); \ + abort(); \ +} \ + } + +} // namespace + +static sycl::device getDefaultDevice() { + static sycl::device syclDevice; + static bool isDeviceInitialised = false; + if(!isDeviceInitialised) { + auto platformList = sycl::platform::get_platforms(); + for (const auto &platform : platformList) { +auto platformName = platform.get_info(); +bool isLevelZero = platformName.find("Level-Zero") != std::string::npos; +if (!isLevelZero) + continue; + +syclDevice = platform.get_devices()[0]; +isDeviceInitialised = true; +return syclDevice; + } +throw std::runtime_error("getDefaultDevice failed"); Hardcode84 wrote: Just side comment, SYCL itself uses exceptions to report errors, so it's not possible to disable them completely and that's `catchAll` wrapper is for. https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,222 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements C wrappers around the sycl runtime library. +// +//===--===// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 Hardcode84 wrote: There is a cmake module https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html to generate those macro automatically, what the llvm/mlir position on using it? https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,222 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements C wrappers around the sycl runtime library. +// +//===--===// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 Hardcode84 wrote: There is a cmake module https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html to generate those macro automatically, what the llvm/mlir position on using it? https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
https://github.com/Hardcode84 approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
https://github.com/Hardcode84 edited https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,209 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements wrappers around the sycl runtime library with C linkage +// +//===--===// + +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 + +namespace { + +template +auto catchAll(F &&func) { + try { +return func(); + } catch (const std::exception &e) { +fprintf(stdout, "An exception was thrown: %s\n", e.what()); +fflush(stdout); +abort(); + } catch (...) { +fprintf(stdout, "An unknown exception was thrown\n"); +fflush(stdout); +abort(); + } +} + +#define L0_SAFE_CALL(call) \ + { \ +ze_result_t status = (call); \ +if (status != ZE_RESULT_SUCCESS) { \ + fprintf(stdout, "L0 error %d\n", status); \ + fflush(stdout); \ + abort(); \ +} \ + } + +} // namespace + +static sycl::device getDefaultDevice() { + static sycl::device syclDevice; + static bool isDeviceInitialised = false; + if (!isDeviceInitialised) { +auto platformList = sycl::platform::get_platforms(); +for (const auto &platform : platformList) { + auto platformName = platform.get_info(); + bool isLevelZero = platformName.find("Level-Zero") != std::string::npos; + if (!isLevelZero) +continue; + + syclDevice = platform.get_devices()[0]; + isDeviceInitialised = true; + return syclDevice; +} +throw std::runtime_error("getDefaultDevice failed"); + } else +return syclDevice; +} + +static sycl::context getDefaultContext() { + static sycl::context syclContext{getDefaultDevice()}; + return syclContext; +} + +static void *allocDeviceMemory(sycl::queue *queue, size_t size, bool isShared) { + void *memPtr = nullptr; + if (isShared) { +memPtr = sycl::aligned_alloc_shared(64, size, getDefaultDevice(), +getDefaultContext()); + } else { +memPtr = sycl::aligned_alloc_device(64, size, getDefaultDevice(), +getDefaultContext()); + } + if (memPtr == nullptr) { +throw std::runtime_error("mem allocation failed!"); + } + return memPtr; +} + +static void deallocDeviceMemory(sycl::queue *queue, void *ptr) { + sycl::free(ptr, *queue); +} + +static ze_module_handle_t loadModule(const void *data, size_t dataSize) { + assert(data); + ze_module_handle_t zeModule; + ze_module_desc_t desc = {ZE_STRUCTURE_TYPE_MODULE_DESC, + nullptr, + ZE_MODULE_FORMAT_IL_SPIRV, + dataSize, + (const uint8_t *)data, + nullptr, + nullptr}; + auto zeDevice = sycl::get_native( + getDefaultDevice()); + auto zeContext = sycl::get_native( + getDefaultContext()); + L0_SAFE_CALL(zeModuleCreate(zeContext, zeDevice, &desc, &zeModule, nullptr)); + return zeModule; +} + +static sycl::kernel *getKernel(ze_module_handle_t zeModule, const char *name) { + assert(zeModule); + assert(name); + ze_kernel_handle_t zeKernel; + ze_kernel_desc_t desc = {}; + desc.pKernelName = name; + + L0_SAFE_CALL(zeKernelCreate(zeModule, &desc, &zeKernel)); + sycl::kernel_bundle kernelBundle = + sycl::make_kernel_bundle( + {zeModule}, getDefaultContext()); + + auto kernel = sycl::make_kernel( + {kernelBundle, zeKernel}, getDefaultContext()); + return new sycl::kernel(kernel); +} + +static void launchKernel(sycl::queue *queue, sycl::kernel *kernel, size_t gridX, + size_t gridY, size_t gridZ, size_t blockX, + size_t blockY, size_t blockZ, size_t sharedMemBytes, + void **params, size_t paramsCount) { + auto syclGlobalRange = + sycl::range<3>(blockZ * gridZ, blockY * gridY, blockX * gridX); + auto syclLocalRange = sycl::range<3>(blockZ, blockY, blockX); + sycl::nd_range<3> syclNdRange(syclGlobalRange, syclLocalRange); + + queue->submit([&](sycl::handler &cgh) { +for (size_t i = 0; i < paramsCount; i++) { + cgh.set_arg(st
[clang] [MLIR] Add SyclRuntimeWrapper (PR #69648)
https://github.com/Hardcode84 edited https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [MLIR] Add SyclRuntimeWrapper (PR #69648)
@@ -0,0 +1,209 @@ +//===- SyclRuntimeWrappers.cpp - MLIR SYCL wrapper library ===// +// +// 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 +// +//===--===// +// +// Implements wrappers around the sycl runtime library with C linkage +// +//===--===// + +#include +#include +#include + +#ifdef _WIN32 +#define SYCL_RUNTIME_EXPORT __declspec(dllexport) +#else +#define SYCL_RUNTIME_EXPORT +#endif // _WIN32 + +namespace { + +template +auto catchAll(F &&func) { + try { +return func(); + } catch (const std::exception &e) { +fprintf(stdout, "An exception was thrown: %s\n", e.what()); +fflush(stdout); +abort(); + } catch (...) { +fprintf(stdout, "An unknown exception was thrown\n"); +fflush(stdout); +abort(); + } +} + +#define L0_SAFE_CALL(call) \ + { \ +ze_result_t status = (call); \ +if (status != ZE_RESULT_SUCCESS) { \ + fprintf(stdout, "L0 error %d\n", status); \ + fflush(stdout); \ + abort(); \ +} \ + } + +} // namespace + +static sycl::device getDefaultDevice() { + static sycl::device syclDevice; + static bool isDeviceInitialised = false; + if (!isDeviceInitialised) { +auto platformList = sycl::platform::get_platforms(); +for (const auto &platform : platformList) { + auto platformName = platform.get_info(); + bool isLevelZero = platformName.find("Level-Zero") != std::string::npos; + if (!isLevelZero) +continue; + + syclDevice = platform.get_devices()[0]; + isDeviceInitialised = true; + return syclDevice; +} +throw std::runtime_error("getDefaultDevice failed"); + } else +return syclDevice; +} + +static sycl::context getDefaultContext() { + static sycl::context syclContext{getDefaultDevice()}; + return syclContext; +} + +static void *allocDeviceMemory(sycl::queue *queue, size_t size, bool isShared) { + void *memPtr = nullptr; + if (isShared) { +memPtr = sycl::aligned_alloc_shared(64, size, getDefaultDevice(), +getDefaultContext()); + } else { +memPtr = sycl::aligned_alloc_device(64, size, getDefaultDevice(), +getDefaultContext()); + } + if (memPtr == nullptr) { +throw std::runtime_error("mem allocation failed!"); + } + return memPtr; +} + +static void deallocDeviceMemory(sycl::queue *queue, void *ptr) { + sycl::free(ptr, *queue); +} + +static ze_module_handle_t loadModule(const void *data, size_t dataSize) { + assert(data); + ze_module_handle_t zeModule; + ze_module_desc_t desc = {ZE_STRUCTURE_TYPE_MODULE_DESC, + nullptr, + ZE_MODULE_FORMAT_IL_SPIRV, + dataSize, + (const uint8_t *)data, + nullptr, + nullptr}; + auto zeDevice = sycl::get_native( + getDefaultDevice()); + auto zeContext = sycl::get_native( + getDefaultContext()); + L0_SAFE_CALL(zeModuleCreate(zeContext, zeDevice, &desc, &zeModule, nullptr)); + return zeModule; +} + +static sycl::kernel *getKernel(ze_module_handle_t zeModule, const char *name) { + assert(zeModule); + assert(name); + ze_kernel_handle_t zeKernel; + ze_kernel_desc_t desc = {}; + desc.pKernelName = name; + + L0_SAFE_CALL(zeKernelCreate(zeModule, &desc, &zeKernel)); + sycl::kernel_bundle kernelBundle = + sycl::make_kernel_bundle( + {zeModule}, getDefaultContext()); + + auto kernel = sycl::make_kernel( + {kernelBundle, zeKernel}, getDefaultContext()); + return new sycl::kernel(kernel); +} + +static void launchKernel(sycl::queue *queue, sycl::kernel *kernel, size_t gridX, + size_t gridY, size_t gridZ, size_t blockX, + size_t blockY, size_t blockZ, size_t sharedMemBytes, + void **params, size_t paramsCount) { + auto syclGlobalRange = + sycl::range<3>(blockZ * gridZ, blockY * gridY, blockX * gridX); + auto syclLocalRange = sycl::range<3>(blockZ, blockY, blockX); + sycl::nd_range<3> syclNdRange(syclGlobalRange, syclLocalRange); + + queue->submit([&](sycl::handler &cgh) { +for (size_t i = 0; i < paramsCount; i++) { + cgh.set_arg(st
[clang] [MLIR] Add SyclRuntimeWrapper (PR #69648)
https://github.com/Hardcode84 approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/69648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Enabling Intel GPU Integration. (PR #65539)
Hardcode84 wrote: I suggest to extract `mgpu` interface changes and `serializetoSpirv` pass to 2 separate PRs. https://github.com/llvm/llvm-project/pull/65539 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] Enabling Intel GPU Integration. (PR #65539)
Hardcode84 wrote: I suggest to extract `mgpu` interface changes and `serializetoSpirv` pass to 2 separate PRs. https://github.com/llvm/llvm-project/pull/65539 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits