mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-13 02:21:45 +00:00
[libc++][PSTL] Add a simple std::thread backend
This is just to test that the PSTL works with parallelization. This is not supposed to be a production-ready backend. Reviewed By: ldionne, #libc Spies: EricWF, arichardson, libcxx-commits Differential Revision: https://reviews.llvm.org/D150284
This commit is contained in:
parent
266b5bc1f6
commit
e837f4b7db
@ -287,6 +287,12 @@ option(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY
|
||||
"Build libc++ with an externalized threading library.
|
||||
This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" OFF)
|
||||
|
||||
if (LIBCXX_ENABLE_THREADS)
|
||||
set(LIBCXX_PSTL_CPU_BACKEND "std_thread" CACHE STRING "Which PSTL CPU backend to use")
|
||||
else()
|
||||
set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use")
|
||||
endif()
|
||||
|
||||
# Misc options ----------------------------------------------------------------
|
||||
# FIXME: Turn -pedantic back ON. It is currently off because it warns
|
||||
# about #include_next which is used everywhere.
|
||||
@ -796,6 +802,15 @@ else()
|
||||
config_define(0 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "serial")
|
||||
config_define(1 _LIBCPP_PSTL_CPU_BACKEND_SERIAL)
|
||||
elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "std_thread")
|
||||
config_define(1 _LIBCPP_PSTL_CPU_BACKEND_THREAD)
|
||||
else()
|
||||
message(FATAL_ERROR "LIBCXX_PSTL_CPU_BACKEND is set to ${LIBCXX_PSTL_CPU_BACKEND}, which is not a valid backend.
|
||||
Valid backends are: serial, std_thread")
|
||||
endif()
|
||||
|
||||
if (LIBCXX_ABI_DEFINES)
|
||||
set(abi_defines)
|
||||
foreach (abi_define ${LIBCXX_ABI_DEFINES})
|
||||
|
@ -78,6 +78,7 @@ set(files
|
||||
__algorithm/pstl_backends/cpu_backends/find_if.h
|
||||
__algorithm/pstl_backends/cpu_backends/for_each.h
|
||||
__algorithm/pstl_backends/cpu_backends/serial.h
|
||||
__algorithm/pstl_backends/cpu_backends/thread.h
|
||||
__algorithm/pstl_backends/cpu_backends/transform.h
|
||||
__algorithm/pstl_copy.h
|
||||
__algorithm/pstl_fill.h
|
||||
|
@ -85,7 +85,7 @@ struct __select_backend<std::execution::unsequenced_policy> {
|
||||
};
|
||||
# endif
|
||||
|
||||
# if defined(_PSTL_CPU_BACKEND_SERIAL)
|
||||
# if defined(_LIBCPP_PSTL_CPU_BACKEND_SERIAL) || defined(_LIBCPP_PSTL_CPU_BACKEND_THREAD)
|
||||
template <>
|
||||
struct __select_backend<std::execution::parallel_policy> {
|
||||
using type = __cpu_backend_tag;
|
||||
|
@ -11,8 +11,10 @@
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_THREADS) || defined(_PSTL_CPU_BACKEND_SERIAL)
|
||||
#if defined(_LIBCPP_PSTL_CPU_BACKEND_SERIAL)
|
||||
# include <__algorithm/pstl_backends/cpu_backends/serial.h>
|
||||
#elif defined(_LIBCPP_PSTL_CPU_BACKEND_THREAD)
|
||||
# include <__algorithm/pstl_backends/cpu_backends/thread.h>
|
||||
#else
|
||||
# error "Invalid CPU backend choice"
|
||||
#endif
|
||||
|
@ -0,0 +1,43 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP___ALGORITHM_PSTL_BACKENDS_CPU_BACKENDS_THREAD_H
|
||||
#define _LIBCPP___ALGORITHM_PSTL_BACKENDS_CPU_BACKENDS_THREAD_H
|
||||
|
||||
#include <__assert>
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
|
||||
|
||||
// This backend implementation is for testing purposes only and not meant for production use. This will be replaced
|
||||
// by a proper implementation once the PSTL implementation is somewhat stable.
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
namespace __par_backend {
|
||||
inline namespace __thread_cpu_backend {
|
||||
|
||||
template <class _RandomAccessIterator, class _Fp>
|
||||
_LIBCPP_HIDE_FROM_ABI void __parallel_for(_RandomAccessIterator __first, _RandomAccessIterator __last, _Fp __f) {
|
||||
__f(__first, __last);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI inline void __cancel_execution() {}
|
||||
|
||||
} // namespace __thread_cpu_backend
|
||||
} // namespace __par_backend
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && && _LIBCPP_STD_VER >= 17
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_PSTL_BACKENDS_CPU_BACKENDS_THREAD_H
|
@ -1280,7 +1280,6 @@ __sanitizer_verify_double_ended_contiguous_container(const void*, const void*, c
|
||||
|
||||
// TODO: Make this a proper configuration option
|
||||
#define _PSTL_PAR_BACKEND_SERIAL
|
||||
#define _PSTL_CPU_BACKEND_SERIAL
|
||||
|
||||
#define _PSTL_PRAGMA(x) _Pragma(# x)
|
||||
|
||||
|
@ -32,6 +32,10 @@
|
||||
#cmakedefine01 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT
|
||||
#cmakedefine _LIBCPP_ENABLE_DEBUG_MODE
|
||||
|
||||
// PSTL backends
|
||||
#cmakedefine _LIBCPP_PSTL_CPU_BACKEND_SERIAL
|
||||
#cmakedefine _LIBCPP_PSTL_CPU_BACKEND_THREAD
|
||||
|
||||
// __USE_MINGW_ANSI_STDIO gets redefined on MinGW
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic push
|
||||
|
@ -341,6 +341,9 @@ module std [system] {
|
||||
module pstl_backends_cpu_backends_serial {
|
||||
private header "__algorithm/pstl_backends/cpu_backends/serial.h"
|
||||
}
|
||||
module pstl_backends_cpu_backends_thread {
|
||||
private header "__algorithm/pstl_backends/cpu_backends/thread.h"
|
||||
}
|
||||
module pstl_backends_cpu_backends_transform {
|
||||
private header "__algorithm/pstl_backends/cpu_backends/transform.h"
|
||||
}
|
||||
|
@ -121,6 +121,7 @@ END-SCRIPT
|
||||
#include <__algorithm/pstl_backends/cpu_backends/find_if.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/pstl_backends/cpu_backends/find_if.h'}}
|
||||
#include <__algorithm/pstl_backends/cpu_backends/for_each.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/pstl_backends/cpu_backends/for_each.h'}}
|
||||
#include <__algorithm/pstl_backends/cpu_backends/serial.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/pstl_backends/cpu_backends/serial.h'}}
|
||||
#include <__algorithm/pstl_backends/cpu_backends/thread.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/pstl_backends/cpu_backends/thread.h'}}
|
||||
#include <__algorithm/pstl_backends/cpu_backends/transform.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/pstl_backends/cpu_backends/transform.h'}}
|
||||
#include <__algorithm/push_heap.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/push_heap.h'}}
|
||||
#include <__algorithm/ranges_adjacent_find.h> // expected-error@*:* {{use of private header from outside its module: '__algorithm/ranges_adjacent_find.h'}}
|
||||
|
Loading…
Reference in New Issue
Block a user