From aff4a48a0ad1276fe98c51cc42b88e1f152ac135 Mon Sep 17 00:00:00 2001 From: xinmu Date: Mon, 24 Aug 2026 11:14:07 +0800 Subject: [PATCH] feature: add 64bit Architecture General Support --- CMakeLists.txt | 15 ++++- level_zero/CMakeLists.txt | 1 - opencl/source/dll/CMakeLists.txt | 1 - shared/source/helpers/CMakeLists.txt | 17 +++-- shared/source/helpers/general/CMakeLists.txt | 13 ++++ .../source/helpers/general/local_id_gen.cpp | 36 ++++++++++ shared/source/helpers/general/stream_copy.cpp | 17 +++++ shared/source/utilities/CMakeLists.txt | 8 ++- .../source/utilities/aarch64/CMakeLists.txt | 1 + .../utilities/aarch64/cpuintrinsics.cpp | 65 +++++++++++++++++++ .../source/utilities/general/CMakeLists.txt | 10 +++ .../utilities/general/cpu_info_general.cpp | 15 +++++ .../utilities/general/cpuintrinsics.cpp | 60 +++++++++++++++++ shared/source/utilities/linux/CMakeLists.txt | 7 +- .../utilities/linux/general/CMakeLists.txt | 12 ++++ .../utilities/linux/general/cpu_info.cpp | 43 ++++++++++++ shared/source/utilities/x86_64/CMakeLists.txt | 1 + .../utilities/{ => x86_64}/cpuintrinsics.cpp | 16 +---- 18 files changed, 311 insertions(+), 27 deletions(-) create mode 100644 shared/source/helpers/general/CMakeLists.txt create mode 100644 shared/source/helpers/general/local_id_gen.cpp create mode 100644 shared/source/helpers/general/stream_copy.cpp create mode 100644 shared/source/utilities/aarch64/cpuintrinsics.cpp create mode 100644 shared/source/utilities/general/CMakeLists.txt create mode 100644 shared/source/utilities/general/cpu_info_general.cpp create mode 100644 shared/source/utilities/general/cpuintrinsics.cpp create mode 100644 shared/source/utilities/linux/general/CMakeLists.txt create mode 100644 shared/source/utilities/linux/general/cpu_info.cpp rename shared/source/utilities/{ => x86_64}/cpuintrinsics.cpp (84%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e41d58fd8ac69..2be55a1ab1953 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,11 @@ elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") set(NEO_DISABLE_LD_GOLD TRUE) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/sse2neon) +elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8) + message(WARNING "Maybe Unsupported target processor(64Bit): ${CMAKE_SYSTEM_PROCESSOR}") + set(NEO_TARGET_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}) +endif() +if(NOT ${NEO_TARGET_PROCESSOR} STREQUAL "x86_64") set(DISABLE_WDDM_LINUX TRUE) endif() include_directories("${CMAKE_CURRENT_SOURCE_DIR}/shared/source/gmm_helper/igfxfmid_wrapper/${BRANCH_DIR_SUFFIX}") @@ -146,12 +151,18 @@ endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(NEO_BITS "64") - set(NEO_ARCH "x64") else() set(NEO_BITS "32") - set(NEO_ARCH "x86") endif() +if(${NEO_TARGET_PROCESSOR} STREQUAL "x86_64" AND ${NEO_BITS} STREQUAL "32") + set(NEO_ARCH "x86") +elseif (${NEO_TARGET_PROCESSOR} STREQUAL "x86_64") + set(NEO_ARCH "x64") +else() + set(NEO_ARCH "${NEO_TARGET_PROCESSOR}") +endif () + if(NOT DEFINED NEO_BUILD_WITH_OCL) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/opencl/CMakeLists.txt) set(NEO_BUILD_WITH_OCL TRUE) diff --git a/level_zero/CMakeLists.txt b/level_zero/CMakeLists.txt index 78631dceaf2dc..a128d5bbed6f9 100644 --- a/level_zero/CMakeLists.txt +++ b/level_zero/CMakeLists.txt @@ -151,7 +151,6 @@ if(BUILD_WITH_L0) ${NEO_SHARED_DIRECTORY}/helpers/abort.cpp ${NEO_SHARED_DIRECTORY}/helpers/debug_helpers.cpp ${NEO_SHARED_DIRECTORY}/helpers/file_io.cpp - ${NEO_SHARED_DIRECTORY}/utilities/cpuintrinsics.cpp ${NEO_SHARED_DIRECTORY}/utilities/debug_settings_reader_creator.cpp ${NEO_SHARED_DIRECTORY}/utilities/io_functions.cpp ${NEO_SHARED_DIRECTORY}/built_ins/sip_init.cpp diff --git a/opencl/source/dll/CMakeLists.txt b/opencl/source/dll/CMakeLists.txt index 9a3eb2bebc618..50fb0992b9f41 100644 --- a/opencl/source/dll/CMakeLists.txt +++ b/opencl/source/dll/CMakeLists.txt @@ -14,7 +14,6 @@ set(RUNTIME_SRCS_DLL_BASE ${NEO_SHARED_DIRECTORY}/helpers/allow_deferred_deleter.cpp ${NEO_SHARED_DIRECTORY}/helpers/debug_helpers.cpp ${NEO_SHARED_DIRECTORY}/helpers/file_io.cpp - ${NEO_SHARED_DIRECTORY}/utilities/cpuintrinsics.cpp ${NEO_SHARED_DIRECTORY}/utilities/debug_settings_reader_creator.cpp ${NEO_SHARED_DIRECTORY}/utilities/io_functions.cpp ${NEO_SOURCE_DIR}/opencl/source/api/api.cpp diff --git a/shared/source/helpers/CMakeLists.txt b/shared/source/helpers/CMakeLists.txt index f318b04ca2b9d..f11f69e0be5d5 100644 --- a/shared/source/helpers/CMakeLists.txt +++ b/shared/source/helpers/CMakeLists.txt @@ -114,7 +114,6 @@ set(NEO_CORE_HELPERS ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen.h ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen.inl ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen_special.inl - ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen_sse4.cpp ${CMAKE_CURRENT_SOURCE_DIR}/local_work_size.cpp ${CMAKE_CURRENT_SOURCE_DIR}/local_work_size.h ${CMAKE_CURRENT_SOURCE_DIR}/memory_properties_flags.h @@ -164,8 +163,6 @@ set(NEO_CORE_HELPERS ${CMAKE_CURRENT_SOURCE_DIR}/topology.h ${CMAKE_CURRENT_SOURCE_DIR}/topology.cpp ${CMAKE_CURRENT_SOURCE_DIR}/topology_map.h - ${CMAKE_CURRENT_SOURCE_DIR}/uint16_avx2.h - ${CMAKE_CURRENT_SOURCE_DIR}/uint16_sse4.h ${CMAKE_CURRENT_SOURCE_DIR}/validators.h ${CMAKE_CURRENT_SOURCE_DIR}/vec.h ${CMAKE_CURRENT_SOURCE_DIR}/definitions${BRANCH_DIR_SUFFIX}blit_properties_ext.h @@ -181,6 +178,14 @@ set(NEO_CORE_HELPERS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_copy_helper.h ) +if(MSVC OR COMPILER_SUPPORTS_SSE42) + list(APPEND NEO_CORE_HELPERS + ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen_sse4.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/uint16_avx2.h + ${CMAKE_CURRENT_SOURCE_DIR}/uint16_sse4.h + ) +endif() + if(WIN32) list(APPEND NEO_CORE_HELPERS ${CMAKE_CURRENT_SOURCE_DIR}/windows/path.cpp @@ -278,4 +283,8 @@ endif() set_property(GLOBAL PROPERTY NEO_CORE_HELPERS ${NEO_CORE_HELPERS}) -add_subdirectories() +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") +else () + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/general") +endif () diff --git a/shared/source/helpers/general/CMakeLists.txt b/shared/source/helpers/general/CMakeLists.txt new file mode 100644 index 0000000000000..0316202b26640 --- /dev/null +++ b/shared/source/helpers/general/CMakeLists.txt @@ -0,0 +1,13 @@ +# +# Copyright (C) 2026 Intel Corporation +# +# SPDX-License-Identifier: MIT +# + +set(NEO_CORE_HELPERS + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/local_id_gen.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/stream_copy.cpp +) + +set_property(GLOBAL APPEND PROPERTY NEO_CORE_HELPERS ${NEO_CORE_HELPERS}) diff --git a/shared/source/helpers/general/local_id_gen.cpp b/shared/source/helpers/general/local_id_gen.cpp new file mode 100644 index 0000000000000..728200e88ceae --- /dev/null +++ b/shared/source/helpers/general/local_id_gen.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018-2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/helpers/local_id_gen.h" + +#include "shared/source/execution_environment/root_device_environment.h" +#include "shared/source/helpers/aligned_memory.h" +#include "shared/source/helpers/gfx_core_helper.h" +#include "shared/source/helpers/local_id_gen_special.inl" +#include "shared/source/utilities/cpu_info.h" + +#include + +namespace NEO { + +// Initialize the lookup table based on CPU capabilities +LocalIDHelper::LocalIDHelper() { +} + +LocalIDHelper LocalIDHelper::initializer; + +// traditional function to generate local IDs +void generateLocalIDs(void *buffer, uint16_t simd, const std::array &localWorkgroupSize, const std::array &dimensionsOrder, bool isImageOnlyKernel, uint32_t grfSize, uint32_t grfCount, const RootDeviceEnvironment &rootDeviceEnvironment, uint8_t activeChannels) { + bool useLayoutForImages = isImageOnlyKernel && isCompatibleWithLayoutForImages(localWorkgroupSize, dimensionsOrder, simd); + if (useLayoutForImages) { + generateLocalIDsWithLayoutForImages(buffer, localWorkgroupSize, simd); + } else { + generateLocalIDsForSimdOne(buffer, localWorkgroupSize, dimensionsOrder, grfSize); + } +} + +} // namespace NEO diff --git a/shared/source/helpers/general/stream_copy.cpp b/shared/source/helpers/general/stream_copy.cpp new file mode 100644 index 0000000000000..480b405726517 --- /dev/null +++ b/shared/source/helpers/general/stream_copy.cpp @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/helpers/cpu_copy_helper.h" +#include "shared/source/helpers/string.h" + +namespace NEO { + +void streamCopy(void *dst, const void *src, size_t bytes) noexcept { + memcpy_s(dst, bytes, src, bytes); +} + +} // namespace NEO diff --git a/shared/source/utilities/CMakeLists.txt b/shared/source/utilities/CMakeLists.txt index 7c7d2d2e2e02a..da424ff912e3c 100644 --- a/shared/source/utilities/CMakeLists.txt +++ b/shared/source/utilities/CMakeLists.txt @@ -73,5 +73,9 @@ set(NEO_CORE_UTILITIES_WINDOWS set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES ${NEO_CORE_UTILITIES}) set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES_WINDOWS ${NEO_CORE_UTILITIES_WINDOWS}) - -add_subdirectories() +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") +else () + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/general") +endif () +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/linux") diff --git a/shared/source/utilities/aarch64/CMakeLists.txt b/shared/source/utilities/aarch64/CMakeLists.txt index 4a3017763cac1..907adc1f1fb60 100644 --- a/shared/source/utilities/aarch64/CMakeLists.txt +++ b/shared/source/utilities/aarch64/CMakeLists.txt @@ -8,5 +8,6 @@ if(${NEO_TARGET_PROCESSOR} STREQUAL "aarch64") set_property(GLOBAL APPEND PROPERTY NEO_CORE_UTILITIES ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/cpu_info_aarch64.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpuintrinsics.cpp ) endif() diff --git a/shared/source/utilities/aarch64/cpuintrinsics.cpp b/shared/source/utilities/aarch64/cpuintrinsics.cpp new file mode 100644 index 0000000000000..16ce0d983e20d --- /dev/null +++ b/shared/source/utilities/aarch64/cpuintrinsics.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020-2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/cpuintrinsics.h" +#include + +namespace NEO { +namespace CpuIntrinsics { + +void clFlush(void const *ptr) { + _mm_clflush(ptr); +} + +void clFlushOpt(void *ptr) { +#ifdef SUPPORTS_CLFLUSHOPT + _mm_clflushopt(ptr); +#else + _mm_clflush(ptr); +#endif +} + +void sfence() { + _mm_sfence(); +} + +void mfence() { + _mm_mfence(); +} + +void pause() { + _mm_pause(); +} + +uint8_t tpause(uint32_t control, uint64_t counter) { +#ifdef SUPPORTS_WAITPKG + return _tpause(control, counter); +#else + return 0; +#endif +} + +unsigned char umwait(unsigned int ctrl, uint64_t counter) { +#ifdef SUPPORTS_WAITPKG + return _umwait(ctrl, counter); +#else + return 0; +#endif +} + +void umonitor(void *a) { +#ifdef SUPPORTS_WAITPKG + _umonitor(a); +#endif +} + +uint64_t rdtsc() { + return 0; +} + +} // namespace CpuIntrinsics +} // namespace NEO diff --git a/shared/source/utilities/general/CMakeLists.txt b/shared/source/utilities/general/CMakeLists.txt new file mode 100644 index 0000000000000..e7fea708c3f21 --- /dev/null +++ b/shared/source/utilities/general/CMakeLists.txt @@ -0,0 +1,10 @@ +# +# Copyright (C) 2026 Intel Corporation +# +# SPDX-License-Identifier: MIT +# +set_property(GLOBAL APPEND PROPERTY NEO_CORE_UTILITIES + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/cpu_info_general.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpuintrinsics.cpp +) diff --git a/shared/source/utilities/general/cpu_info_general.cpp b/shared/source/utilities/general/cpu_info_general.cpp new file mode 100644 index 0000000000000..28a94f232b338 --- /dev/null +++ b/shared/source/utilities/general/cpu_info_general.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2021-2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/cpu_info.h" + +namespace NEO { +void CpuInfo::detect() const { + features = featureNone; + featuresDetected = true; +} +} // namespace NEO diff --git a/shared/source/utilities/general/cpuintrinsics.cpp b/shared/source/utilities/general/cpuintrinsics.cpp new file mode 100644 index 0000000000000..6e716440a30d8 --- /dev/null +++ b/shared/source/utilities/general/cpuintrinsics.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2020-2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/cpuintrinsics.h" +#ifdef WIN32 +#include +#else +#include +#endif + +namespace NEO { +namespace CpuIntrinsics { + +void clFlush(void const *ptr) { + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +void clFlushOpt(void *ptr) { + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +void sfence() { + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +void mfence() { + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +void pause() { +#ifdef WIN32 + SwitchToThread(); +#else + sched_yield(); +#endif +} + +uint8_t tpause(uint32_t control, uint64_t counter) { + return 0; +} + +unsigned char umwait(unsigned int ctrl, uint64_t counter) { + + return 0; +} + +void umonitor(void *a) { + +} + +uint64_t rdtsc() { + return 0; +} + +} // namespace CpuIntrinsics +} // namespace NEO diff --git a/shared/source/utilities/linux/CMakeLists.txt b/shared/source/utilities/linux/CMakeLists.txt index 9fdb2e68aa05f..b2c44dad1a88d 100644 --- a/shared/source/utilities/linux/CMakeLists.txt +++ b/shared/source/utilities/linux/CMakeLists.txt @@ -10,5 +10,8 @@ set(NEO_CORE_UTILITIES_LINUX ) set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES_LINUX ${NEO_CORE_UTILITIES_LINUX}) - -add_subdirectories() +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/${NEO_TARGET_PROCESSOR}") +else () + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/general") +endif () diff --git a/shared/source/utilities/linux/general/CMakeLists.txt b/shared/source/utilities/linux/general/CMakeLists.txt new file mode 100644 index 0000000000000..2db2d867816e2 --- /dev/null +++ b/shared/source/utilities/linux/general/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# Copyright (C) 2026 Intel Corporation +# +# SPDX-License-Identifier: MIT +# + +list(APPEND NEO_CORE_UTILITIES_LINUX + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/cpu_info.cpp +) + +set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES_LINUX ${NEO_CORE_UTILITIES_LINUX}) diff --git a/shared/source/utilities/linux/general/cpu_info.cpp b/shared/source/utilities/linux/general/cpu_info.cpp new file mode 100644 index 0000000000000..e5a3c3af4793d --- /dev/null +++ b/shared/source/utilities/linux/general/cpu_info.cpp @@ -0,0 +1,43 @@ + +/* + * Copyright (C) 2026 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/cpu_info.h" + +#include "shared/source/os_interface/linux/os_inc.h" + +#include + +namespace NEO { + +void cpuidLinuxWrapper(int cpuInfo[4], int functionId) { +} + +void cpuidexLinuxWrapper(int *cpuInfo, int functionId, int subfunctionId) { +} + +void getCpuFlagsLinux(std::string &cpuFlags) { +} + +void (*CpuInfo::cpuidexFunc)(int *, int, int) = cpuidexLinuxWrapper; +void (*CpuInfo::cpuidFunc)(int[4], int) = cpuidLinuxWrapper; +void (*CpuInfo::getCpuFlagsFunc)(std::string &) = getCpuFlagsLinux; + +const CpuInfo CpuInfo::instance; + +void CpuInfo::cpuid( + uint32_t cpuInfo[4], + uint32_t functionId) const { +} + +void CpuInfo::cpuidex( + uint32_t cpuInfo[4], + uint32_t functionId, + uint32_t subfunctionId) const { +} + +} // namespace NEO \ No newline at end of file diff --git a/shared/source/utilities/x86_64/CMakeLists.txt b/shared/source/utilities/x86_64/CMakeLists.txt index 53542eb7bc7ef..1614d55d27c4d 100644 --- a/shared/source/utilities/x86_64/CMakeLists.txt +++ b/shared/source/utilities/x86_64/CMakeLists.txt @@ -8,5 +8,6 @@ if(${NEO_TARGET_PROCESSOR} STREQUAL "x86_64") set_property(GLOBAL APPEND PROPERTY NEO_CORE_UTILITIES ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/cpu_info_x86_64.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpuintrinsics.cpp ) endif() diff --git a/shared/source/utilities/cpuintrinsics.cpp b/shared/source/utilities/x86_64/cpuintrinsics.cpp similarity index 84% rename from shared/source/utilities/cpuintrinsics.cpp rename to shared/source/utilities/x86_64/cpuintrinsics.cpp index b95a2d81f969d..274c2e404119b 100644 --- a/shared/source/utilities/cpuintrinsics.cpp +++ b/shared/source/utilities/x86_64/cpuintrinsics.cpp @@ -8,23 +8,13 @@ #include "shared/source/utilities/cpuintrinsics.h" #if defined(_WIN32) -#include #include #pragma intrinsic(__rdtsc) #else -#if defined(__ARM_ARCH) -extern "C" uint64_t __rdtsc(); -#else -#include #include #endif -#endif - -#if defined(__ARM_ARCH) -#include -#else +#include #include -#endif namespace NEO { namespace CpuIntrinsics { @@ -76,11 +66,7 @@ void umonitor(void *a) { } uint64_t rdtsc() { -#if defined(__ARM_ARCH) - return 0; -#else return __rdtsc(); -#endif } } // namespace CpuIntrinsics