diff --git a/backend/src/codegenvisitor.cpp b/backend/src/codegenvisitor.cpp index a0eec179..ee10ae61 100644 --- a/backend/src/codegenvisitor.cpp +++ b/backend/src/codegenvisitor.cpp @@ -631,7 +631,7 @@ struct StatementVisitor { //auto const& rk = std::get>(node->indexSet.kind); //auto & indices = rk->args; - os << "chplx::forall(chplx::Range{"; + os << "chplx::forall(HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{"; if(node->indexSet.size() == 1) { ExprVisitor ev{os}; @@ -686,7 +686,7 @@ struct StatementVisitor { //auto const& rk = std::get>(node->indexSet.kind); //auto & indices = rk->args; - os << "chplx::coforall(chplx::Range{"; + os << "chplx::coforall(HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{"; /* if(std::holds_alternative(indices[0].kind)) { os << int_kind::value(indices[0].literal[0]); diff --git a/backend/test/forall/forall.cpp.good b/backend/test/forall/forall.cpp.good index 58082c9a..9043f392 100644 --- a/backend/test/forall/forall.cpp.good +++ b/backend/test/forall/forall.cpp.good @@ -18,10 +18,11 @@ namespace forall { B(i) = 1.000000; }); #line 43 "forall.chpl" - chplx::forall(chplx::Range{0, 9}, [&](auto i) { + chplx::forall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, 9}, [&](auto i) { #line 44 "forall.chpl" - B(i) = 1.000000; - }); + B(i) = 1.000000; + }); }; void __thisModule::__main() @@ -43,20 +44,22 @@ namespace forall { std::cout << i << std::endl; }); #line 16 "forall.chpl" - chplx::forall(chplx::Range{0, 10}, [&](auto i) { + chplx::forall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, 10}, [&](auto i) { #line 17 "forall.chpl" - std::cout << i << std::endl; - }); + std::cout << i << std::endl; + }); #line 20 "forall.chpl" chplx::forLoop(chplx::Range{0, N}, [&](auto i) { #line 21 "forall.chpl" std::cout << i << std::endl; }); #line 24 "forall.chpl" - chplx::forall(chplx::Range{0, N}, [&](auto i) { + chplx::forall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, N}, [&](auto i) { #line 25 "forall.chpl" - std::cout << i << std::endl; - }); + std::cout << i << std::endl; + }); #line 28 "forall.chpl" chplx::forLoop(chplx::Range{0, N + 1}, [&](auto i) { #line 29 "forall.chpl" @@ -65,29 +68,32 @@ namespace forall { std::cout << i << std::endl; }); #line 33 "forall.chpl" - chplx::forall(chplx::Range{0, N + 1}, [&](auto i) { + chplx::forall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, N + 1}, [&](auto i) { #line 34 "forall.chpl" - A(i) = 1.000000; + A(i) = 1.000000; #line 35 "forall.chpl" - std::cout << i << std::endl; - }); + std::cout << i << std::endl; + }); #line 48 "forall.chpl" chplx::forLoop(chplx::Range{0, 9}, [&](auto i) { #line 49 "forall.chpl" A(i) = i; }); #line 51 "forall.chpl" - chplx::forall(chplx::Range{0, 9}, [&](auto i) { + chplx::forall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, 9}, [&](auto i) { #line 52 "forall.chpl" - A(i) = i; - }); + A(i) = i; + }); #line 54 "forall.chpl" chplx::Array> B(chplx::Range(0, 2)); #line 56 "forall.chpl" - chplx::coforall(chplx::Range{0, 2}, [&](auto tid) { + chplx::coforall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, 2}, [&](auto tid) { #line 57 "forall.chpl" - B(tid) = tid; - }); + B(tid) = tid; + }); #line 60 "forall.chpl" chplx::forLoop(chplx::Range{0, 2}, [&](auto i) { #line 61 "forall.chpl" @@ -96,10 +102,11 @@ namespace forall { #line 63 "forall.chpl" chplx::Array> C(chplx::Range(0, 2)); #line 64 "forall.chpl" - chplx::coforall(chplx::Range{0, 2}, [&](auto tid) { + chplx::coforall( + HPX_CURRENT_SOURCE_LOCATION(), chplx::Range{0, 2}, [&](auto tid) { #line 65 "forall.chpl" - C(tid) = tid; - }); + C(tid) = tid; + }); #line 67 "forall.chpl" chplx::forLoop(chplx::Range{0, 2}, [&](auto i) { #line 68 "forall.chpl" diff --git a/library/.cmake-format.py b/library/.cmake-format.py new file mode 100644 index 00000000..ab32d25a --- /dev/null +++ b/library/.cmake-format.py @@ -0,0 +1,594 @@ +# Copyright (c) 2020-2023 Hartmut Kaiser +# +# SPDX-License-Identifier: BSL-1.0 +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +# This cmake-format configuration file is a suggested configuration file for +# formatting CMake files for the HPX project. + +# PLEASE NOTE: This file has been created and tested with cmake-format V0.6.10 + +# ----------------------------- +# Options affecting formatting. +# ----------------------------- +with section("format"): + + # If true, separate function names from parentheses with a space + separate_fn_name_with_space = False + + # Format command names consistently as 'lower' or 'upper' case + command_case = u'lower' + + # If the statement spelling length (including space and parenthesis) is + # larger + # than the tab width by more than this amount, then force reject un-nested + # layouts. + max_prefix_chars = 10 + + # If the trailing parenthesis must be 'dangled' on its own line, then align + # it + # to this reference: `prefix`: the start of the statement, `prefix-indent`: + # the start of the statement, plus one indentation level, `child`: align to + # the column of the arguments + dangle_align = u'prefix' + + # If an argument group contains more than this many sub-groups (parg or kwarg + # groups) then force it to a vertical layout. + max_subgroups_hwrap = 2 + + # If the statement spelling length (including space and parenthesis) is + # smaller than this amount, then force reject nested layouts. + min_prefix_chars = 4 + + # If a positional argument group contains more than this many arguments, then + # force it to a vertical layout. + max_pargs_hwrap = 6 + + # If a candidate layout is wrapped horizontally but it exceeds this many + # lines, then reject the layout. + max_lines_hwrap = 2 + + # If true, the parsers may infer whether or not an argument list is sortable + # (without annotation). + autosort = False + + # What style line endings to use in the output. + line_ending = u'auto' + + # How wide to allow formatted cmake files + line_width = 80 + + # If a statement is wrapped to more than one line, than dangle the closing + # parenthesis on its own line. + dangle_parens = True + + # How many spaces to tab for indent + tab_size = 2 + + # A list of command names which should always be wrapped + always_wrap = [] + + # If true, separate flow control names from their parentheses with a space + separate_ctrl_name_with_space = False + + # If a cmdline positional group consumes more than this many lines without + # nesting, then invalidate the layout (and nest) + max_rows_cmdline = 2 + + # By default, if cmake-format cannot successfully fit everything into the + # desired linewidth it will apply the last, most aggressive attempt that it + # made. If this flag is True, however, cmake-format will print error, exit + # with non-zero status code, and write-out nothing + require_valid_layout = False + + # Format keywords consistently as 'lower' or 'upper' case + keyword_case = u'unchanged' + + # If true, the argument lists which are known to be sortable will be sorted + # lexicographicall + enable_sort = True + + # A dictionary mapping layout nodes to a list of wrap decisions. See the + # documentation for more information. + layout_passes = {} + +# ------------------------------------------------ +# Options affecting comment reflow and formatting. +# ------------------------------------------------ +with section("markup"): + + # If comment markup is enabled, don't reflow any comment block which matches + # this (regex) pattern. Default is `None` (disabled). + literal_comment_pattern = None + + # If a comment line starts with at least this many consecutive hash + # characters, then don't lstrip() them off. This allows for lazy hash rulers + # where the first hash char is not separated by space + hashruler_min_length = 10 + + # Regular expression to match preformat fences in comments default= + # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` + fence_pattern = u'^\\s*([`~]{3}[`~]*)(.*)$' + + # If true, then insert a space between the first hash char and remaining hash + # chars in a hash ruler, and normalize its length to fill the column + canonicalize_hashrulers = True + + # If a comment line matches starts with this pattern then it is explicitly a + # trailing comment for the preceding argument. Default is '#<' + explicit_trailing_pattern = u'#<' + + # If comment markup is enabled, don't reflow the first comment block in each + # listfile. Use this to preserve formatting of your copyright/license + # statements. + first_comment_is_literal = True + + # enable comment markup parsing and reflow + enable_markup = True + + # Regular expression to match rulers in comments default= + # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` + ruler_pattern = u'^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' + + # What character to use as punctuation after numerals in an enumerated list + enum_char = u'.' + + # What character to use for bulleted lists + bullet_char = u'*' + +# ---------------------------- +# Options affecting the linter +# ---------------------------- +with section("lint"): + + # regular expression pattern describing valid function names + function_pattern = u'[0-9a-z_]+' + + # regular expression pattern describing valid names for function/macro + # arguments and loop variables. + argument_var_pattern = u'[a-z][a-z0-9_]+' + + # a list of lint codes to disable + disabled_codes = [] + + # Require at least this many newlines between statements + min_statement_spacing = 1 + + # regular expression pattern describing valid macro names + macro_pattern = u'[0-9A-Z_]+' + + # regular expression pattern describing valid names for public directory + # variables + public_var_pattern = u'[A-Z][0-9A-Z_]+' + max_statements = 50 + + # In the heuristic for C0201, how many conditionals to match within a loop in + # before considering the loop a parser. + max_conditionals_custom_parser = 2 + + # regular expression pattern describing valid names for variables with global + # (cache) scope + global_var_pattern = u'[A-Z][0-9A-Z_]+' + + # regular expression pattern describing valid names for keywords used in + # functions or macros + keyword_pattern = u'[A-Z][0-9A-Z_]+' + max_arguments = 5 + + # regular expression pattern describing valid names for privatedirectory + # variables + private_var_pattern = u'_[0-9a-z_]+' + max_localvars = 15 + max_branches = 12 + + # regular expression pattern describing valid names for variables with local + # scope + local_var_pattern = u'[a-z][a-z0-9_]+' + + # Require no more than this many newlines between statements + max_statement_spacing = 2 + + # regular expression pattern describing valid names for variables with global + # scope (but internal semantic) + internal_var_pattern = u'_[A-Z][0-9A-Z_]+' + max_returns = 6 + +# ------------------------------------- +# Miscellaneous configurations options. +# ------------------------------------- +with section("misc"): + + # A dictionary containing any per-command configuration overrides. Currently + # only `command_case` is supported. + per_command = { } + +# ---------------------------------- +# Options affecting listfile parsing +# ---------------------------------- +with section("parse"): + + # Specify structure for custom cmake functions + # (the body of this structure was generated using + # 'cmake-genparsers -f python cmake/HPX*.cmake' + # + additional_commands = { + 'add_hpx_compile_test': { 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '2+'}}, + 'add_hpx_compile_test_target_dependencies': { + 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '2+'}}, + 'add_hpx_component': { 'kwargs': { 'AUXILIARY': '+', + 'COMPILE_FLAGS': '+', + 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'HEADERS': '+', + 'HEADER_GLOB': 1, + 'HEADER_ROOT': 1, + 'INI': 1, + 'INSTALL_SUFFIX': 1, + 'INSTALL_COMPONENT': 1, + 'LANGUAGE': 1, + 'LINK_FLAGS': '+', + 'OUTPUT_SUFFIX': 1, + 'SOURCES': '+', + 'SOURCE_GLOB': 1, + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['EXCLUDE_FROM_ALL', + 'INSTALL_HEADERS', + 'INTERNAL_FLAGS', + 'NOEXPORT', + 'AUTOGLOB', + 'STATIC', + 'PLUGIN', + 'PREPEND_SOURCE_ROOT', + 'PREPEND_HEADER_ROOT', + 'UNITY_BUILD'], + 'nargs': '1+'}}, + 'add_hpx_config_test': { 'kwargs': { 'ARGS': '+', + 'CMAKECXXFEATURE': 1, + 'COMPILE_DEFINITIONS': '+', + 'DEFINITIONS': '+', + 'INCLUDE_DIRECTORIES': '+', + 'LIBRARIES': '+', + 'LINK_DIRECTORIES': '+', + 'REQUIRED': '+', + 'ROOT': 1, + 'SOURCE': 1}, + 'pargs': { 'flags': ['FILE', 'EXECUTE'], + 'nargs': '1+'}}, + 'add_hpx_example_target_dependencies': { 'kwargs': {}, + 'pargs': { 'flags': ['DEPS_ONLY'], + 'nargs': '2+'}}, + 'add_hpx_example_test': {'pargs': {'nargs': 2}}, + 'add_hpx_executable': { 'kwargs': { 'AUXILIARY': '+', + 'COMPILE_FLAGS': '+', + 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'HEADERS': '+', + 'HEADER_GLOB': 1, + 'HEADER_ROOT': 1, + 'HPX_PREFIX': 1, + 'INI': 1, + 'INSTALL_SUFFIX': 1, + 'LANGUAGE': 1, + 'LINK_FLAGS': '+', + 'OUTPUT_SUFFIX': 1, + 'SOURCES': '+', + 'SOURCE_GLOB': 1, + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['EXCLUDE_FROM_ALL', + 'EXCLUDE_FROM_DEFAULT_BUILD', + 'AUTOGLOB', + 'INTERNAL_FLAGS', + 'NOLIBS', + 'NOHPX_INIT'], + 'nargs': '1+'}}, + 'add_hpx_header_tests': { 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'EXCLUDE': '+', + 'EXCLUDE_FROM_ALL': '+', + 'HEADERS': '+', + 'HEADER_ROOT': 1}, + 'pargs': {'flags': ['NOLIBS'], 'nargs': '1+'}}, + 'add_hpx_headers_compile_test': { + 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '2+'}}, + 'add_hpx_library': { 'kwargs': { 'AUXILIARY': '+', + 'COMPILER_FLAGS': '+', + 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'HEADERS': '+', + 'HEADER_GLOB': 1, + 'HEADER_ROOT': 1, + 'INSTALL_SUFFIX': 1, + 'LINK_FLAGS': '+', + 'OUTPUT_SUFFIX': 1, + 'SOURCES': '+', + 'SOURCE_GLOB': 1, + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['EXCLUDE_FROM_ALL', + 'INSTALL_HEADERS', + 'INTERNAL_FLAGS', + 'NOLIBS', + 'NOEXPORT', + 'AUTOGLOB', + 'STATIC', + 'PLUGIN', + 'NONAMEPREFIX', + 'PREPEND_SOURCE_ROOT', + 'PREPEND_HEADER_ROOT', + 'UNITY_BUILD'], + 'nargs': '1+'}}, + 'add_hpx_library_headers': { 'kwargs': {'EXCLUDE': '+', 'GLOBS': '+'}, + 'pargs': {'flags': ['APPEND'], 'nargs': '2+'}}, + 'add_hpx_library_headers_noglob': { 'kwargs': { 'EXCLUDE': '+', + 'HEADERS': '+'}, + 'pargs': { 'flags': ['APPEND'], + 'nargs': '1+'}}, + 'add_hpx_library_sources': { 'kwargs': {'EXCLUDE': '+', 'GLOBS': '+'}, + 'pargs': {'flags': ['APPEND'], 'nargs': '2+'}}, + 'add_hpx_library_sources_noglob': { 'kwargs': { 'EXCLUDE': '+', + 'SOURCES': '+'}, + 'pargs': { 'flags': ['APPEND'], + 'nargs': '1+'}}, + 'add_hpx_module': { 'kwargs': { 'CMAKE_SUBDIRS': '+', + 'COMPAT_HEADERS': '+', + 'GENERATED_HEADERS': '+', + 'DEPENDENCIES': '+', + 'EXCLUDE_FROM_GLOBAL_HEADER': '+', + 'ADD_TO_GLOBAL_HEADER': '+', + 'GLOBAL_HEADER_GEN': 1, + 'HEADERS': '+', + 'OBJECTS': '+', + 'MODULE_DEPENDENCIES': '+', + 'SOURCES': '+'}, + 'pargs': { 'flags': ['CUDA', + 'CONFIG_FILES', + 'NO_CONFIG_IN_GENERATED_HEADERS'], + 'nargs': '1+'}}, + 'add_hpx_performance_test': {'pargs': {'nargs': 2}}, + 'add_hpx_pseudo_dependencies': {'pargs': {'nargs': 0}}, + 'add_hpx_pseudo_dependencies_no_shortening': {'pargs': {'nargs': 0}}, + 'add_hpx_pseudo_target': {'pargs': {'nargs': 0}}, + 'add_hpx_regression_compile_test': { + 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '2+'}}, + 'add_hpx_regression_test': { 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'EXECUTABLE': 1, + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1, + 'ARGS': '+', + 'EXECUTABLE': 1, + 'PSEUDO_DEPS_NAME': 1, + 'LOCALITIES': 1, + 'PARCELPORTS': '+', + 'THREADS_PER_LOCALITY': 1, + 'TIMEOUT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', + 'NOLIBS', + 'RUN_SERIAL', + 'NO_PARCELPORT_TCP', + 'NO_PARCELPORT_LCI', + 'NO_PARCELPORT_MPI', + 'NO_PARCELPORT_GASNET'], + 'nargs': '2+'}}, + 'add_hpx_source_group': { 'kwargs': { 'CLASS': 1, + 'NAME': 1, + 'ROOT': 1, + 'TARGETS': '+'}, + 'pargs': {'flags': [], 'nargs': '*'}}, + 'add_hpx_test': { 'kwargs': { 'ARGS': '+', + 'EXECUTABLE': 1, + 'LOCALITIES': 1, + 'PARCELPORTS': '+', + 'THREADS_PER_LOCALITY': 1}, + 'pargs': {'flags': ['FAILURE_EXPECTED', + 'RUN_SERIAL', + 'NO_PARCELPORT_TCP', + 'NO_PARCELPORT_LCI', + 'NO_PARCELPORT_MPI'], + 'nargs': '2+'}}, + 'add_hpx_test_target_dependencies': { 'kwargs': {'PSEUDO_DEPS_NAME': 1}, + 'pargs': {'flags': [], 'nargs': '2+'}}, + 'add_hpx_unit_compile_test': { + 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '2+'}}, + 'add_hpx_unit_test': { 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1, + 'ARGS': '+', + 'EXECUTABLE': 1, + 'PSEUDO_DEPS_NAME': 1, + 'LOCALITIES': 1, + 'PARCELPORTS': '+', + 'THREADS_PER_LOCALITY': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', + 'NOLIBS', + 'RUN_SERIAL', + 'NO_PARCELPORT_TCP', + 'NO_PARCELPORT_LCI', + 'NO_PARCELPORT_MPI'], + 'nargs': '2+'}}, + 'add_parcelport': { 'kwargs': { 'COMPILE_FLAGS': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'HEADERS': '+', + 'INCLUDE_DIRS': '+', + 'LINK_FLAGS': '+', + 'SOURCES': '+'}, + 'pargs': {'flags': ['STATIC', 'EXPORT'], 'nargs': '1+'}}, + 'add_test_and_deps_compile_test': { + 'kwargs': { 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'SOURCES': '+', + 'SOURCE_ROOT': 1}, + 'pargs': { 'flags': ['FAILURE_EXPECTED', 'NOLIBS'], + 'nargs': '3+'}}, + 'add_test_and_deps_test': {'pargs': {'nargs': 3}}, + 'create_configuration_summary': {'pargs': {'nargs': 2}}, + 'create_symbolic_link': {'pargs': {'nargs': 2}}, + 'get_target_property': {'pargs': {'nargs': 3}}, + 'hpx_add_compile_flag': {'pargs': {'nargs': 0}}, + 'hpx_add_compile_flag_if_available': { 'kwargs': { 'CONFIGURATIONS': '+', + 'LANGUAGES': '+', + 'NAME': 1}, + 'pargs': {'flags': [], 'nargs': '1+'}}, + 'hpx_add_config_cond_define': {'pargs': {'nargs': 1}}, + 'hpx_add_config_define': {'pargs': {'nargs': 1}}, + 'hpx_add_config_define_namespace': { 'kwargs': { 'DEFINE': 1, + 'NAMESPACE': 1, + 'VALUE': '+'}, + 'pargs': {'flags': [], 'nargs': '*'}}, + 'hpx_add_link_flag': { 'kwargs': {'CONFIGURATIONS': '+', 'TARGETS': '+'}, + 'pargs': {'flags': [], 'nargs': '1+'}}, + 'hpx_add_link_flag_if_available': { 'kwargs': {'NAME': 1, 'TARGETS': '+'}, + 'pargs': {'flags': [], 'nargs': '1+'}}, + 'hpx_add_target_compile_definition': { 'kwargs': {'CONFIGURATIONS': '+'}, + 'pargs': { 'flags': ['PUBLIC'], + 'nargs': '1+'}}, + 'hpx_add_target_compile_option': { 'kwargs': { 'CONFIGURATIONS': '+', + 'LANGUAGES': '+'}, + 'pargs': { 'flags': ['PUBLIC'], + 'nargs': '1+'}}, + 'hpx_add_target_compile_option_if_available': { 'kwargs': { 'CONFIGURATIONS': '+', + 'LANGUAGES': '+', + 'NAME': 1}, + 'pargs': { 'flags': ['PUBLIC'], + 'nargs': '1+'}}, + 'hpx_append_property': {'pargs': {'nargs': 2}}, + 'hpx_check_for_builtin_integer_pack': {'pargs': {'nargs': 0}}, + 'hpx_check_for_builtin_make_integer_seq': {'pargs': {'nargs': 0}}, + 'hpx_check_for_builtin_type_pack_element': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx11_std_atomic': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx11_std_atomic_128bit': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx11_std_quick_exit': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx11_std_shared_ptr_lwg3018': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx17_aligned_new': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx17_filesystem': {'pargs': {'nargs': 0}}, + 'hpx_check_for_cxx17_hardware_destructive_interference_size': { 'pargs': { 'nargs': 0}}, + 'hpx_check_for_libfun_std_experimental_optional': {'pargs': {'nargs': 0}}, + 'hpx_check_for_mm_prefetch': {'pargs': {'nargs': 0}}, + 'hpx_check_for_stable_inplace_merge': {'pargs': {'nargs': 0}}, + 'hpx_check_for_unistd_h': {'pargs': {'nargs': 0}}, + 'hpx_collect_usage_requirements': { 'kwargs': {'EXCLUDE': '+'}, + 'pargs': {'flags': [], 'nargs': '10+'}}, + 'hpx_config_loglevel': {'pargs': {'nargs': 2}}, + 'hpx_construct_cflag_list': {'pargs': {'nargs': 6}}, + 'hpx_construct_library_list': {'pargs': {'nargs': 3}}, + 'hpx_cpuid': {'pargs': {'nargs': 2}}, + 'hpx_debug': {'pargs': {'nargs': 0}}, + 'hpx_error': {'pargs': {'nargs': 0}}, + 'hpx_export_modules_targets': {'pargs': {'nargs': 0}}, + 'hpx_export_targets': {'pargs': {'nargs': 0}}, + 'hpx_force_out_of_tree_build': {'pargs': {'nargs': 1}}, + 'hpx_generate_pkgconfig_from_target': { 'kwargs': {'EXCLUDE': '+'}, + 'pargs': { 'flags': [], + 'nargs': '3+'}}, + 'hpx_handle_component_dependencies': {'pargs': {'nargs': 1}}, + 'hpx_include': {'pargs': {'nargs': 0}}, + 'hpx_info': {'pargs': {'nargs': 0}}, + 'hpx_message': {'pargs': {'nargs': 1}}, + 'hpx_option': { 'kwargs': {'CATEGORY': 1, 'MODULE': 1, 'STRINGS': '+'}, + 'pargs': {'flags': ['ADVANCED'], 'nargs': '4+'}}, + 'hpx_perform_cxx_feature_tests': {'pargs': {'nargs': 0}}, + 'hpx_print_list': {'pargs': {'nargs': 3}}, + 'hpx_remove_link_flag': { 'kwargs': {'CONFIGURATIONS': '+', 'TARGETS': '+'}, + 'pargs': {'flags': [], 'nargs': '1+'}}, + 'hpx_remove_target_compile_option': { 'kwargs': {'CONFIGURATIONS': '+'}, + 'pargs': { 'flags': ['PUBLIC'], + 'nargs': '1+'}}, + 'hpx_sanitize_usage_requirements': {'pargs': {'nargs': 2}}, + 'hpx_set_cmake_policy': {'pargs': {'nargs': 2}}, + 'hpx_set_lib_name': {'pargs': {'nargs': 2}}, + 'hpx_set_option': { 'kwargs': {'HELPSTRING': 1, 'TYPE': 1, 'VALUE': 1}, + 'pargs': {'flags': ['FORCE'], 'nargs': '1+'}}, + 'hpx_setup_target': { 'kwargs': { 'COMPILE_FLAGS': '+', + 'COMPONENT_DEPENDENCIES': '+', + 'DEPENDENCIES': '+', + 'FOLDER': 1, + 'HEADER_ROOT': 1, + 'HPX_PREFIX': 1, + 'INSTALL_FLAGS': '+', + 'INSTALL_PDB': '+', + 'LINK_FLAGS': '+', + 'NAME': 1, + 'SOVERSION': 1, + 'TYPE': 1, + 'VERSION': 1}, + 'pargs': { 'flags': ['EXPORT', + 'INSTALL', + 'INSTALL_HEADERS', + 'INTERNAL_FLAGS', + 'NOLIBS', + 'PLUGIN', + 'NONAMEPREFIX', + 'NOTLLKEYWORD'], + 'nargs': '1+'}}, + 'hpx_source_to_doxygen': { 'kwargs': { 'DEPENDENCIES': '+', + 'DOXYGEN_ARGS': '+'}, + 'pargs': {'flags': [], 'nargs': '1+'}}, + 'hpx_warn': {'pargs': {'nargs': 0}}, + 'hpx_setup_mpi': {'pargs': {'nargs': 0}}, + 'shorten_hpx_pseudo_target': {'pargs': {'nargs': 2}}, + 'write_config_defines_file': { 'kwargs': { 'FILENAME': 1, + 'NAMESPACE': 1, + 'TEMPLATE': 1}, + 'pargs': {'flags': [], 'nargs': '*'}} + } + + # Specify property tags. + proptags = [] + + # Specify variable tags. + vartags = [] + +# ------------------------------- +# Options affecting file encoding +# ------------------------------- +with section("encode"): + + # If true, emit the unicode byte-order mark (BOM) at the start of the file + emit_byteorder_mark = False + + # Specify the encoding of the input file. Defaults to utf-8 + input_encoding = u'utf-8' + + # Specify the encoding of the output file. Defaults to utf-8. Note that + # cmake + # only claims to support utf-8 so be careful when using anything else + output_encoding = u'utf-8' + diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 35db99f9..c152d509 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Hartmut Kaiser +# Copyright (c) 2023-2025 Hartmut Kaiser # # SPDX-License-Identifier: BSL-1.0 # Distributed under the Boost Software License, Version 1.0. *(See accompanying @@ -26,22 +26,31 @@ project(chplx_library VERSION ${CHPLX_LIBRARY_VERSION}) include(FetchContent) -set(HPX_USE_CMAKE_CXX_STANDARD ON CACHE BOOL "") -set(HPX_WITH_CXX20 ON CACHE BOOL "") +set(HPX_USE_CMAKE_CXX_STANDARD + ON + CACHE BOOL "" +) +set(HPX_WITH_CXX20 + ON + CACHE BOOL "" +) -set(hpx_repository https://github.com/STEllAR-GROUP/hpx.git CACHE STRING "URL for hpx") +set(hpx_repository + https://github.com/STEllAR-GROUP/hpx.git + CACHE STRING "URL for hpx" +) if(CHPLX_WITH_FETCH_HPX) - FetchContent_Declare( + fetchcontent_declare( jemalloc GIT_REPOSITORY https://github.com/jemalloc/jemalloc.git - GIT_TAG 5.3.0 + GIT_TAG 5.3.0 ) # 2) Populate & build/install via Autotools at configure time - FetchContent_GetProperties(jemalloc) + fetchcontent_getproperties(jemalloc) if(NOT jemalloc_POPULATED) - FetchContent_Populate(jemalloc) + fetchcontent_populate(jemalloc) # where we'll stage the install set(JEMALLOC_INSTALL_DIR ${CMAKE_BINARY_DIR}/_deps/jemalloc-install) @@ -54,15 +63,13 @@ if(CHPLX_WITH_FETCH_HPX) OUTPUT_QUIET ) execute_process( - COMMAND ./configure - --prefix=${JEMALLOC_INSTALL_DIR} - --enable-shared + COMMAND ./configure --prefix=${JEMALLOC_INSTALL_DIR} --enable-shared --disable-static WORKING_DIRECTORY ${jemalloc_SOURCE_DIR} OUTPUT_QUIET ) execute_process( - COMMAND make -j # or make -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND make -j # or make -j${CMAKE_BUILD_PARALLEL_LEVEL} WORKING_DIRECTORY ${jemalloc_SOURCE_DIR} OUTPUT_QUIET ) @@ -72,32 +79,61 @@ if(CHPLX_WITH_FETCH_HPX) OUTPUT_QUIET ) - set(jemalloc_POPULATED ON CACHE BOOL "set it to prevent building again") - set(Jemalloc_ROOT ${JEMALLOC_INSTALL_DIR} CACHE PATH "Path for Jemalloc") + set(jemalloc_POPULATED + ON + CACHE BOOL "set it to prevent building again" + ) + set(Jemalloc_ROOT + ${JEMALLOC_INSTALL_DIR} + CACHE PATH "Path for Jemalloc" + ) endif() # Tell CMake to look in our staging area for find_package() list(APPEND CMAKE_PREFIX_PATH "${JEMALLOC_INSTALL_DIR}") - - FetchContent_Declare(hpx + fetchcontent_declare( + hpx GIT_REPOSITORY ${hpx_repository} GIT_TAG master GIT_PROGRESS TRUE GIT_SHALLOW 1 ) - set(HPX_WITH_FETCH_ASIO ON CACHE BOOL "FETCH ASIO for HPX") - set(HPX_WITH_FETCH_BOOST OFF CACHE BOOL "FETCH BOOST for HPX") - set(HPX_WITH_FETCH_HWLOC ON CACHE BOOL "FETCH HWLOC for HPX") - set(HPX_WITH_EXAMPLES OFF CACHE BOOL "Examples for HPX") - set(HPX_WITH_TESTS OFF CACHE BOOL "Tests for HPX") - set(HPX_WITH_MALLOC jemalloc CACHE STRING "Malloc type for HPX") - - if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64") - set(HPX_WITH_GENERIC_CONTEXT_COROUTINES ON CACHE BOOL "Enable generic context coroutines on AArch64" FORCE) + set(HPX_WITH_FETCH_ASIO + ON + CACHE BOOL "FETCH ASIO for HPX" + ) + set(HPX_WITH_FETCH_BOOST + OFF + CACHE BOOL "FETCH BOOST for HPX" + ) + set(HPX_WITH_FETCH_HWLOC + ON + CACHE BOOL "FETCH HWLOC for HPX" + ) + set(HPX_WITH_EXAMPLES + OFF + CACHE BOOL "Examples for HPX" + ) + set(HPX_WITH_TESTS + OFF + CACHE BOOL "Tests for HPX" + ) + set(HPX_WITH_MALLOC + jemalloc + CACHE STRING "Malloc type for HPX" + ) + + if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES + "arm64" + ) + set(HPX_WITH_GENERIC_CONTEXT_COROUTINES + ON + CACHE BOOL "Enable generic context coroutines on AArch64" FORCE + ) message(STATUS "HPX_WITH_GENERIC_CONTEXT_COROUTINES: ON") endif() - FetchContent_MakeAvailable(hpx) + fetchcontent_makeavailable(hpx) else() find_package(HPX REQUIRED CONFIG) endif() @@ -107,7 +143,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake") set_property(GLOBAL PROPERTY USE_FOLDERS ON) # create library target -set(chplx_library_detail_headers include/chplx/detail/iterator_generator.hpp) +set(chplx_library_detail_headers include/chplx/detail/generate_annotation.hpp + include/chplx/detail/iterator_generator.hpp +) source_group("Header Files/chplx/detail" FILES ${chplx_library_detail_headers}) set(chplx_library_domain_headers include/chplx/domains/base_rectangular.hpp @@ -146,6 +184,9 @@ set(chplx_library_headers ) source_group("Header Files/chplx" FILES ${chplx_library_headers}) +set(chplx_library_detail_sources src/detail/generate_annotation.cpp) +source_group("Source Files/detail" FILES ${chplx_library_detail_sources}) + set(chplx_library_domain_sources src/domains/dmap.cpp) source_group("Source Files/domains" FILES ${chplx_library_domain_sources}) @@ -162,15 +203,18 @@ if(MSVC) set(chplx_library_sources ${chplx_library_sources} src/setenv.c) endif() -add_library(library STATIC ${chplx_library_sources} ${chplx_library_headers}) +add_library( + library STATIC ${chplx_library_sources} ${chplx_library_detail_sources} + ${chplx_library_headers} +) set_property(TARGET library PROPERTY POSITION_INDEPENDENT_CODE ON) target_link_libraries(library PRIVATE fmt::fmt-header-only HPX::hpx) target_include_directories( - library PUBLIC $ - $ + library PUBLIC $ + $ ) # define additional properties @@ -190,12 +234,9 @@ set_target_properties( # generate version file # "$,${CMAKE_INSTALL_PREFIX}/include,${CMAKE_CURRENT_SOURCE_DIR}/include>/chplx/config/version.hpp" -# if($) -# configure_file( -# "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/version.hpp.in" -# "${CMAKE_INSTALL_PREFIX}/include/chplx/config/version.hpp" @ONLY -# ) -# endif() +# if($) configure_file( +# "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/version.hpp.in" +# "${CMAKE_INSTALL_PREFIX}/include/chplx/config/version.hpp" @ONLY ) endif() # if($) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/version.hpp.in" @@ -234,13 +275,13 @@ endif() install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" # source directory DESTINATION "${CMAKE_INSTALL_PREFIX}/" # target directory - # FILES_MATCHING # install only matched files - # PATTERN "*.h" # select header files - # PATTERN "*.hpp" # select header files + # FILES_MATCHING # install only matched files PATTERN "*.h" # select header + # files PATTERN "*.hpp" # select header files ) -install(TARGETS library - EXPORT ChplxTargets +install( + TARGETS + library EXPORT ChplxTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin @@ -251,4 +292,4 @@ install( NAMESPACE Chplx:: FILE ChplxConfig.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Chplx -) \ No newline at end of file +) diff --git a/library/include/chplx/adapt_array.hpp b/library/include/chplx/adapt_array.hpp index f120d151..6c8240e2 100644 --- a/library/include/chplx/adapt_array.hpp +++ b/library/include/chplx/adapt_array.hpp @@ -14,8 +14,11 @@ #include #include +#include +#include #include +#include namespace chplx { @@ -44,15 +47,52 @@ decltype(auto) iterate(Array &&a) noexcept { return iterate(detail::IteratorGenerator(std::move(a))); } +namespace detail { + +template + requires(!std::is_pointer_v) +HPX_FORCEINLINE constexpr auto get_unwrapped_ptr(Iter it) noexcept { + + static_assert(hpx::traits::is_contiguous_iterator_v, + "optimized merge is possible for contiguous-iterators " + "only"); + + using value_t = typename std::iterator_traits::value_type; + return const_cast(hpx::bit_cast(&*it)); +} + +template + requires(std::is_pointer_v) +HPX_FORCEINLINE constexpr auto get_unwrapped_ptr(T ptr) noexcept { + using value_t = std::remove_pointer_t; + return const_cast(hpx::bit_cast(ptr)); +} + +template HPX_FORCEINLINE auto get_unwrapped(Iter it) { + + // is_contiguous_iterator_v is true for pointers + if constexpr (hpx::traits::is_contiguous_iterator_v) { + return get_unwrapped_ptr(it); + } else { + return it; + } +} + +} // namespace detail + template decltype(auto) iterate(Array> const &a) noexcept { - return hpx::util::iterator_range(a.begin(), a.end()); + auto begin = detail::get_unwrapped(a.begin()); + auto end = detail::get_unwrapped(a.end()); + return hpx::util::iterator_range(begin, end); } template decltype(auto) iterate(Array> &&a) noexcept { - return hpx::util::iterator_range(a.begin(), a.end()); + auto begin = detail::get_unwrapped(a.begin()); + auto end = detail::get_unwrapped(a.end()); + return hpx::util::iterator_range(begin, end); } } // namespace chplx diff --git a/library/include/chplx/begin.hpp b/library/include/chplx/begin.hpp index 597f6064..95ec4a5a 100644 --- a/library/include/chplx/begin.hpp +++ b/library/include/chplx/begin.hpp @@ -6,21 +6,34 @@ #pragma once +#include #include #include #include +#include +#include #include #include namespace chplx { -template void begin(F &&f, Args &&...args) { + template + void begin(hpx::source_location const& location, F&& f, Args&&... args) + { + hpx::parallel::execution::post(hpx::execution::par.executor(), + hpx::annotated_function( + std::forward(f), detail::generate_annotation(location)), + detail::task_intent>::call( + std::forward(args))...); + } - hpx::parallel::execution::post(hpx::execution::par.executor(), - std::forward(f), - detail::task_intent>::call( - std::forward(args))...); -} -} // namespace chplx + template + requires(!std::is_same_v, hpx::source_location>) + void begin(F&& f, Args&&... args) + { + begin(HPX_CURRENT_SOURCE_LOCATION(), std::forward(f), + std::forward(args)...); + } +} // namespace chplx diff --git a/library/include/chplx/cobegin.hpp b/library/include/chplx/cobegin.hpp index beefb6c2..82a6d1f9 100644 --- a/library/include/chplx/cobegin.hpp +++ b/library/include/chplx/cobegin.hpp @@ -6,20 +6,35 @@ #pragma once +#include + #include #include +#include #include namespace chplx { -template void cobegin(F &&f, Fs &&...fs) { + template + void cobegin(hpx::source_location const& location, F&& f, Fs&&... fs) + { + auto exec = hpx::execution::par.executor(); + hpx::experimental::task_group g; + + auto annotation = detail::generate_annotation(location); - auto exec = hpx::execution::par.executor(); - hpx::experimental::task_group g; + g.run(exec, hpx::annotated_function(std::forward(f), annotation)); + (g.run(exec, hpx::annotated_function(std::forward(fs), annotation)), + ...); - g.run(exec, std::forward(f)); - (g.run(exec, std::forward(fs)), ...); + g.wait(); + } - g.wait(); -} -} // namespace chplx + template + requires(!std::is_same_v, hpx::source_location>) + void cobegin(F&& f, Fs&&... fs) + { + cobegin(HPX_CURRENT_SOURCE_LOCATION(), std::forward(f), + std::forward(fs)...); + } +} // namespace chplx diff --git a/library/include/chplx/coforall_loop.hpp b/library/include/chplx/coforall_loop.hpp index 33675afb..3d7e9e4c 100644 --- a/library/include/chplx/coforall_loop.hpp +++ b/library/include/chplx/coforall_loop.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #include #include @@ -46,7 +48,6 @@ void coforall(Tuple &t, F &&f, Args &&...args) { using base_tuple = typename Tuple::base_type; if constexpr (std::tuple_size_v != 0) { if constexpr (Tuple::isHomogenous()) { - hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](auto val, auto &&...fargs) { @@ -56,7 +57,6 @@ void coforall(Tuple &t, F &&f, Args &&...args) { detail::task_intent>::call( std::forward(args))...)); } else { - using table = detail::forLoopTable< Tuple, std::decay_t, std::make_index_sequence>, Args...>; @@ -75,22 +75,31 @@ void coforall(Tuple &t, F &&f, Args &&...args) { } // namespace detail template -void coforall(Tuple &t, F &&f, Args &&...args) { - - detail::coforall(t, std::forward(f), std::forward(args)...); +void coforall(hpx::source_location const &location, Tuple &t, F &&f, + Args &&...args) { + detail::coforall( + t, + hpx::annotated_function(std::forward(f), + detail::generate_annotation(location)), + std::forward(args)...); } template -void coforall(Tuple const &t, F &&f, Args &&...args) { - - detail::coforall(t, std::forward(f), std::forward(args)...); +void coforall(hpx::source_location const &location, Tuple const &t, + F &&f, Args &&...args) { + detail::coforall( + t, + hpx::annotated_function(std::forward(f), + detail::generate_annotation(location)), + std::forward(args)...); } //----------------------------------------------------------------------------- // coforall loop for ranges template -void coforall(Range const &r, F &&f, +void coforall(hpx::source_location const &location, + Range const &r, F &&f, Args &&...args) { #if HPX_VERSION_FULL >= 0x011100 @@ -103,10 +112,14 @@ void coforall(Range const &r, F &&f, hpx::threads::thread_sharing_hint::do_not_combine_tasks); #endif + auto wrapped = + hpx::annotated_function(f, detail::generate_annotation(location)); + hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](std::size_t idx, auto &&...fargs) { - return f(r.orderToIndex(idx), std::forward(fargs)...); + return wrapped(r.orderToIndex(idx), + std::forward(fargs)...); }, r.size(), detail::task_intent>::call( @@ -116,7 +129,8 @@ void coforall(Range const &r, F &&f, //----------------------------------------------------------------------------- // coforall loop for domain template -void coforall(Domain const &d, F &&f, Args &&...args) { +void coforall(hpx::source_location const &location, + Domain const &d, F &&f, Args &&...args) { #if HPX_VERSION_FULL >= 0x011100 auto policy = hpx::execution::experimental::adapt_sharing_mode( @@ -128,10 +142,14 @@ void coforall(Domain const &d, F &&f, Args &&...args) { hpx::threads::thread_sharing_hint::do_not_combine_tasks); #endif + auto wrapped = + hpx::annotated_function(f, detail::generate_annotation(location)); + hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](std::size_t idx, auto &&...fargs) { - return f(d.orderToIndex(idx), std::forward(fargs)...); + return wrapped(d.orderToIndex(idx), + std::forward(fargs)...); }, d.size(), detail::task_intent>::call( @@ -141,7 +159,8 @@ void coforall(Domain const &d, F &&f, Args &&...args) { //----------------------------------------------------------------------------- // coforall loop for associative domain template -void coforall(AssocDomain const &d, F &&f, Args &&...args) { +void coforall(hpx::source_location const &location, AssocDomain const &d, + F &&f, Args &&...args) { #if HPX_VERSION_FULL >= 0x011100 auto policy = hpx::execution::experimental::adapt_sharing_mode( @@ -153,10 +172,14 @@ void coforall(AssocDomain const &d, F &&f, Args &&...args) { hpx::threads::thread_sharing_hint::do_not_combine_tasks); #endif + auto wrapped = + hpx::annotated_function(f, detail::generate_annotation(location)); + hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](std::size_t idx, auto &&...fargs) { - return f(d.orderToIndex(idx), std::forward(fargs)...); + return wrapped(d.orderToIndex(idx), + std::forward(fargs)...); }, d.size(), detail::task_intent>::call( @@ -166,7 +189,8 @@ void coforall(AssocDomain const &d, F &&f, Args &&...args) { //----------------------------------------------------------------------------- // forall loop for zippered iteration template -void coforall(detail::ZipRange const &zr, F &&f, Args &&...args) { +void coforall(hpx::source_location const &location, + detail::ZipRange const &zr, F &&f, Args &&...args) { #if HPX_VERSION_FULL >= 0x011100 auto policy = hpx::execution::experimental::adapt_sharing_mode( @@ -178,10 +202,14 @@ void coforall(detail::ZipRange const &zr, F &&f, Args &&...args) { hpx::threads::thread_sharing_hint::do_not_combine_tasks); #endif + auto wrapped = + hpx::annotated_function(f, detail::generate_annotation(location)); + hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](std::size_t idx, auto &&...fargs) { - return f(zr.orderToIndex(idx), std::forward(fargs)...); + return wrapped(zr.orderToIndex(idx), + std::forward(fargs)...); }, zr.size(), detail::task_intent>::call( @@ -191,7 +219,8 @@ void coforall(detail::ZipRange const &zr, F &&f, Args &&...args) { //----------------------------------------------------------------------------- // forall loop for array iteration template -void coforall(Array const &a, F &&f, Args &&...args) { +void coforall(hpx::source_location const &location, Array const &a, + F &&f, Args &&...args) { #if HPX_VERSION_FULL >= 0x011100 auto policy = hpx::execution::experimental::adapt_sharing_mode( @@ -203,14 +232,24 @@ void coforall(Array const &a, F &&f, Args &&...args) { hpx::threads::thread_sharing_hint::do_not_combine_tasks); #endif + auto wrapped = + hpx::annotated_function(f, detail::generate_annotation(location)); + hpx::wait_all(hpx::parallel::execution::bulk_async_execute( policy.executor(), [&](std::size_t idx, auto &&...fargs) { - return f(a[idx], std::forward(fargs)...); + return wrapped(a[idx], std::forward(fargs)...); }, a.size(), detail::task_intent>::call( std::forward(args))...)); } +template + requires(!std::is_same_v, hpx::source_location>) +void coforall(Target &&t, F &&f, Args &&...args) { + coforall(HPX_CURRENT_SOURCE_LOCATION(), std::forward(t), + std::forward(f), std::forward(args)...); +} + } // namespace chplx diff --git a/library/include/chplx/util.hpp b/library/include/chplx/util.hpp index df2343e6..cc6bdd65 100644 --- a/library/include/chplx/util.hpp +++ b/library/include/chplx/util.hpp @@ -10,12 +10,14 @@ namespace chplx { -// register startup/shutdown code for a module -template struct registerModule { - - registerModule() { - hpx::register_pre_startup_function(&Module::__construct); - hpx::register_pre_shutdown_function(&Module::__destruct); - } -}; -} // namespace chplx + // register startup/shutdown code for a module + template + struct registerModule + { + registerModule() + { + hpx::register_pre_startup_function(&Module::__construct); + hpx::register_pre_shutdown_function(&Module::__destruct); + } + }; +} // namespace chplx diff --git a/library/src/locale.cpp b/library/src/locale.cpp index 5eb0edf4..1a9d160c 100644 --- a/library/src/locale.cpp +++ b/library/src/locale.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include