diff --git a/build/conf/docs.conf b/build/conf/docs.conf
index c1fdcbd10e9e..710cab7dcdc4 100644
--- a/build/conf/docs.conf
+++ b/build/conf/docs.conf
@@ -11,7 +11,7 @@ TOUCH_DOCS_MF=$TOUCH_DOCS && $GENERATE_MF
###
### Copy files from src_dir to $BINDIR/dst_dir
macro DOCS_COPY_FILES(FROM="${CURDIR}", NAMESPACE=".", FILES...) {
- .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/copy_docs_files.py"} ${hide;input:"build/scripts/process_command_files.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --src-dir $FROM --dst-dir $BINDIR/$NAMESPACE $FILES ${hide;context=TEXT;input=TEXT;pre=${FROM}/:FILES} ${hide;output;pre=${NAMESPACE}/:FILES}
+ .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/copy_docs_files.py"} ${hide;input:"build/scripts/process_command_files.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --src-dir $FROM --dst-dir $BINDIR/$NAMESPACE $FILES ${hide;context=TEXT;input=TEXT;pre=${FROM}/:FILES} ${hide;output;pre=${NAMESPACE}/:FILES} $_DOCS_KV
.STRUCT_CMD=yes
}
diff --git a/build/conf/go.conf b/build/conf/go.conf
index 0ec6cc201f2b..c283d78e1a33 100644
--- a/build/conf/go.conf
+++ b/build/conf/go.conf
@@ -69,6 +69,9 @@ GOSTD_VERSION=1.23
when ($GOSTD_VERSION == "1.23") {
GOSTD=contrib/go/_std_1.23/src
}
+elsewhen ($GOSTD_VERSION == "1.24") {
+ GOSTD=contrib/go/_std_1.24/src
+}
otherwise {
GOSTD=__unsupported_go_std_library_version_[$GOSTD_VERSION]__
}
@@ -205,7 +208,7 @@ _GO_TOOL_COMMON_FLAGS=\
# tag:go-specific
macro _GO_GEN_COVER_GO(GO_FILE, GO_COVER_OUTPUT, VAR_ID) {
- .CMD=${hide:_GO_FAKEID} ${cwd;rootdir;input:GO_FILE} $GO_TOOLS_ROOT/pkg/tool/$_GO_TC_PATH/cover -mode set -var $VAR_ID -o ${output;suf=.cover.go;noext:GO_COVER_OUTPUT} ${rootrel;input:GO_FILE}
+ .CMD=${hide:_GO_FAKEID} ${cwd;rootdir;input:GO_FILE} $GO_TOOLS_ROOT/pkg/tool/$_GO_TC_PATH/cover -mode set -var $VAR_ID -o ${output;suf=.cover.go;noext:GO_COVER_OUTPUT} ${rootrel;input:GO_FILE} ${hide;kv:"p go"} ${hide;kv:"pc light-blue"}
}
# tag:go-specific
@@ -1058,6 +1061,7 @@ _GO_MODULES_TXT=${ARCADIA_ROOT}/vendor/modules.txt
_GO_TOOL_MOCKGEN=vendor/go.uber.org/mock/mockgen
_GO_TOOL_REFLECTOR=library/go/mockgen/reflector
_GO_TOOL_OAPI_CODEGEN=vendor/github.com/deepmap/oapi-codegen/cmd/oapi-codegen
+_GO_TOOL_OAPI_CODEGEN_V2=vendor/github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen
_GO_TOOL_OAPI_CODEGEN_TAXI=taxi/infra/go/platform/tools/pkg/deepmap/oapi-codegen/cmd/oapi-codegen
_GO_TOOL_OAPI_CODEGEN_TAXI_1134=taxi/infra/go/platform/tools/pkg1134/oapi-codegen-1.13.4/cmd/oapi-codegen
@@ -1180,6 +1184,23 @@ macro GO_OAPI_CODEGEN(GENERATE, PACKAGE, IN, IN_NOPARSE[], Args...) {
_GO_OAPI_CODEGEN_IMPL(${_GO_TOOL_OAPI_CODEGEN} ${IN} ${suf=.gen.go:GENERATE} GENERATE ${GENERATE} PACKAGE ${PACKAGE} ${Args} IN_NOPARSE ${IN_NOPARSE})
}
+# tag:go-specific
+### @usage: GO_OAPI_CODEGEN_V2(GENERATE, PACKAGE, IN, IN_NOPARSE[], Args...)
+###
+### Go oapi-codegen (v2) module
+### Generates GENERATE thing with PACKAGE package from file IN into STDOUT file
+### Optional arguments will be passed into generator
+### IN_NOPARSE - input files required for running generation, except IN
+### Can be placed multiple times in same ya.make
+###
+### PEERDIRs to dependencies of the generated code must be added manually.
+### All possible dependencies are listed in:
+### vendor/github.com/oapi-codegen/oapi-codegen/v2/pkg/codegen/templates/imports.tmpl
+### For example, see devtools/dummy_arcadia/go/oapi-codegen-v2
+macro GO_OAPI_CODEGEN_V2(GENERATE, PACKAGE, IN, IN_NOPARSE[], Args...) {
+ _GO_OAPI_CODEGEN_IMPL(${_GO_TOOL_OAPI_CODEGEN_V2} ${IN} ${suf=.gen.go:GENERATE} GENERATE ${GENERATE} PACKAGE ${PACKAGE} ${Args} IN_NOPARSE ${IN_NOPARSE})
+}
+
# tag:go-specific
### private, taxi only
macro GO_OAPI_CODEGEN_TAXI(GENERATE, PACKAGE, IN, IN_NOPARSE[], OUT_SUFFIX="", Args...) {
diff --git a/build/conf/java.conf b/build/conf/java.conf
index b96bea0a8ddd..c3c5afe97111 100644
--- a/build/conf/java.conf
+++ b/build/conf/java.conf
@@ -674,10 +674,10 @@ module JAVA_CONTRIB: _JAR_BASE {
}
otherwise {
when ($LOCAL_JAR_PATH) {
- FETCH_TARGET_JAR= && $FS_TOOLS copy ${input:LOCAL_JAR_PATH} $TARGET
+ FETCH_TARGET_JAR= && $FS_TOOLS copy ${input:LOCAL_JAR_PATH} $TARGET ${hide;kv:"p FS"} ${hide;kv:"pc yellow"}
}
otherwise {
- FETCH_TARGET_JAR= && $GENERATE_VCS_JAVA_INFO_NODEP && ${cwd:BINDIR} $JDK_RESOURCE/bin/jar cfvm $TARGET $VCS_JAVA .
+ FETCH_TARGET_JAR= && $GENERATE_VCS_JAVA_INFO_NODEP && ${cwd:BINDIR} $JDK_RESOURCE/bin/jar cfvm $TARGET $VCS_JAVA . ${hide;kv:"p FS"} ${hide;kv:"pc yellow"}
PEERDIR+=build/platform/java/jdk
PEERDIR+=$JDK_RESOURCE_PEERDIR
}
@@ -687,10 +687,10 @@ module JAVA_CONTRIB: _JAR_BASE {
}
otherwise {
when ($LOCAL_SOURCES_JAR_PATH) {
- FETCH_SRCS_JAR= && $FS_TOOLS copy ${input:LOCAL_SOURCES_JAR_PATH} ${output;pre=${BINDIR}/;suf=-sources.jar:REALPRJNAME}
+ FETCH_SRCS_JAR= && $FS_TOOLS copy ${input:LOCAL_SOURCES_JAR_PATH} ${output;pre=${BINDIR}/;suf=-sources.jar:REALPRJNAME} ${hide;kv:"p FS"} ${hide;kv:"pc yellow"}
}
otherwise {
- FETCH_SRCS_JAR= && $GENERATE_VCS_JAVA_INFO_NODEP && $FS_TOOLS md ${BINDIR}/fake-src && ${cwd;suf=/fake-src:BINDIR} $JDK_RESOURCE/bin/jar cfvm ${output;pre=${BINDIR}/;suf=-sources.jar:REALPRJNAME} $VCS_JAVA .
+ FETCH_SRCS_JAR= && $GENERATE_VCS_JAVA_INFO_NODEP && $FS_TOOLS md ${BINDIR}/fake-src && ${cwd;suf=/fake-src:BINDIR} $JDK_RESOURCE/bin/jar cfvm ${output;pre=${BINDIR}/;suf=-sources.jar:REALPRJNAME} $VCS_JAVA . ${hide;kv:"p FS"} ${hide;kv:"pc yellow"}
PEERDIR+=build/platform/java/jdk
PEERDIR+=$JDK_RESOURCE_PEERDIR
}
@@ -2091,6 +2091,7 @@ macro WITH_KOTLINC_DETEKT(Options...) {
# tag:kotlin-specific
### Also search for _KAPT_OPTS and change version there
### change supported jvmTarget in https://a.yandex-team.ru/arcadia/devtools/ya/jbuild/gen/actions/idea.py?rev=r16258919#L668
+### change https://a.yandex-team.ru/arcadia/devtools/ya/jbuild/idea_templates/kotlinc.xml?rev=r17017283
_KOTLIN_VERSION=2.1.21
KOTLIN_VERSION=2.1.21
KOTLIN_BOM_FILE=${ARCADIA_ROOT}/contrib/java/org/jetbrains/kotlin/kotlin-bom/2.1.21/ya.dependency_management.inc
diff --git a/build/conf/proto.conf b/build/conf/proto.conf
index 7d9440d7c1fb..87897d8eeb87 100644
--- a/build/conf/proto.conf
+++ b/build/conf/proto.conf
@@ -673,7 +673,7 @@ macro _COMPILE_LIST_PROTO(SRC) {
# tag:proto
macro _PROTO_DESC_RAWPROTO_CMD(File) {
- .CMD=${cwd;rootdir;input:File} $YMAKE_PYTHON3 ${input:"build/scripts/desc_rawproto_wrapper.py"} --desc-output ${output;suf=.desc:File} --rawproto-output ${norel;output;suf=.${_MODDIR_HASH}.rawproto:File} --proto-file ${rootrel;input:File} -- $PROTOC -I=./$PROTO_NAMESPACE -I=$ARCADIA_ROOT/$PROTO_NAMESPACE ${pre=-I=:_PROTO__INCLUDE} -I=$ARCADIA_BUILD_ROOT -I=$PROTOBUF_INCLUDE_PATH --include_source_info $_PROTOC_FLAGS ${hide:PROTO_FAKEID}
+ .CMD=${cwd;rootdir;input:File} $YMAKE_PYTHON3 ${input:"build/scripts/desc_rawproto_wrapper.py"} --desc-output ${output;suf=.desc:File} --rawproto-output ${norel;output;suf=.${_MODDIR_HASH}.rawproto:File} --proto-file ${rootrel;input:File} -- $PROTOC -I=./$PROTO_NAMESPACE -I=$ARCADIA_ROOT/$PROTO_NAMESPACE ${pre=-I=:_PROTO__INCLUDE} -I=$ARCADIA_BUILD_ROOT -I=$PROTOBUF_INCLUDE_PATH --include_source_info $_PROTOC_FLAGS ${hide:PROTO_FAKEID} ${hide;kv:"p PD"} ${hide;kv:"pc light-cyan"}
}
_PROTO_DESC_MERGE_CMD=$YMAKE_PYTHON3 ${input:"build/scripts/merge_files.py"} $TARGET ${ext=.desc:AUTO_INPUT} ${hide;kv:"p PD"} ${hide;kv:"pc light-cyan"} && ${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON3 ${input:"build/scripts/collect_rawproto.py"} --output ${output;suf=.protosrc:REALPRJNAME} ${rootrel;ext=.rawproto:AUTO_INPUT}
diff --git a/build/external_resources/ymake/public.resources.json b/build/external_resources/ymake/public.resources.json
index 3d0345873b38..ac244d9fcada 100644
--- a/build/external_resources/ymake/public.resources.json
+++ b/build/external_resources/ymake/public.resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:9134846356"
+ "uri": "sbr:9189996113"
},
"darwin-arm64": {
- "uri": "sbr:9134845402"
+ "uri": "sbr:9189994273"
},
"linux": {
- "uri": "sbr:9134847582"
+ "uri": "sbr:9189998716"
},
"linux-aarch64": {
- "uri": "sbr:9134844005"
+ "uri": "sbr:9189992882"
},
"win32": {
- "uri": "sbr:9134847069"
+ "uri": "sbr:9189997453"
}
}
}
diff --git a/build/external_resources/ymake/resources.json b/build/external_resources/ymake/resources.json
index 022fbf3ecf86..b1d830ed64c7 100644
--- a/build/external_resources/ymake/resources.json
+++ b/build/external_resources/ymake/resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:9134847636"
+ "uri": "sbr:9189991566"
},
"darwin-arm64": {
- "uri": "sbr:9134847194"
+ "uri": "sbr:9189990256"
},
"linux": {
- "uri": "sbr:9134848889"
+ "uri": "sbr:9189994200"
},
"linux-aarch64": {
- "uri": "sbr:9134846549"
+ "uri": "sbr:9189989140"
},
"win32": {
- "uri": "sbr:9134848417"
+ "uri": "sbr:9189992529"
}
}
}
diff --git a/build/mapping.conf.json b/build/mapping.conf.json
index 69f9f5cc82c2..4f4e9a85ffed 100644
--- a/build/mapping.conf.json
+++ b/build/mapping.conf.json
@@ -577,6 +577,7 @@
"9116226487": "{registry_endpoint}/9116226487",
"9150817338": "{registry_endpoint}/9150817338",
"9180813918": "{registry_endpoint}/9180813918",
+ "9196630884": "{registry_endpoint}/9196630884",
"5486731632": "{registry_endpoint}/5486731632",
"5514350352": "{registry_endpoint}/5514350352",
"5514360398": "{registry_endpoint}/5514360398",
@@ -816,6 +817,7 @@
"8972534424": "{registry_endpoint}/8972534424",
"9023067054": "{registry_endpoint}/9023067054",
"9134846356": "{registry_endpoint}/9134846356",
+ "9189996113": "{registry_endpoint}/9189996113",
"5766171800": "{registry_endpoint}/5766171800",
"5805430761": "{registry_endpoint}/5805430761",
"5829025456": "{registry_endpoint}/5829025456",
@@ -906,6 +908,7 @@
"8972533338": "{registry_endpoint}/8972533338",
"9023066483": "{registry_endpoint}/9023066483",
"9134845402": "{registry_endpoint}/9134845402",
+ "9189994273": "{registry_endpoint}/9189994273",
"5766173070": "{registry_endpoint}/5766173070",
"5805432830": "{registry_endpoint}/5805432830",
"5829031598": "{registry_endpoint}/5829031598",
@@ -996,6 +999,7 @@
"8972536518": "{registry_endpoint}/8972536518",
"9023067958": "{registry_endpoint}/9023067958",
"9134847582": "{registry_endpoint}/9134847582",
+ "9189998716": "{registry_endpoint}/9189998716",
"5766171341": "{registry_endpoint}/5766171341",
"5805430188": "{registry_endpoint}/5805430188",
"5829023352": "{registry_endpoint}/5829023352",
@@ -1086,6 +1090,7 @@
"8972533033": "{registry_endpoint}/8972533033",
"9023066082": "{registry_endpoint}/9023066082",
"9134844005": "{registry_endpoint}/9134844005",
+ "9189992882": "{registry_endpoint}/9189992882",
"8270821739": "{registry_endpoint}/8270821739",
"8295446553": "{registry_endpoint}/8295446553",
"8326170338": "{registry_endpoint}/8326170338",
@@ -1106,6 +1111,7 @@
"8972535583": "{registry_endpoint}/8972535583",
"9023067572": "{registry_endpoint}/9023067572",
"9134847069": "{registry_endpoint}/9134847069",
+ "9189997453": "{registry_endpoint}/9189997453",
"5766172695": "{registry_endpoint}/5766172695",
"5805432230": "{registry_endpoint}/5805432230",
"5829029743": "{registry_endpoint}/5829029743",
@@ -2094,6 +2100,7 @@
"9116226487": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"9150817338": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"9180813918": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "9196630884": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"5486731632": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514350352": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514360398": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
@@ -2333,6 +2340,7 @@
"8972534424": "devtools/ymake/bin/ymake for darwin",
"9023067054": "devtools/ymake/bin/ymake for darwin",
"9134846356": "devtools/ymake/bin/ymake for darwin",
+ "9189996113": "devtools/ymake/bin/ymake for darwin",
"5766171800": "devtools/ymake/bin/ymake for darwin-arm64",
"5805430761": "devtools/ymake/bin/ymake for darwin-arm64",
"5829025456": "devtools/ymake/bin/ymake for darwin-arm64",
@@ -2423,6 +2431,7 @@
"8972533338": "devtools/ymake/bin/ymake for darwin-arm64",
"9023066483": "devtools/ymake/bin/ymake for darwin-arm64",
"9134845402": "devtools/ymake/bin/ymake for darwin-arm64",
+ "9189994273": "devtools/ymake/bin/ymake for darwin-arm64",
"5766173070": "devtools/ymake/bin/ymake for linux",
"5805432830": "devtools/ymake/bin/ymake for linux",
"5829031598": "devtools/ymake/bin/ymake for linux",
@@ -2513,6 +2522,7 @@
"8972536518": "devtools/ymake/bin/ymake for linux",
"9023067958": "devtools/ymake/bin/ymake for linux",
"9134847582": "devtools/ymake/bin/ymake for linux",
+ "9189998716": "devtools/ymake/bin/ymake for linux",
"5766171341": "devtools/ymake/bin/ymake for linux-aarch64",
"5805430188": "devtools/ymake/bin/ymake for linux-aarch64",
"5829023352": "devtools/ymake/bin/ymake for linux-aarch64",
@@ -2603,6 +2613,7 @@
"8972533033": "devtools/ymake/bin/ymake for linux-aarch64",
"9023066082": "devtools/ymake/bin/ymake for linux-aarch64",
"9134844005": "devtools/ymake/bin/ymake for linux-aarch64",
+ "9189992882": "devtools/ymake/bin/ymake for linux-aarch64",
"8270821739": "devtools/ymake/bin/ymake for win32",
"8295446553": "devtools/ymake/bin/ymake for win32",
"8326170338": "devtools/ymake/bin/ymake for win32",
@@ -2623,6 +2634,7 @@
"8972535583": "devtools/ymake/bin/ymake for win32",
"9023067572": "devtools/ymake/bin/ymake for win32",
"9134847069": "devtools/ymake/bin/ymake for win32",
+ "9189997453": "devtools/ymake/bin/ymake for win32",
"5766172695": "devtools/ymake/bin/ymake for win32-clang-cl",
"5805432230": "devtools/ymake/bin/ymake for win32-clang-cl",
"5829029743": "devtools/ymake/bin/ymake for win32-clang-cl",
diff --git a/build/platform/linux_sdk/ya.make b/build/platform/linux_sdk/ya.make
index 71843cbbcae4..621d14573ad3 100644
--- a/build/platform/linux_sdk/ya.make
+++ b/build/platform/linux_sdk/ya.make
@@ -23,6 +23,8 @@ ELSEIF (ARCH_X86_64)
DECLARE_EXTERNAL_RESOURCE(OS_SDK_ROOT ${OS_SDK_SBR})
ELSEIF (OS_SDK == "ubuntu-22")
DECLARE_EXTERNAL_RESOURCE(OS_SDK_ROOT sbr:6495397322)
+ ELSEIF (OS_SDK == "ubuntu-24")
+ DECLARE_EXTERNAL_RESOURCE(OS_SDK_ROOT sbr:9213417189)
ELSE()
MESSAGE(FATAL_ERROR "There is no ${OS_SDK} SDK for x86-64")
ENDIF()
diff --git a/build/platform/test_tool/host.ya.make.inc b/build/platform/test_tool/host.ya.make.inc
index ad40ed464c60..5b6a0d668bb5 100644
--- a/build/platform/test_tool/host.ya.make.inc
+++ b/build/platform/test_tool/host.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180894618)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196648327)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180891807)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196647725)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180899616)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196650022)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180889439)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196646940)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180897337)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196648771)
ENDIF()
diff --git a/build/platform/test_tool/host_os.ya.make.inc b/build/platform/test_tool/host_os.ya.make.inc
index ec985c5c4121..e728443ab8ad 100644
--- a/build/platform/test_tool/host_os.ya.make.inc
+++ b/build/platform/test_tool/host_os.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180810960)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196629851)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180809464)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196629191)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180813918)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196630884)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180808176)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196628676)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9180812268)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:9196630312)
ENDIF()
diff --git a/build/sysincl/libc-to-nothing.yml b/build/sysincl/libc-to-nothing.yml
index d3d30967b435..389ecd717f02 100644
--- a/build/sysincl/libc-to-nothing.yml
+++ b/build/sysincl/libc-to-nothing.yml
@@ -122,6 +122,7 @@
- sys/cdefs.h
- syscall.h
- sys/dir.h
+ - sys/dr.h
- sys/epoll.h
- sys/errno.h
- sys/eventfd.h
@@ -138,6 +139,7 @@
- sys/hwcap.h
- sys/kd.h
- syslog.h
+ - sys/ldr.h
- sys/mman.h
- sys/mount.h
- sys/msg.h
@@ -153,6 +155,7 @@
- sys/quota.h
- sys/reboot.h
- sys/resource.h
+ - sys/rset.h
- sys/select.h
- sys/sem.h
- sys/sendfile.h
diff --git a/build/ymake.core.conf b/build/ymake.core.conf
index 313ede558438..582ad23ed0cc 100644
--- a/build/ymake.core.conf
+++ b/build/ymake.core.conf
@@ -14,7 +14,7 @@ GO_FAKEID=11100371
ANDROID_FAKEID=2023-05-17
CLANG_TIDY_FAKEID=2023-06-06
CYTHON_FAKEID=16618405
-JAVA_FAKEID=8966008
+JAVA_FAKEID=9293095
PROTO_FAKEID=0
FBS_FAKEID=2024-03-13
@@ -364,26 +364,16 @@ macro NO_LTO() {
}
# tag:allocator
-DEFAULT_ALLOCATOR=LF
+DEFAULT_ALLOCATOR=SYSTEM
# tag:allocator
-when ($OS_ANDROID == "yes" || $OS_WINDOWS == "yes" || $ARCH_TYPE_32 == "yes" || $ARCH_AARCH64 == "yes") {
- DEFAULT_ALLOCATOR=J
-}
-
-# tag:allocator
-when ($ARCH_PPC64LE == "yes") {
- DEFAULT_ALLOCATOR=SYSTEM
+when ($MUSL == "yes") {
+ DEFAULT_ALLOCATOR=TCMALLOC_TC
}
# tag:allocator
-when ($OS_DARWIN == "yes") {
- DEFAULT_ALLOCATOR=SYSTEM
-}
-
-# tag:allocator
-when ($OS_FREEBSD == "yes") {
- DEFAULT_ALLOCATOR=SYSTEM
+when ($OS_ANDROID == "yes" || $OS_WINDOWS == "yes" || $ARCH_TYPE_32 == "yes") {
+ DEFAULT_ALLOCATOR=J
}
# tag:allocator
@@ -2182,7 +2172,7 @@ module SO_PROGRAM: DLL {
}
}
-DLL_PROXY_CMD_MF=$GENERATE_MF && $COPY_CMD $AUTO_INPUT $TARGET
+DLL_PROXY_CMD_MF=$GENERATE_MF && $COPY_CMD $AUTO_INPUT $TARGET ${hide;kv:"p MF"} ${hide;kv:"pc light-cyan"}
# tag:internal
### @usage: DEV_DLL_PROXY() # internal
@@ -3228,7 +3218,7 @@ macro AR_PLUGIN(name) {
### Script will receive all arguments to link_exe.py, and can output into stdout preprocessed list
### of all arguments, in JSON format
macro LD_PLUGIN(Name) {
- .CMD=$COPY_CMD ${context=TEXT;input=TEXT:Name} ${global;noauto;output;suf=.pyplugin:Name}
+ .CMD=$COPY_CMD ${context=TEXT;input=TEXT:Name} ${global;noauto;output;suf=.pyplugin:Name} ${hide;kv:"p CP"} ${hide;kv:"pc light-cyan"}
.STRUCT_CMD=yes
.SEM=_SEM_IGNORED
}
diff --git a/contrib/libs/cctz/.yandex_meta/__init__.py b/contrib/libs/cctz/.yandex_meta/__init__.py
index f49828c905a0..464a968205d4 100644
--- a/contrib/libs/cctz/.yandex_meta/__init__.py
+++ b/contrib/libs/cctz/.yandex_meta/__init__.py
@@ -1,5 +1,5 @@
from devtools.yamaker.modules import Linkable, Switch, Words
-from devtools.yamaker.project import GNUMakeNixProject
+from devtools.yamaker.project import CMakeNinjaNixProject
def post_install(self):
@@ -10,26 +10,45 @@ def post_install(self):
Switch(OS_DARWIN=Linkable(LDFLAGS=[Words("-framework", "CoreFoundation")])),
)
# Recurse to manual ya.make's.
- m.RECURSE |= {"test", "tzdata"}
+ m.RECURSE |= {"tzdata"}
+ with self.yamakes["test"] as test:
+ test.module = "GTEST"
+ test.GTEST = []
+ test.CFLAGS.remove("-DGTEST_LINKED_AS_SHARED_LIBRARY=1")
+ test.PEERDIR.add(f"{self.arcdir}/tzdata")
+ test.PEERDIR.remove("contrib/restricted/googletest/googletest")
+ test.EXPLICIT_DATA = True
-cctz = GNUMakeNixProject(
+
+cctz = CMakeNinjaNixProject(
arcdir="contrib/libs/cctz",
nixattr="cctz",
keep_paths=[
- "test/ya.make",
"tzdata",
],
- copy_sources=[
- "src/*_test.cc",
- ],
disable_includes=[
"fuchsia/intl/cpp/fidl.h",
"lib/async-loop/cpp/loop.h",
"lib/fdio/directory.h",
],
use_full_libnames=True,
- install_targets=["libcctz"],
+ install_targets=[
+ "libcctz",
+ "civil_time_test",
+ "time_zone_format_test",
+ "time_zone_lookup_test",
+ ],
+ put={
+ "libcctz": ".",
+ "civil_time_test": "test",
+ },
+ put_with={
+ "civil_time_test": [
+ "time_zone_format_test",
+ "time_zone_lookup_test",
+ ],
+ },
addincl_global={".": {"./include"}},
post_install=post_install,
)
diff --git a/contrib/libs/cctz/.yandex_meta/override.nix b/contrib/libs/cctz/.yandex_meta/override.nix
index 904275f24679..4d1cfbb28452 100644
--- a/contrib/libs/cctz/.yandex_meta/override.nix
+++ b/contrib/libs/cctz/.yandex_meta/override.nix
@@ -6,14 +6,13 @@ pkgs: attrs: with pkgs; with attrs; rec {
hash = "sha256-R9LWjny1rzKW3H5psPSnZVifGy9K9LnELnckFMQotCE=";
};
+ nativeBuildInputs = [ cmake ];
+
buildInputs = [
gtest
gbenchmark
];
- # FIXME:
- # It looks like CMake build is not functional.
- # Understand and make it work.
cmakeFlags = [
"-DBUILD_TESTING=ON"
"-DBUILD_TOOLS=OFF"
diff --git a/contrib/libs/cctz/patches/autocheck.patch b/contrib/libs/cctz/patches/autocheck.patch
deleted file mode 100644
index e13b4c8e30ad..000000000000
--- a/contrib/libs/cctz/patches/autocheck.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/src/time_zone_lookup_test.cc
-+++ b/src/time_zone_lookup_test.cc
-@@ -947,7 +947,7 @@ TEST(MakeTime, LocalTimeLibC) {
- // 1) we know how to change the time zone used by localtime()/mktime(),
- // 2) cctz and localtime()/mktime() will use similar-enough tzdata, and
- // 3) we have some idea about how mktime() behaves during transitions.
--#if defined(__linux__) && defined(__GLIBC__) && !defined(__ANDROID__)
-+#if defined(__linux__) && defined(__GLIBC__) && !defined(__ANDROID__) && defined(CCTZ_TEST_LIBC_LOCALTIME)
- const char* const ep = getenv("TZ");
- std::string tz_name = (ep != nullptr) ? ep : "";
- for (const char* const* np = kTimeZoneNames; *np != nullptr; ++np) {
diff --git a/contrib/libs/cctz/patches/disable-local-test.patch b/contrib/libs/cctz/patches/disable-local-test.patch
new file mode 100644
index 000000000000..fb76c78da631
--- /dev/null
+++ b/contrib/libs/cctz/patches/disable-local-test.patch
@@ -0,0 +1,6 @@
+This tests fails locally and on distbuild
+--- contrib/libs/cctz/src/time_zone_lookup_test.cc (index)
++++ contrib/libs/cctz/src/time_zone_lookup_test.cc (working tree)
+@@ -940,1 +940,1 @@ TEST(MakeTime, SysSecondsLimits) {
+-TEST(MakeTime, LocalTimeLibC) {
++TEST(MakeTime, DISABLED_LocalTimeLibC) {
diff --git a/contrib/libs/cctz/src/time_zone_lookup_test.cc b/contrib/libs/cctz/src/time_zone_lookup_test.cc
index af54400a0ce3..9288ce5ceeba 100644
--- a/contrib/libs/cctz/src/time_zone_lookup_test.cc
+++ b/contrib/libs/cctz/src/time_zone_lookup_test.cc
@@ -940,14 +940,14 @@ TEST(MakeTime, SysSecondsLimits) {
}
}
-TEST(MakeTime, LocalTimeLibC) {
+TEST(MakeTime, DISABLED_LocalTimeLibC) {
// Checks that cctz and libc agree on transition points in [1970:2037].
//
// We limit this test case to environments where:
// 1) we know how to change the time zone used by localtime()/mktime(),
// 2) cctz and localtime()/mktime() will use similar-enough tzdata, and
// 3) we have some idea about how mktime() behaves during transitions.
-#if defined(__linux__) && defined(__GLIBC__) && !defined(__ANDROID__) && defined(CCTZ_TEST_LIBC_LOCALTIME)
+#if defined(__linux__) && defined(__GLIBC__) && !defined(__ANDROID__)
const char* const ep = getenv("TZ");
std::string tz_name = (ep != nullptr) ? ep : "";
for (const char* const* np = kTimeZoneNames; *np != nullptr; ++np) {
diff --git a/contrib/libs/cctz/test/ya.make b/contrib/libs/cctz/test/ya.make
index 59f6849a5a6d..bd3a57ece3d6 100644
--- a/contrib/libs/cctz/test/ya.make
+++ b/contrib/libs/cctz/test/ya.make
@@ -1,11 +1,13 @@
-GTEST()
+# Generated by devtools/yamaker.
-VERSION(Service-proxy-version)
+GTEST()
LICENSE(Apache-2.0)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
+VERSION(2.5)
+
PEERDIR(
contrib/libs/cctz
contrib/libs/cctz/tzdata
@@ -15,16 +17,13 @@ ADDINCL(
contrib/libs/cctz/include
)
-SRCDIR(contrib/libs/cctz/src)
+NO_COMPILER_WARNINGS()
+
+NO_UTIL()
-IF (NOT AUTOCHECK)
- # We do not set TZDIR to a stable data source, so
- # LoadZone("libc:localtime") is inconsistent and makes
- # LocalTimeLibC test fail on distbuild.
- CFLAGS(
- -DCCTZ_TEST_LIBC_LOCALTIME
- )
-ENDIF()
+EXPLICIT_DATA()
+
+SRCDIR(contrib/libs/cctz/src)
SRCS(
civil_time_test.cc
@@ -32,6 +31,4 @@ SRCS(
time_zone_lookup_test.cc
)
-EXPLICIT_DATA()
-
END()
diff --git a/contrib/libs/cctz/tzdata/README b/contrib/libs/cctz/tzdata/README
deleted file mode 100644
index 031fe514c657..000000000000
--- a/contrib/libs/cctz/tzdata/README
+++ /dev/null
@@ -1,4 +0,0 @@
-A standalone distribution of tzdata. Run 'cat VERSION' in this directory to find out which IANA version it's based on.
-
-When a new version of tzdata is released, run ./update_tzdata.py from this directory
-to regenerate the CMakeLists.txt and the corresponding resources from a newer tzdata version.
diff --git a/contrib/libs/cctz/tzdata/VERSION b/contrib/libs/cctz/tzdata/VERSION
deleted file mode 100644
index e5ae2268388e..000000000000
--- a/contrib/libs/cctz/tzdata/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2024a
\ No newline at end of file
diff --git a/contrib/libs/cctz/tzdata/generated/0124cd65b22dfd92129cb0a43719c717 b/contrib/libs/cctz/tzdata/generated/0124cd65b22dfd92129cb0a43719c717
deleted file mode 100644
index 423c6c203a50..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/0124cd65b22dfd92129cb0a43719c717 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/03ff2b0ed691f72f1e04e18e84818dcf b/contrib/libs/cctz/tzdata/generated/03ff2b0ed691f72f1e04e18e84818dcf
deleted file mode 100644
index 5c92e2967e7c..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/03ff2b0ed691f72f1e04e18e84818dcf and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/0727fa9015cd130fba15b7e7163ff139 b/contrib/libs/cctz/tzdata/generated/0727fa9015cd130fba15b7e7163ff139
deleted file mode 100644
index 6f0558c3b6f4..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/0727fa9015cd130fba15b7e7163ff139 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/19ef27aa43febb679c0795f8c5dedc0f b/contrib/libs/cctz/tzdata/generated/19ef27aa43febb679c0795f8c5dedc0f
deleted file mode 100644
index 378919ea1131..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/19ef27aa43febb679c0795f8c5dedc0f and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/36687b86e799dc46c4ad4c49e3222ea5 b/contrib/libs/cctz/tzdata/generated/36687b86e799dc46c4ad4c49e3222ea5
deleted file mode 100644
index 0a948c2eaca3..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/36687b86e799dc46c4ad4c49e3222ea5 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/41bc7cd4fe8c4fc8f59de742ebb69012 b/contrib/libs/cctz/tzdata/generated/41bc7cd4fe8c4fc8f59de742ebb69012
deleted file mode 100644
index f0c70b690660..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/41bc7cd4fe8c4fc8f59de742ebb69012 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/43c7956d0835817f930236a5633cffa6 b/contrib/libs/cctz/tzdata/generated/43c7956d0835817f930236a5633cffa6
deleted file mode 100644
index d9315580584f..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/43c7956d0835817f930236a5633cffa6 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/4f2a136a6f59628aeea0d09480d630d2 b/contrib/libs/cctz/tzdata/generated/4f2a136a6f59628aeea0d09480d630d2
deleted file mode 100644
index cf965c3f9274..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/4f2a136a6f59628aeea0d09480d630d2 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/52f31607db7a4a081c63dfb4cc578408 b/contrib/libs/cctz/tzdata/generated/52f31607db7a4a081c63dfb4cc578408
deleted file mode 100644
index 3c3584e09ae4..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/52f31607db7a4a081c63dfb4cc578408 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/74b8879270f5bd60554e01c6610b1efb b/contrib/libs/cctz/tzdata/generated/74b8879270f5bd60554e01c6610b1efb
deleted file mode 100644
index fde4833f6be3..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/74b8879270f5bd60554e01c6610b1efb and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/93bd1a44f9245279aa44a94d4c435e5c b/contrib/libs/cctz/tzdata/generated/93bd1a44f9245279aa44a94d4c435e5c
deleted file mode 100644
index e6e2616e98b1..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/93bd1a44f9245279aa44a94d4c435e5c and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/93e1c90eb5222ffb3eca2a2a29b69a69 b/contrib/libs/cctz/tzdata/generated/93e1c90eb5222ffb3eca2a2a29b69a69
deleted file mode 100644
index 640b259fd0f8..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/93e1c90eb5222ffb3eca2a2a29b69a69 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/9bc8fb09717950cb4149283c5aff15ac b/contrib/libs/cctz/tzdata/generated/9bc8fb09717950cb4149283c5aff15ac
deleted file mode 100644
index 546748d6eace..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/9bc8fb09717950cb4149283c5aff15ac and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/796a57137d718e4fa3db8ef611f18e61 b/contrib/libs/cctz/tzdata/generated/Africa/Abidjan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/796a57137d718e4fa3db8ef611f18e61
rename to contrib/libs/cctz/tzdata/generated/Africa/Abidjan
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Accra b/contrib/libs/cctz/tzdata/generated/Africa/Accra
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Accra differ
diff --git a/contrib/libs/cctz/tzdata/generated/fe54394a3dcf951bad3c293980109dd2 b/contrib/libs/cctz/tzdata/generated/Africa/Addis_Ababa
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fe54394a3dcf951bad3c293980109dd2
rename to contrib/libs/cctz/tzdata/generated/Africa/Addis_Ababa
diff --git a/contrib/libs/cctz/tzdata/generated/da87d45f88e4684903d7dbb5b7ed08dc b/contrib/libs/cctz/tzdata/generated/Africa/Algiers
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/da87d45f88e4684903d7dbb5b7ed08dc
rename to contrib/libs/cctz/tzdata/generated/Africa/Algiers
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Asmara b/contrib/libs/cctz/tzdata/generated/Africa/Asmara
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Asmara differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Asmera b/contrib/libs/cctz/tzdata/generated/Africa/Asmera
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Asmera differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Bamako b/contrib/libs/cctz/tzdata/generated/Africa/Bamako
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Bamako differ
diff --git a/contrib/libs/cctz/tzdata/generated/89de77d185e9a76612bd5f9fb043a9c2 b/contrib/libs/cctz/tzdata/generated/Africa/Bangui
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/89de77d185e9a76612bd5f9fb043a9c2
rename to contrib/libs/cctz/tzdata/generated/Africa/Bangui
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Banjul b/contrib/libs/cctz/tzdata/generated/Africa/Banjul
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Banjul differ
diff --git a/contrib/libs/cctz/tzdata/generated/767406f25e6c1c5396e19a3be033304b b/contrib/libs/cctz/tzdata/generated/Africa/Bissau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/767406f25e6c1c5396e19a3be033304b
rename to contrib/libs/cctz/tzdata/generated/Africa/Bissau
diff --git a/contrib/libs/cctz/tzdata/generated/a87061b72790e27d9f155644521d8cce b/contrib/libs/cctz/tzdata/generated/Africa/Blantyre
similarity index 53%
rename from contrib/libs/cctz/tzdata/generated/a87061b72790e27d9f155644521d8cce
rename to contrib/libs/cctz/tzdata/generated/Africa/Blantyre
index 651e5cf67a54..581bb0e08b61 100644
Binary files a/contrib/libs/cctz/tzdata/generated/a87061b72790e27d9f155644521d8cce and b/contrib/libs/cctz/tzdata/generated/Africa/Blantyre differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Brazzaville b/contrib/libs/cctz/tzdata/generated/Africa/Brazzaville
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Brazzaville differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Bujumbura b/contrib/libs/cctz/tzdata/generated/Africa/Bujumbura
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Bujumbura differ
diff --git a/contrib/libs/cctz/tzdata/generated/8dcab26c06fc82939d77511b0c7c24b2 b/contrib/libs/cctz/tzdata/generated/Africa/Cairo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8dcab26c06fc82939d77511b0c7c24b2
rename to contrib/libs/cctz/tzdata/generated/Africa/Cairo
diff --git a/contrib/libs/cctz/tzdata/generated/12de6e9419a748db0e69972d23a640c2 b/contrib/libs/cctz/tzdata/generated/Africa/Casablanca
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/12de6e9419a748db0e69972d23a640c2
rename to contrib/libs/cctz/tzdata/generated/Africa/Casablanca
diff --git a/contrib/libs/cctz/tzdata/generated/00636062cbcd94f2ead5a75cc197675a b/contrib/libs/cctz/tzdata/generated/Africa/Ceuta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/00636062cbcd94f2ead5a75cc197675a
rename to contrib/libs/cctz/tzdata/generated/Africa/Ceuta
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Conakry b/contrib/libs/cctz/tzdata/generated/Africa/Conakry
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Conakry differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Dakar b/contrib/libs/cctz/tzdata/generated/Africa/Dakar
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Dakar differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Dar_es_Salaam b/contrib/libs/cctz/tzdata/generated/Africa/Dar_es_Salaam
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Dar_es_Salaam differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Djibouti b/contrib/libs/cctz/tzdata/generated/Africa/Djibouti
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Djibouti differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Douala b/contrib/libs/cctz/tzdata/generated/Africa/Douala
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Douala differ
diff --git a/contrib/libs/cctz/tzdata/generated/8ba86418f34ed83656d38bcfb19f85ea b/contrib/libs/cctz/tzdata/generated/Africa/El_Aaiun
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8ba86418f34ed83656d38bcfb19f85ea
rename to contrib/libs/cctz/tzdata/generated/Africa/El_Aaiun
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Freetown b/contrib/libs/cctz/tzdata/generated/Africa/Freetown
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Freetown differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Gaborone b/contrib/libs/cctz/tzdata/generated/Africa/Gaborone
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Gaborone differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Harare b/contrib/libs/cctz/tzdata/generated/Africa/Harare
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Harare differ
diff --git a/contrib/libs/cctz/tzdata/generated/a46a56e63a69fd5c5373a33203250d39 b/contrib/libs/cctz/tzdata/generated/Africa/Johannesburg
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a46a56e63a69fd5c5373a33203250d39
rename to contrib/libs/cctz/tzdata/generated/Africa/Johannesburg
diff --git a/contrib/libs/cctz/tzdata/generated/c263ea3cac3cd3410ac15d96040c3b3c b/contrib/libs/cctz/tzdata/generated/Africa/Juba
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c263ea3cac3cd3410ac15d96040c3b3c
rename to contrib/libs/cctz/tzdata/generated/Africa/Juba
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Kampala b/contrib/libs/cctz/tzdata/generated/Africa/Kampala
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Kampala differ
diff --git a/contrib/libs/cctz/tzdata/generated/d00638c4bf95fabcc0c651f13e32e253 b/contrib/libs/cctz/tzdata/generated/Africa/Khartoum
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d00638c4bf95fabcc0c651f13e32e253
rename to contrib/libs/cctz/tzdata/generated/Africa/Khartoum
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Kigali b/contrib/libs/cctz/tzdata/generated/Africa/Kigali
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Kigali differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Kinshasa b/contrib/libs/cctz/tzdata/generated/Africa/Kinshasa
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Kinshasa differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Lagos b/contrib/libs/cctz/tzdata/generated/Africa/Lagos
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Lagos differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Libreville b/contrib/libs/cctz/tzdata/generated/Africa/Libreville
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Libreville differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Lome b/contrib/libs/cctz/tzdata/generated/Africa/Lome
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Lome differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Luanda b/contrib/libs/cctz/tzdata/generated/Africa/Luanda
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Luanda differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Lubumbashi b/contrib/libs/cctz/tzdata/generated/Africa/Lubumbashi
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Lubumbashi differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Lusaka b/contrib/libs/cctz/tzdata/generated/Africa/Lusaka
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Lusaka differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Malabo b/contrib/libs/cctz/tzdata/generated/Africa/Malabo
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Malabo differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Maputo b/contrib/libs/cctz/tzdata/generated/Africa/Maputo
new file mode 100644
index 000000000000..581bb0e08b61
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Maputo differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Maseru b/contrib/libs/cctz/tzdata/generated/Africa/Maseru
new file mode 100644
index 000000000000..bada0638f8a2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Maseru differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Mbabane b/contrib/libs/cctz/tzdata/generated/Africa/Mbabane
new file mode 100644
index 000000000000..bada0638f8a2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Mbabane differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Mogadishu b/contrib/libs/cctz/tzdata/generated/Africa/Mogadishu
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Mogadishu differ
diff --git a/contrib/libs/cctz/tzdata/generated/4afacd60281211a6a7530a3ff8062781 b/contrib/libs/cctz/tzdata/generated/Africa/Monrovia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4afacd60281211a6a7530a3ff8062781
rename to contrib/libs/cctz/tzdata/generated/Africa/Monrovia
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Nairobi b/contrib/libs/cctz/tzdata/generated/Africa/Nairobi
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Nairobi differ
diff --git a/contrib/libs/cctz/tzdata/generated/510c0710993f09c4d93d3639ac3fe609 b/contrib/libs/cctz/tzdata/generated/Africa/Ndjamena
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/510c0710993f09c4d93d3639ac3fe609
rename to contrib/libs/cctz/tzdata/generated/Africa/Ndjamena
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Niamey b/contrib/libs/cctz/tzdata/generated/Africa/Niamey
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Niamey differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Nouakchott b/contrib/libs/cctz/tzdata/generated/Africa/Nouakchott
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Nouakchott differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Ouagadougou b/contrib/libs/cctz/tzdata/generated/Africa/Ouagadougou
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Ouagadougou differ
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Porto-Novo b/contrib/libs/cctz/tzdata/generated/Africa/Porto-Novo
new file mode 100644
index 000000000000..3d7a71ba0e96
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Porto-Novo differ
diff --git a/contrib/libs/cctz/tzdata/generated/7353b5d25ddb353ced2f1f9639251c16 b/contrib/libs/cctz/tzdata/generated/Africa/Sao_Tome
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7353b5d25ddb353ced2f1f9639251c16
rename to contrib/libs/cctz/tzdata/generated/Africa/Sao_Tome
diff --git a/contrib/libs/cctz/tzdata/generated/Africa/Timbuktu b/contrib/libs/cctz/tzdata/generated/Africa/Timbuktu
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Africa/Timbuktu differ
diff --git a/contrib/libs/cctz/tzdata/generated/a6b8c0b7319f5fdca0ed634760ff6e3b b/contrib/libs/cctz/tzdata/generated/Africa/Tripoli
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a6b8c0b7319f5fdca0ed634760ff6e3b
rename to contrib/libs/cctz/tzdata/generated/Africa/Tripoli
diff --git a/contrib/libs/cctz/tzdata/generated/63615364c91acab170ec8f719aa6f59f b/contrib/libs/cctz/tzdata/generated/Africa/Tunis
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/63615364c91acab170ec8f719aa6f59f
rename to contrib/libs/cctz/tzdata/generated/Africa/Tunis
diff --git a/contrib/libs/cctz/tzdata/generated/3c6db0baa05cea4617bcad88b40b1e6a b/contrib/libs/cctz/tzdata/generated/Africa/Windhoek
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3c6db0baa05cea4617bcad88b40b1e6a
rename to contrib/libs/cctz/tzdata/generated/Africa/Windhoek
diff --git a/contrib/libs/cctz/tzdata/generated/1df7e605c33529940c76c1c145c52fc5 b/contrib/libs/cctz/tzdata/generated/America/Adak
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1df7e605c33529940c76c1c145c52fc5
rename to contrib/libs/cctz/tzdata/generated/America/Adak
diff --git a/contrib/libs/cctz/tzdata/generated/77ea6e8a582f87d7a397a9e7b2111be0 b/contrib/libs/cctz/tzdata/generated/America/Anchorage
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/77ea6e8a582f87d7a397a9e7b2111be0
rename to contrib/libs/cctz/tzdata/generated/America/Anchorage
diff --git a/contrib/libs/cctz/tzdata/generated/92d3b867243120ea811c24c038e5b053 b/contrib/libs/cctz/tzdata/generated/America/Anguilla
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/92d3b867243120ea811c24c038e5b053
rename to contrib/libs/cctz/tzdata/generated/America/Anguilla
diff --git a/contrib/libs/cctz/tzdata/generated/America/Antigua b/contrib/libs/cctz/tzdata/generated/America/Antigua
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Antigua differ
diff --git a/contrib/libs/cctz/tzdata/generated/82840448c9d4782ffa56514a7fb4ca95 b/contrib/libs/cctz/tzdata/generated/America/Araguaina
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/82840448c9d4782ffa56514a7fb4ca95
rename to contrib/libs/cctz/tzdata/generated/America/Araguaina
diff --git a/contrib/libs/cctz/tzdata/generated/a4fc7ef39a80ff8875d1cb2708ebc49e b/contrib/libs/cctz/tzdata/generated/America/Argentina/Buenos_Aires
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a4fc7ef39a80ff8875d1cb2708ebc49e
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Buenos_Aires
diff --git a/contrib/libs/cctz/tzdata/generated/e3467a68822f3d1365e3494970219b03 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Catamarca
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e3467a68822f3d1365e3494970219b03
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Catamarca
diff --git a/contrib/libs/cctz/tzdata/generated/America/Argentina/ComodRivadavia b/contrib/libs/cctz/tzdata/generated/America/Argentina/ComodRivadavia
new file mode 100644
index 000000000000..1dcc8d85434c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Argentina/ComodRivadavia differ
diff --git a/contrib/libs/cctz/tzdata/generated/5c57dc3d11f5a64fac22a08ea0c64d25 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Cordoba
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5c57dc3d11f5a64fac22a08ea0c64d25
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Cordoba
diff --git a/contrib/libs/cctz/tzdata/generated/239a70724a0ff39d5dd3e6b7f4a34212 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Jujuy
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/239a70724a0ff39d5dd3e6b7f4a34212
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Jujuy
diff --git a/contrib/libs/cctz/tzdata/generated/0e84cda11c5dc9030c43c51187a6c78d b/contrib/libs/cctz/tzdata/generated/America/Argentina/La_Rioja
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0e84cda11c5dc9030c43c51187a6c78d
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/La_Rioja
diff --git a/contrib/libs/cctz/tzdata/generated/839eacc63921f196e4ecfded7245a67b b/contrib/libs/cctz/tzdata/generated/America/Argentina/Mendoza
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/839eacc63921f196e4ecfded7245a67b
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Mendoza
diff --git a/contrib/libs/cctz/tzdata/generated/e0e8162a9ade838f582c23557e530019 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Rio_Gallegos
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e0e8162a9ade838f582c23557e530019
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Rio_Gallegos
diff --git a/contrib/libs/cctz/tzdata/generated/0249d27eff0294ba6c5d090d9895fd17 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Salta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0249d27eff0294ba6c5d090d9895fd17
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Salta
diff --git a/contrib/libs/cctz/tzdata/generated/4a5ba954919a3b34fb7779965387992f b/contrib/libs/cctz/tzdata/generated/America/Argentina/San_Juan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4a5ba954919a3b34fb7779965387992f
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/San_Juan
diff --git a/contrib/libs/cctz/tzdata/generated/6413085a3a485b5683da3f49944995f0 b/contrib/libs/cctz/tzdata/generated/America/Argentina/San_Luis
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6413085a3a485b5683da3f49944995f0
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/San_Luis
diff --git a/contrib/libs/cctz/tzdata/generated/70483b70b5e389865d462a090b99f2ed b/contrib/libs/cctz/tzdata/generated/America/Argentina/Tucuman
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/70483b70b5e389865d462a090b99f2ed
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Tucuman
diff --git a/contrib/libs/cctz/tzdata/generated/07844fc101071f657d084ecb7d161aa0 b/contrib/libs/cctz/tzdata/generated/America/Argentina/Ushuaia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/07844fc101071f657d084ecb7d161aa0
rename to contrib/libs/cctz/tzdata/generated/America/Argentina/Ushuaia
diff --git a/contrib/libs/cctz/tzdata/generated/America/Aruba b/contrib/libs/cctz/tzdata/generated/America/Aruba
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Aruba differ
diff --git a/contrib/libs/cctz/tzdata/generated/9f8d9f5acd176a1a163855959b566bb4 b/contrib/libs/cctz/tzdata/generated/America/Asuncion
similarity index 59%
rename from contrib/libs/cctz/tzdata/generated/9f8d9f5acd176a1a163855959b566bb4
rename to contrib/libs/cctz/tzdata/generated/America/Asuncion
index 622503674225..f056047f058e 100644
Binary files a/contrib/libs/cctz/tzdata/generated/9f8d9f5acd176a1a163855959b566bb4 and b/contrib/libs/cctz/tzdata/generated/America/Asuncion differ
diff --git a/contrib/libs/cctz/tzdata/generated/595e67b4c97fda031a90e5ef80813e7d b/contrib/libs/cctz/tzdata/generated/America/Atikokan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/595e67b4c97fda031a90e5ef80813e7d
rename to contrib/libs/cctz/tzdata/generated/America/Atikokan
diff --git a/contrib/libs/cctz/tzdata/generated/America/Atka b/contrib/libs/cctz/tzdata/generated/America/Atka
new file mode 100644
index 000000000000..b1497bda631e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Atka differ
diff --git a/contrib/libs/cctz/tzdata/generated/1c750fa694668ef0a1aad95b61533b2a b/contrib/libs/cctz/tzdata/generated/America/Bahia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1c750fa694668ef0a1aad95b61533b2a
rename to contrib/libs/cctz/tzdata/generated/America/Bahia
diff --git a/contrib/libs/cctz/tzdata/generated/e4bd3e0b46733cfe080ae7a159951665 b/contrib/libs/cctz/tzdata/generated/America/Bahia_Banderas
similarity index 53%
rename from contrib/libs/cctz/tzdata/generated/e4bd3e0b46733cfe080ae7a159951665
rename to contrib/libs/cctz/tzdata/generated/America/Bahia_Banderas
index 48faea2ecefa..882400bd33bd 100644
Binary files a/contrib/libs/cctz/tzdata/generated/e4bd3e0b46733cfe080ae7a159951665 and b/contrib/libs/cctz/tzdata/generated/America/Bahia_Banderas differ
diff --git a/contrib/libs/cctz/tzdata/generated/c779f9c0f9698e7646946312f10dfc4a b/contrib/libs/cctz/tzdata/generated/America/Barbados
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c779f9c0f9698e7646946312f10dfc4a
rename to contrib/libs/cctz/tzdata/generated/America/Barbados
diff --git a/contrib/libs/cctz/tzdata/generated/ace635d426a79002a8e3657033da7795 b/contrib/libs/cctz/tzdata/generated/America/Belem
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ace635d426a79002a8e3657033da7795
rename to contrib/libs/cctz/tzdata/generated/America/Belem
diff --git a/contrib/libs/cctz/tzdata/generated/fb4e7ca8ebc94bf7b651ad1921cb62df b/contrib/libs/cctz/tzdata/generated/America/Belize
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fb4e7ca8ebc94bf7b651ad1921cb62df
rename to contrib/libs/cctz/tzdata/generated/America/Belize
diff --git a/contrib/libs/cctz/tzdata/generated/America/Blanc-Sablon b/contrib/libs/cctz/tzdata/generated/America/Blanc-Sablon
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Blanc-Sablon differ
diff --git a/contrib/libs/cctz/tzdata/generated/30c97d0792df5d5939ff0f09c53c385d b/contrib/libs/cctz/tzdata/generated/America/Boa_Vista
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/30c97d0792df5d5939ff0f09c53c385d
rename to contrib/libs/cctz/tzdata/generated/America/Boa_Vista
diff --git a/contrib/libs/cctz/tzdata/generated/ee4b5e263472bc5adf6309f2f5cd8858 b/contrib/libs/cctz/tzdata/generated/America/Bogota
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ee4b5e263472bc5adf6309f2f5cd8858
rename to contrib/libs/cctz/tzdata/generated/America/Bogota
diff --git a/contrib/libs/cctz/tzdata/generated/f3ce1cb0fb7595deac1b8caa16cae961 b/contrib/libs/cctz/tzdata/generated/America/Boise
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f3ce1cb0fb7595deac1b8caa16cae961
rename to contrib/libs/cctz/tzdata/generated/America/Boise
diff --git a/contrib/libs/cctz/tzdata/generated/America/Buenos_Aires b/contrib/libs/cctz/tzdata/generated/America/Buenos_Aires
new file mode 100644
index 000000000000..d6f999b8605c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Buenos_Aires differ
diff --git a/contrib/libs/cctz/tzdata/generated/628a7252c0237ddace06127f3f97d066 b/contrib/libs/cctz/tzdata/generated/America/Cambridge_Bay
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/628a7252c0237ddace06127f3f97d066
rename to contrib/libs/cctz/tzdata/generated/America/Cambridge_Bay
diff --git a/contrib/libs/cctz/tzdata/generated/8fa410ffc232e56d0f945bd2b6c34dfe b/contrib/libs/cctz/tzdata/generated/America/Campo_Grande
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8fa410ffc232e56d0f945bd2b6c34dfe
rename to contrib/libs/cctz/tzdata/generated/America/Campo_Grande
diff --git a/contrib/libs/cctz/tzdata/generated/America/Cancun b/contrib/libs/cctz/tzdata/generated/America/Cancun
new file mode 100644
index 000000000000..3110cdfd6e6f
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Cancun differ
diff --git a/contrib/libs/cctz/tzdata/generated/4d7ff90583dcd0e08fc8c51792761c2b b/contrib/libs/cctz/tzdata/generated/America/Caracas
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4d7ff90583dcd0e08fc8c51792761c2b
rename to contrib/libs/cctz/tzdata/generated/America/Caracas
diff --git a/contrib/libs/cctz/tzdata/generated/America/Catamarca b/contrib/libs/cctz/tzdata/generated/America/Catamarca
new file mode 100644
index 000000000000..1dcc8d85434c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Catamarca differ
diff --git a/contrib/libs/cctz/tzdata/generated/806c5856106eb6b28c3846dd93d3acc4 b/contrib/libs/cctz/tzdata/generated/America/Cayenne
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/806c5856106eb6b28c3846dd93d3acc4
rename to contrib/libs/cctz/tzdata/generated/America/Cayenne
diff --git a/contrib/libs/cctz/tzdata/generated/America/Cayman b/contrib/libs/cctz/tzdata/generated/America/Cayman
new file mode 100644
index 000000000000..9154643f4c91
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Cayman differ
diff --git a/contrib/libs/cctz/tzdata/generated/85435a33486747b319872947c68317f3 b/contrib/libs/cctz/tzdata/generated/America/Chicago
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/85435a33486747b319872947c68317f3
rename to contrib/libs/cctz/tzdata/generated/America/Chicago
diff --git a/contrib/libs/cctz/tzdata/generated/46d5d8b3710cb4825d4cca19f239aade b/contrib/libs/cctz/tzdata/generated/America/Chihuahua
similarity index 90%
rename from contrib/libs/cctz/tzdata/generated/46d5d8b3710cb4825d4cca19f239aade
rename to contrib/libs/cctz/tzdata/generated/America/Chihuahua
index 5e0a54f00468..f65bb1c93104 100644
Binary files a/contrib/libs/cctz/tzdata/generated/46d5d8b3710cb4825d4cca19f239aade and b/contrib/libs/cctz/tzdata/generated/America/Chihuahua differ
diff --git a/contrib/libs/cctz/tzdata/generated/587990ea7ea7cb10bfd0618d8d314de3 b/contrib/libs/cctz/tzdata/generated/America/Ciudad_Juarez
similarity index 91%
rename from contrib/libs/cctz/tzdata/generated/587990ea7ea7cb10bfd0618d8d314de3
rename to contrib/libs/cctz/tzdata/generated/America/Ciudad_Juarez
index f636ee643fe4..5f865ea808b5 100644
Binary files a/contrib/libs/cctz/tzdata/generated/587990ea7ea7cb10bfd0618d8d314de3 and b/contrib/libs/cctz/tzdata/generated/America/Ciudad_Juarez differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Coral_Harbour b/contrib/libs/cctz/tzdata/generated/America/Coral_Harbour
new file mode 100644
index 000000000000..9154643f4c91
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Coral_Harbour differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Cordoba b/contrib/libs/cctz/tzdata/generated/America/Cordoba
new file mode 100644
index 000000000000..35a52e53d123
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Cordoba differ
diff --git a/contrib/libs/cctz/tzdata/generated/f32590f9bcdfb4ab134294d441804ae5 b/contrib/libs/cctz/tzdata/generated/America/Costa_Rica
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f32590f9bcdfb4ab134294d441804ae5
rename to contrib/libs/cctz/tzdata/generated/America/Costa_Rica
diff --git a/contrib/libs/cctz/tzdata/generated/America/Coyhaique b/contrib/libs/cctz/tzdata/generated/America/Coyhaique
new file mode 100644
index 000000000000..26354e89460e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Coyhaique differ
diff --git a/contrib/libs/cctz/tzdata/generated/db536e94d95836d7c5725c3b3c086586 b/contrib/libs/cctz/tzdata/generated/America/Creston
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/db536e94d95836d7c5725c3b3c086586
rename to contrib/libs/cctz/tzdata/generated/America/Creston
diff --git a/contrib/libs/cctz/tzdata/generated/268c9a38823e18c714ec9fb756a8042e b/contrib/libs/cctz/tzdata/generated/America/Cuiaba
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/268c9a38823e18c714ec9fb756a8042e
rename to contrib/libs/cctz/tzdata/generated/America/Cuiaba
diff --git a/contrib/libs/cctz/tzdata/generated/America/Curacao b/contrib/libs/cctz/tzdata/generated/America/Curacao
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Curacao differ
diff --git a/contrib/libs/cctz/tzdata/generated/356ff8bd249ee3f6983cba8426901244 b/contrib/libs/cctz/tzdata/generated/America/Danmarkshavn
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/356ff8bd249ee3f6983cba8426901244
rename to contrib/libs/cctz/tzdata/generated/America/Danmarkshavn
diff --git a/contrib/libs/cctz/tzdata/generated/79eedb7a0a4788b9bc3c291c4c643b50 b/contrib/libs/cctz/tzdata/generated/America/Dawson
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/79eedb7a0a4788b9bc3c291c4c643b50
rename to contrib/libs/cctz/tzdata/generated/America/Dawson
diff --git a/contrib/libs/cctz/tzdata/generated/6ece595060d1d2db3153c5d523fb106b b/contrib/libs/cctz/tzdata/generated/America/Dawson_Creek
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6ece595060d1d2db3153c5d523fb106b
rename to contrib/libs/cctz/tzdata/generated/America/Dawson_Creek
diff --git a/contrib/libs/cctz/tzdata/generated/c1b9655d5b1ce7fbc9ac213e921acc88 b/contrib/libs/cctz/tzdata/generated/America/Denver
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c1b9655d5b1ce7fbc9ac213e921acc88
rename to contrib/libs/cctz/tzdata/generated/America/Denver
diff --git a/contrib/libs/cctz/tzdata/generated/48c96bff46ef373ce5d759dc4a4d2de2 b/contrib/libs/cctz/tzdata/generated/America/Detroit
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/48c96bff46ef373ce5d759dc4a4d2de2
rename to contrib/libs/cctz/tzdata/generated/America/Detroit
diff --git a/contrib/libs/cctz/tzdata/generated/America/Dominica b/contrib/libs/cctz/tzdata/generated/America/Dominica
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Dominica differ
diff --git a/contrib/libs/cctz/tzdata/generated/beb91df50b24718aed963a509c0c2958 b/contrib/libs/cctz/tzdata/generated/America/Edmonton
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/beb91df50b24718aed963a509c0c2958
rename to contrib/libs/cctz/tzdata/generated/America/Edmonton
diff --git a/contrib/libs/cctz/tzdata/generated/fefe5ae6107231a3f738b36d95153f77 b/contrib/libs/cctz/tzdata/generated/America/Eirunepe
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fefe5ae6107231a3f738b36d95153f77
rename to contrib/libs/cctz/tzdata/generated/America/Eirunepe
diff --git a/contrib/libs/cctz/tzdata/generated/ec589bada56b3352067a359694896292 b/contrib/libs/cctz/tzdata/generated/America/El_Salvador
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ec589bada56b3352067a359694896292
rename to contrib/libs/cctz/tzdata/generated/America/El_Salvador
diff --git a/contrib/libs/cctz/tzdata/generated/America/Ensenada b/contrib/libs/cctz/tzdata/generated/America/Ensenada
new file mode 100644
index 000000000000..18d0d14afc1c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Ensenada differ
diff --git a/contrib/libs/cctz/tzdata/generated/0998859e2d38d079cc1a3429aa428db4 b/contrib/libs/cctz/tzdata/generated/America/Fort_Nelson
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0998859e2d38d079cc1a3429aa428db4
rename to contrib/libs/cctz/tzdata/generated/America/Fort_Nelson
diff --git a/contrib/libs/cctz/tzdata/generated/9208172103191bf0d660e0023b358ea1 b/contrib/libs/cctz/tzdata/generated/America/Fort_Wayne
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9208172103191bf0d660e0023b358ea1
rename to contrib/libs/cctz/tzdata/generated/America/Fort_Wayne
diff --git a/contrib/libs/cctz/tzdata/generated/c72cd4fac2e9b8659f6b5bb2392b9ae5 b/contrib/libs/cctz/tzdata/generated/America/Fortaleza
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c72cd4fac2e9b8659f6b5bb2392b9ae5
rename to contrib/libs/cctz/tzdata/generated/America/Fortaleza
diff --git a/contrib/libs/cctz/tzdata/generated/8f9746ead1fc03c962cdd7ddacde663d b/contrib/libs/cctz/tzdata/generated/America/Glace_Bay
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8f9746ead1fc03c962cdd7ddacde663d
rename to contrib/libs/cctz/tzdata/generated/America/Glace_Bay
diff --git a/contrib/libs/cctz/tzdata/generated/2d1f992b4b2db0d5b93386a2df8579fe b/contrib/libs/cctz/tzdata/generated/America/Godthab
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2d1f992b4b2db0d5b93386a2df8579fe
rename to contrib/libs/cctz/tzdata/generated/America/Godthab
diff --git a/contrib/libs/cctz/tzdata/generated/dc00543b628bf4458546124a642c9ac3 b/contrib/libs/cctz/tzdata/generated/America/Goose_Bay
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dc00543b628bf4458546124a642c9ac3
rename to contrib/libs/cctz/tzdata/generated/America/Goose_Bay
diff --git a/contrib/libs/cctz/tzdata/generated/eac76eb95be7b5cc25a41e0485b58c41 b/contrib/libs/cctz/tzdata/generated/America/Grand_Turk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/eac76eb95be7b5cc25a41e0485b58c41
rename to contrib/libs/cctz/tzdata/generated/America/Grand_Turk
diff --git a/contrib/libs/cctz/tzdata/generated/America/Grenada b/contrib/libs/cctz/tzdata/generated/America/Grenada
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Grenada differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Guadeloupe b/contrib/libs/cctz/tzdata/generated/America/Guadeloupe
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Guadeloupe differ
diff --git a/contrib/libs/cctz/tzdata/generated/f8be05a9398502fc14e50eea2693497c b/contrib/libs/cctz/tzdata/generated/America/Guatemala
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f8be05a9398502fc14e50eea2693497c
rename to contrib/libs/cctz/tzdata/generated/America/Guatemala
diff --git a/contrib/libs/cctz/tzdata/generated/dada91f7db29bcab55bfd2478a5b0779 b/contrib/libs/cctz/tzdata/generated/America/Guayaquil
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dada91f7db29bcab55bfd2478a5b0779
rename to contrib/libs/cctz/tzdata/generated/America/Guayaquil
diff --git a/contrib/libs/cctz/tzdata/generated/10089d01ae922cfd19a041f3de5ae1ea b/contrib/libs/cctz/tzdata/generated/America/Guyana
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/10089d01ae922cfd19a041f3de5ae1ea
rename to contrib/libs/cctz/tzdata/generated/America/Guyana
diff --git a/contrib/libs/cctz/tzdata/generated/ef31a488808a56cc6d3c9a3c5a53abeb b/contrib/libs/cctz/tzdata/generated/America/Halifax
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ef31a488808a56cc6d3c9a3c5a53abeb
rename to contrib/libs/cctz/tzdata/generated/America/Halifax
diff --git a/contrib/libs/cctz/tzdata/generated/14af0ba77d76b97e0e666c070c2172cf b/contrib/libs/cctz/tzdata/generated/America/Havana
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/14af0ba77d76b97e0e666c070c2172cf
rename to contrib/libs/cctz/tzdata/generated/America/Havana
diff --git a/contrib/libs/cctz/tzdata/generated/America/Hermosillo b/contrib/libs/cctz/tzdata/generated/America/Hermosillo
new file mode 100644
index 000000000000..ba7b14760d47
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Hermosillo differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Indiana/Indianapolis b/contrib/libs/cctz/tzdata/generated/America/Indiana/Indianapolis
new file mode 100644
index 000000000000..6b08d15bdaba
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Indiana/Indianapolis differ
diff --git a/contrib/libs/cctz/tzdata/generated/964fb4bc6d047b2a8826a0734633ab0b b/contrib/libs/cctz/tzdata/generated/America/Indiana/Knox
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/964fb4bc6d047b2a8826a0734633ab0b
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Knox
diff --git a/contrib/libs/cctz/tzdata/generated/fdc9d5431dd16120c1465f298e28e260 b/contrib/libs/cctz/tzdata/generated/America/Indiana/Marengo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fdc9d5431dd16120c1465f298e28e260
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Marengo
diff --git a/contrib/libs/cctz/tzdata/generated/2c18bc1a2ddb1b06e98ffa553ef1aaee b/contrib/libs/cctz/tzdata/generated/America/Indiana/Petersburg
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2c18bc1a2ddb1b06e98ffa553ef1aaee
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Petersburg
diff --git a/contrib/libs/cctz/tzdata/generated/90db76a975de863aadbcf37b47e18cd2 b/contrib/libs/cctz/tzdata/generated/America/Indiana/Tell_City
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/90db76a975de863aadbcf37b47e18cd2
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Tell_City
diff --git a/contrib/libs/cctz/tzdata/generated/768d11c820a4f93683de8f8bc03df8c8 b/contrib/libs/cctz/tzdata/generated/America/Indiana/Vevay
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/768d11c820a4f93683de8f8bc03df8c8
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Vevay
diff --git a/contrib/libs/cctz/tzdata/generated/7ca29f8adb394d878db41ab40c4c9a5d b/contrib/libs/cctz/tzdata/generated/America/Indiana/Vincennes
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7ca29f8adb394d878db41ab40c4c9a5d
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Vincennes
diff --git a/contrib/libs/cctz/tzdata/generated/f429fd3eab0a434754c001ba1e5aa719 b/contrib/libs/cctz/tzdata/generated/America/Indiana/Winamac
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f429fd3eab0a434754c001ba1e5aa719
rename to contrib/libs/cctz/tzdata/generated/America/Indiana/Winamac
diff --git a/contrib/libs/cctz/tzdata/generated/America/Indianapolis b/contrib/libs/cctz/tzdata/generated/America/Indianapolis
new file mode 100644
index 000000000000..6b08d15bdaba
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Indianapolis differ
diff --git a/contrib/libs/cctz/tzdata/generated/f51089782974399a845a8ab6e8825bfd b/contrib/libs/cctz/tzdata/generated/America/Inuvik
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f51089782974399a845a8ab6e8825bfd
rename to contrib/libs/cctz/tzdata/generated/America/Inuvik
diff --git a/contrib/libs/cctz/tzdata/generated/b8248a79b8e4c6de4f23c59e360d333e b/contrib/libs/cctz/tzdata/generated/America/Iqaluit
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b8248a79b8e4c6de4f23c59e360d333e
rename to contrib/libs/cctz/tzdata/generated/America/Iqaluit
diff --git a/contrib/libs/cctz/tzdata/generated/6ddb543268cbeb4a7fffad436081b019 b/contrib/libs/cctz/tzdata/generated/America/Jamaica
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6ddb543268cbeb4a7fffad436081b019
rename to contrib/libs/cctz/tzdata/generated/America/Jamaica
diff --git a/contrib/libs/cctz/tzdata/generated/America/Jujuy b/contrib/libs/cctz/tzdata/generated/America/Jujuy
new file mode 100644
index 000000000000..b275f27c0287
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Jujuy differ
diff --git a/contrib/libs/cctz/tzdata/generated/a9b6712f7efd08406ebb3f4a43bf1862 b/contrib/libs/cctz/tzdata/generated/America/Juneau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a9b6712f7efd08406ebb3f4a43bf1862
rename to contrib/libs/cctz/tzdata/generated/America/Juneau
diff --git a/contrib/libs/cctz/tzdata/generated/9d9fdcb5bec6ef7173f20c0b968ae540 b/contrib/libs/cctz/tzdata/generated/America/Kentucky/Louisville
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9d9fdcb5bec6ef7173f20c0b968ae540
rename to contrib/libs/cctz/tzdata/generated/America/Kentucky/Louisville
diff --git a/contrib/libs/cctz/tzdata/generated/755a91932697ce463a5c9b642e5292d6 b/contrib/libs/cctz/tzdata/generated/America/Kentucky/Monticello
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/755a91932697ce463a5c9b642e5292d6
rename to contrib/libs/cctz/tzdata/generated/America/Kentucky/Monticello
diff --git a/contrib/libs/cctz/tzdata/generated/America/Knox_IN b/contrib/libs/cctz/tzdata/generated/America/Knox_IN
new file mode 100644
index 000000000000..b187d5f8c756
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Knox_IN differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Kralendijk b/contrib/libs/cctz/tzdata/generated/America/Kralendijk
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Kralendijk differ
diff --git a/contrib/libs/cctz/tzdata/generated/fd46d501559b1cf8c8c1fa330196b1b0 b/contrib/libs/cctz/tzdata/generated/America/La_Paz
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fd46d501559b1cf8c8c1fa330196b1b0
rename to contrib/libs/cctz/tzdata/generated/America/La_Paz
diff --git a/contrib/libs/cctz/tzdata/generated/bd9c4fdf467f96ab33dde64bf0ac700c b/contrib/libs/cctz/tzdata/generated/America/Lima
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bd9c4fdf467f96ab33dde64bf0ac700c
rename to contrib/libs/cctz/tzdata/generated/America/Lima
diff --git a/contrib/libs/cctz/tzdata/generated/641e03b9a1178df8c823447ea6563f25 b/contrib/libs/cctz/tzdata/generated/America/Los_Angeles
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/641e03b9a1178df8c823447ea6563f25
rename to contrib/libs/cctz/tzdata/generated/America/Los_Angeles
diff --git a/contrib/libs/cctz/tzdata/generated/America/Louisville b/contrib/libs/cctz/tzdata/generated/America/Louisville
new file mode 100644
index 000000000000..f2136d6ed41b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Louisville differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Lower_Princes b/contrib/libs/cctz/tzdata/generated/America/Lower_Princes
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Lower_Princes differ
diff --git a/contrib/libs/cctz/tzdata/generated/823a97c8e447d6f0016bacafd20a246e b/contrib/libs/cctz/tzdata/generated/America/Maceio
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/823a97c8e447d6f0016bacafd20a246e
rename to contrib/libs/cctz/tzdata/generated/America/Maceio
diff --git a/contrib/libs/cctz/tzdata/generated/8435b750c0255a506ff0fd58bf646f00 b/contrib/libs/cctz/tzdata/generated/America/Managua
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8435b750c0255a506ff0fd58bf646f00
rename to contrib/libs/cctz/tzdata/generated/America/Managua
diff --git a/contrib/libs/cctz/tzdata/generated/bbb3263234960c35b55fffa1327cc48c b/contrib/libs/cctz/tzdata/generated/America/Manaus
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bbb3263234960c35b55fffa1327cc48c
rename to contrib/libs/cctz/tzdata/generated/America/Manaus
diff --git a/contrib/libs/cctz/tzdata/generated/America/Marigot b/contrib/libs/cctz/tzdata/generated/America/Marigot
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Marigot differ
diff --git a/contrib/libs/cctz/tzdata/generated/450d5ffb8f5928afc0981b5a1a8ba4fa b/contrib/libs/cctz/tzdata/generated/America/Martinique
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/450d5ffb8f5928afc0981b5a1a8ba4fa
rename to contrib/libs/cctz/tzdata/generated/America/Martinique
diff --git a/contrib/libs/cctz/tzdata/generated/8c2eca6f9c563a5a2c5f6293d3ee3bc5 b/contrib/libs/cctz/tzdata/generated/America/Matamoros
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8c2eca6f9c563a5a2c5f6293d3ee3bc5
rename to contrib/libs/cctz/tzdata/generated/America/Matamoros
diff --git a/contrib/libs/cctz/tzdata/generated/2b72d499c62e0523c21b73a12d147157 b/contrib/libs/cctz/tzdata/generated/America/Mazatlan
similarity index 54%
rename from contrib/libs/cctz/tzdata/generated/2b72d499c62e0523c21b73a12d147157
rename to contrib/libs/cctz/tzdata/generated/America/Mazatlan
index 97d4d36c137f..5aa6039ea4cb 100644
Binary files a/contrib/libs/cctz/tzdata/generated/2b72d499c62e0523c21b73a12d147157 and b/contrib/libs/cctz/tzdata/generated/America/Mazatlan differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Mendoza b/contrib/libs/cctz/tzdata/generated/America/Mendoza
new file mode 100644
index 000000000000..691c56978a03
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Mendoza differ
diff --git a/contrib/libs/cctz/tzdata/generated/b6fc5775917cac51306de9bf93d87827 b/contrib/libs/cctz/tzdata/generated/America/Menominee
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b6fc5775917cac51306de9bf93d87827
rename to contrib/libs/cctz/tzdata/generated/America/Menominee
diff --git a/contrib/libs/cctz/tzdata/generated/5fcda9efe6faeae5a8097716a64a127b b/contrib/libs/cctz/tzdata/generated/America/Merida
similarity index 90%
rename from contrib/libs/cctz/tzdata/generated/5fcda9efe6faeae5a8097716a64a127b
rename to contrib/libs/cctz/tzdata/generated/America/Merida
index e5de1131dc48..e5c7d8cc2d2a 100644
Binary files a/contrib/libs/cctz/tzdata/generated/5fcda9efe6faeae5a8097716a64a127b and b/contrib/libs/cctz/tzdata/generated/America/Merida differ
diff --git a/contrib/libs/cctz/tzdata/generated/4f4baa18e0219b85f02103bca46dfdca b/contrib/libs/cctz/tzdata/generated/America/Metlakatla
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4f4baa18e0219b85f02103bca46dfdca
rename to contrib/libs/cctz/tzdata/generated/America/Metlakatla
diff --git a/contrib/libs/cctz/tzdata/generated/82169289ef8c8f15473bc1fcb55123d0 b/contrib/libs/cctz/tzdata/generated/America/Mexico_City
similarity index 91%
rename from contrib/libs/cctz/tzdata/generated/82169289ef8c8f15473bc1fcb55123d0
rename to contrib/libs/cctz/tzdata/generated/America/Mexico_City
index 80a415c70ca3..18112346129a 100644
Binary files a/contrib/libs/cctz/tzdata/generated/82169289ef8c8f15473bc1fcb55123d0 and b/contrib/libs/cctz/tzdata/generated/America/Mexico_City differ
diff --git a/contrib/libs/cctz/tzdata/generated/6f57cdc08cc6814bf12c58919a3aacff b/contrib/libs/cctz/tzdata/generated/America/Miquelon
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6f57cdc08cc6814bf12c58919a3aacff
rename to contrib/libs/cctz/tzdata/generated/America/Miquelon
diff --git a/contrib/libs/cctz/tzdata/generated/8dd0d7115ebd05b3cf88b8a11dc97026 b/contrib/libs/cctz/tzdata/generated/America/Moncton
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8dd0d7115ebd05b3cf88b8a11dc97026
rename to contrib/libs/cctz/tzdata/generated/America/Moncton
diff --git a/contrib/libs/cctz/tzdata/generated/America/Monterrey b/contrib/libs/cctz/tzdata/generated/America/Monterrey
new file mode 100644
index 000000000000..c1e05464513a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Monterrey differ
diff --git a/contrib/libs/cctz/tzdata/generated/64e0eb5df848bbc06156c58b35959680 b/contrib/libs/cctz/tzdata/generated/America/Montevideo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/64e0eb5df848bbc06156c58b35959680
rename to contrib/libs/cctz/tzdata/generated/America/Montevideo
diff --git a/contrib/libs/cctz/tzdata/generated/3fa8a9428d799763fa7ea205c02deb93 b/contrib/libs/cctz/tzdata/generated/America/Montreal
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3fa8a9428d799763fa7ea205c02deb93
rename to contrib/libs/cctz/tzdata/generated/America/Montreal
diff --git a/contrib/libs/cctz/tzdata/generated/America/Montserrat b/contrib/libs/cctz/tzdata/generated/America/Montserrat
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Montserrat differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Nassau b/contrib/libs/cctz/tzdata/generated/America/Nassau
new file mode 100644
index 000000000000..668e70d765dc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Nassau differ
diff --git a/contrib/libs/cctz/tzdata/generated/763d7a8374a42066d2b0bb81bd47218f b/contrib/libs/cctz/tzdata/generated/America/New_York
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/763d7a8374a42066d2b0bb81bd47218f
rename to contrib/libs/cctz/tzdata/generated/America/New_York
diff --git a/contrib/libs/cctz/tzdata/generated/America/Nipigon b/contrib/libs/cctz/tzdata/generated/America/Nipigon
new file mode 100644
index 000000000000..668e70d765dc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Nipigon differ
diff --git a/contrib/libs/cctz/tzdata/generated/97ed2cb6ee44823ce8fabdc0beeae2b9 b/contrib/libs/cctz/tzdata/generated/America/Nome
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/97ed2cb6ee44823ce8fabdc0beeae2b9
rename to contrib/libs/cctz/tzdata/generated/America/Nome
diff --git a/contrib/libs/cctz/tzdata/generated/6c4f6742a67bbd289f89eb4fe7de8e57 b/contrib/libs/cctz/tzdata/generated/America/Noronha
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6c4f6742a67bbd289f89eb4fe7de8e57
rename to contrib/libs/cctz/tzdata/generated/America/Noronha
diff --git a/contrib/libs/cctz/tzdata/generated/b72620d427a1898ea97232aeba51c2dc b/contrib/libs/cctz/tzdata/generated/America/North_Dakota/Beulah
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b72620d427a1898ea97232aeba51c2dc
rename to contrib/libs/cctz/tzdata/generated/America/North_Dakota/Beulah
diff --git a/contrib/libs/cctz/tzdata/generated/511edb5c79692d730d309f4424bbaa0e b/contrib/libs/cctz/tzdata/generated/America/North_Dakota/Center
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/511edb5c79692d730d309f4424bbaa0e
rename to contrib/libs/cctz/tzdata/generated/America/North_Dakota/Center
diff --git a/contrib/libs/cctz/tzdata/generated/6e5fd4a73872524a21354303cdfff0f8 b/contrib/libs/cctz/tzdata/generated/America/North_Dakota/New_Salem
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6e5fd4a73872524a21354303cdfff0f8
rename to contrib/libs/cctz/tzdata/generated/America/North_Dakota/New_Salem
diff --git a/contrib/libs/cctz/tzdata/generated/America/Nuuk b/contrib/libs/cctz/tzdata/generated/America/Nuuk
new file mode 100644
index 000000000000..310774ea4fdd
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Nuuk differ
diff --git a/contrib/libs/cctz/tzdata/generated/3cf55b0a9c6feadd90e0fb7f8f990178 b/contrib/libs/cctz/tzdata/generated/America/Ojinaga
similarity index 91%
rename from contrib/libs/cctz/tzdata/generated/3cf55b0a9c6feadd90e0fb7f8f990178
rename to contrib/libs/cctz/tzdata/generated/America/Ojinaga
index f7e40c081850..1dd08b1cafd4 100644
Binary files a/contrib/libs/cctz/tzdata/generated/3cf55b0a9c6feadd90e0fb7f8f990178 and b/contrib/libs/cctz/tzdata/generated/America/Ojinaga differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Panama b/contrib/libs/cctz/tzdata/generated/America/Panama
new file mode 100644
index 000000000000..9154643f4c91
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Panama differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Pangnirtung b/contrib/libs/cctz/tzdata/generated/America/Pangnirtung
new file mode 100644
index 000000000000..95e055cb55d1
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Pangnirtung differ
diff --git a/contrib/libs/cctz/tzdata/generated/7dacf7ad9037fa33db4536edf63da220 b/contrib/libs/cctz/tzdata/generated/America/Paramaribo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7dacf7ad9037fa33db4536edf63da220
rename to contrib/libs/cctz/tzdata/generated/America/Paramaribo
diff --git a/contrib/libs/cctz/tzdata/generated/America/Phoenix b/contrib/libs/cctz/tzdata/generated/America/Phoenix
new file mode 100644
index 000000000000..c2bd2f949b24
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Phoenix differ
diff --git a/contrib/libs/cctz/tzdata/generated/f07474008b0495a1830bf6ec76104684 b/contrib/libs/cctz/tzdata/generated/America/Port-au-Prince
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f07474008b0495a1830bf6ec76104684
rename to contrib/libs/cctz/tzdata/generated/America/Port-au-Prince
diff --git a/contrib/libs/cctz/tzdata/generated/America/Port_of_Spain b/contrib/libs/cctz/tzdata/generated/America/Port_of_Spain
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Port_of_Spain differ
diff --git a/contrib/libs/cctz/tzdata/generated/0b427173cd7de48179954c1706df9f0f b/contrib/libs/cctz/tzdata/generated/America/Porto_Acre
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0b427173cd7de48179954c1706df9f0f
rename to contrib/libs/cctz/tzdata/generated/America/Porto_Acre
diff --git a/contrib/libs/cctz/tzdata/generated/d3dbc4b002cc7a0e5761a3097651309a b/contrib/libs/cctz/tzdata/generated/America/Porto_Velho
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d3dbc4b002cc7a0e5761a3097651309a
rename to contrib/libs/cctz/tzdata/generated/America/Porto_Velho
diff --git a/contrib/libs/cctz/tzdata/generated/America/Puerto_Rico b/contrib/libs/cctz/tzdata/generated/America/Puerto_Rico
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Puerto_Rico differ
diff --git a/contrib/libs/cctz/tzdata/generated/a06adc807729db23da9fdb54dc714f8b b/contrib/libs/cctz/tzdata/generated/America/Punta_Arenas
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a06adc807729db23da9fdb54dc714f8b
rename to contrib/libs/cctz/tzdata/generated/America/Punta_Arenas
diff --git a/contrib/libs/cctz/tzdata/generated/1ee6e72e10673d4a16b6e24671f793ec b/contrib/libs/cctz/tzdata/generated/America/Rainy_River
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1ee6e72e10673d4a16b6e24671f793ec
rename to contrib/libs/cctz/tzdata/generated/America/Rainy_River
diff --git a/contrib/libs/cctz/tzdata/generated/ea521f9e43ebb66928bb2f9462a509d2 b/contrib/libs/cctz/tzdata/generated/America/Rankin_Inlet
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ea521f9e43ebb66928bb2f9462a509d2
rename to contrib/libs/cctz/tzdata/generated/America/Rankin_Inlet
diff --git a/contrib/libs/cctz/tzdata/generated/cc7e35a2df60f44003b96877116f4d93 b/contrib/libs/cctz/tzdata/generated/America/Recife
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/cc7e35a2df60f44003b96877116f4d93
rename to contrib/libs/cctz/tzdata/generated/America/Recife
diff --git a/contrib/libs/cctz/tzdata/generated/c87b8b428cfdf54309e9503177e0ca5f b/contrib/libs/cctz/tzdata/generated/America/Regina
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c87b8b428cfdf54309e9503177e0ca5f
rename to contrib/libs/cctz/tzdata/generated/America/Regina
diff --git a/contrib/libs/cctz/tzdata/generated/6c82012b52156392f0cd7178ebcfa900 b/contrib/libs/cctz/tzdata/generated/America/Resolute
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6c82012b52156392f0cd7178ebcfa900
rename to contrib/libs/cctz/tzdata/generated/America/Resolute
diff --git a/contrib/libs/cctz/tzdata/generated/America/Rio_Branco b/contrib/libs/cctz/tzdata/generated/America/Rio_Branco
new file mode 100644
index 000000000000..fb5185ca6028
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Rio_Branco differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Rosario b/contrib/libs/cctz/tzdata/generated/America/Rosario
new file mode 100644
index 000000000000..35a52e53d123
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Rosario differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Santa_Isabel b/contrib/libs/cctz/tzdata/generated/America/Santa_Isabel
new file mode 100644
index 000000000000..18d0d14afc1c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Santa_Isabel differ
diff --git a/contrib/libs/cctz/tzdata/generated/79b1d15365011739a45fe1de0258ae52 b/contrib/libs/cctz/tzdata/generated/America/Santarem
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/79b1d15365011739a45fe1de0258ae52
rename to contrib/libs/cctz/tzdata/generated/America/Santarem
diff --git a/contrib/libs/cctz/tzdata/generated/c3b66836f89ba29559e1b438d7454e0b b/contrib/libs/cctz/tzdata/generated/America/Santiago
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c3b66836f89ba29559e1b438d7454e0b
rename to contrib/libs/cctz/tzdata/generated/America/Santiago
diff --git a/contrib/libs/cctz/tzdata/generated/3f4c05321e52971f2213bfb9e45b7a35 b/contrib/libs/cctz/tzdata/generated/America/Santo_Domingo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3f4c05321e52971f2213bfb9e45b7a35
rename to contrib/libs/cctz/tzdata/generated/America/Santo_Domingo
diff --git a/contrib/libs/cctz/tzdata/generated/94e0437e48ebbef69b3fb7fe2af5e0f2 b/contrib/libs/cctz/tzdata/generated/America/Sao_Paulo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/94e0437e48ebbef69b3fb7fe2af5e0f2
rename to contrib/libs/cctz/tzdata/generated/America/Sao_Paulo
diff --git a/contrib/libs/cctz/tzdata/generated/bf0c84231fd8e23714fc440747e56f0b b/contrib/libs/cctz/tzdata/generated/America/Scoresbysund
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bf0c84231fd8e23714fc440747e56f0b
rename to contrib/libs/cctz/tzdata/generated/America/Scoresbysund
diff --git a/contrib/libs/cctz/tzdata/generated/America/Shiprock b/contrib/libs/cctz/tzdata/generated/America/Shiprock
new file mode 100644
index 000000000000..09e54e5c7c5b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Shiprock differ
diff --git a/contrib/libs/cctz/tzdata/generated/4b710acfb88ea85eda7b5f75df122214 b/contrib/libs/cctz/tzdata/generated/America/Sitka
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4b710acfb88ea85eda7b5f75df122214
rename to contrib/libs/cctz/tzdata/generated/America/Sitka
diff --git a/contrib/libs/cctz/tzdata/generated/America/St_Barthelemy b/contrib/libs/cctz/tzdata/generated/America/St_Barthelemy
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/St_Barthelemy differ
diff --git a/contrib/libs/cctz/tzdata/generated/b5fb2c880a7c41fe2fa96a4792d83269 b/contrib/libs/cctz/tzdata/generated/America/St_Johns
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b5fb2c880a7c41fe2fa96a4792d83269
rename to contrib/libs/cctz/tzdata/generated/America/St_Johns
diff --git a/contrib/libs/cctz/tzdata/generated/America/St_Kitts b/contrib/libs/cctz/tzdata/generated/America/St_Kitts
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/St_Kitts differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/St_Lucia b/contrib/libs/cctz/tzdata/generated/America/St_Lucia
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/St_Lucia differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/St_Thomas b/contrib/libs/cctz/tzdata/generated/America/St_Thomas
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/St_Thomas differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/St_Vincent b/contrib/libs/cctz/tzdata/generated/America/St_Vincent
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/St_Vincent differ
diff --git a/contrib/libs/cctz/tzdata/generated/4a956902cb69a4cba608798e1da71a58 b/contrib/libs/cctz/tzdata/generated/America/Swift_Current
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4a956902cb69a4cba608798e1da71a58
rename to contrib/libs/cctz/tzdata/generated/America/Swift_Current
diff --git a/contrib/libs/cctz/tzdata/generated/b3c87245083e0474ed4ce3d23abb7f4f b/contrib/libs/cctz/tzdata/generated/America/Tegucigalpa
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b3c87245083e0474ed4ce3d23abb7f4f
rename to contrib/libs/cctz/tzdata/generated/America/Tegucigalpa
diff --git a/contrib/libs/cctz/tzdata/generated/b8c39bf52aaa707c58a301ce115ee576 b/contrib/libs/cctz/tzdata/generated/America/Thule
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b8c39bf52aaa707c58a301ce115ee576
rename to contrib/libs/cctz/tzdata/generated/America/Thule
diff --git a/contrib/libs/cctz/tzdata/generated/America/Thunder_Bay b/contrib/libs/cctz/tzdata/generated/America/Thunder_Bay
new file mode 100644
index 000000000000..668e70d765dc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Thunder_Bay differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Tijuana b/contrib/libs/cctz/tzdata/generated/America/Tijuana
new file mode 100644
index 000000000000..18d0d14afc1c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Tijuana differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Toronto b/contrib/libs/cctz/tzdata/generated/America/Toronto
new file mode 100644
index 000000000000..668e70d765dc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Toronto differ
diff --git a/contrib/libs/cctz/tzdata/generated/America/Tortola b/contrib/libs/cctz/tzdata/generated/America/Tortola
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Tortola differ
diff --git a/contrib/libs/cctz/tzdata/generated/bc58930f92342790d3ee214524808faa b/contrib/libs/cctz/tzdata/generated/America/Vancouver
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bc58930f92342790d3ee214524808faa
rename to contrib/libs/cctz/tzdata/generated/America/Vancouver
diff --git a/contrib/libs/cctz/tzdata/generated/America/Virgin b/contrib/libs/cctz/tzdata/generated/America/Virgin
new file mode 100644
index 000000000000..47b4dc34160d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Virgin differ
diff --git a/contrib/libs/cctz/tzdata/generated/5fa937049e86ffbf52d4348c6c43b0ad b/contrib/libs/cctz/tzdata/generated/America/Whitehorse
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5fa937049e86ffbf52d4348c6c43b0ad
rename to contrib/libs/cctz/tzdata/generated/America/Whitehorse
diff --git a/contrib/libs/cctz/tzdata/generated/America/Winnipeg b/contrib/libs/cctz/tzdata/generated/America/Winnipeg
new file mode 100644
index 000000000000..7e646d18e188
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/America/Winnipeg differ
diff --git a/contrib/libs/cctz/tzdata/generated/3ee52913271777c67f23d5a918bb0f7c b/contrib/libs/cctz/tzdata/generated/America/Yakutat
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3ee52913271777c67f23d5a918bb0f7c
rename to contrib/libs/cctz/tzdata/generated/America/Yakutat
diff --git a/contrib/libs/cctz/tzdata/generated/56dbf10674ff9ef08ef9088d7e7ab639 b/contrib/libs/cctz/tzdata/generated/America/Yellowknife
similarity index 59%
rename from contrib/libs/cctz/tzdata/generated/56dbf10674ff9ef08ef9088d7e7ab639
rename to contrib/libs/cctz/tzdata/generated/America/Yellowknife
index 137867c8bf5b..645ee9453073 100644
Binary files a/contrib/libs/cctz/tzdata/generated/56dbf10674ff9ef08ef9088d7e7ab639 and b/contrib/libs/cctz/tzdata/generated/America/Yellowknife differ
diff --git a/contrib/libs/cctz/tzdata/generated/957f11834b112fc8d4098a9a695e119e b/contrib/libs/cctz/tzdata/generated/Antarctica/Casey
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/957f11834b112fc8d4098a9a695e119e
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Casey
diff --git a/contrib/libs/cctz/tzdata/generated/b61230343294608431fbbd939bb6971d b/contrib/libs/cctz/tzdata/generated/Antarctica/Davis
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b61230343294608431fbbd939bb6971d
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Davis
diff --git a/contrib/libs/cctz/tzdata/generated/bcf8aa818432d7ae244087c7306bcb23 b/contrib/libs/cctz/tzdata/generated/Antarctica/DumontDUrville
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bcf8aa818432d7ae244087c7306bcb23
rename to contrib/libs/cctz/tzdata/generated/Antarctica/DumontDUrville
diff --git a/contrib/libs/cctz/tzdata/generated/11ad3359d7c0da89994eaa90a9743841 b/contrib/libs/cctz/tzdata/generated/Antarctica/Macquarie
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/11ad3359d7c0da89994eaa90a9743841
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Macquarie
diff --git a/contrib/libs/cctz/tzdata/generated/63f5d146aa8a66720b2c4db9e87ec1f4 b/contrib/libs/cctz/tzdata/generated/Antarctica/Mawson
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/63f5d146aa8a66720b2c4db9e87ec1f4
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Mawson
diff --git a/contrib/libs/cctz/tzdata/generated/655680c9ae07d4896919210710185038 b/contrib/libs/cctz/tzdata/generated/Antarctica/McMurdo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/655680c9ae07d4896919210710185038
rename to contrib/libs/cctz/tzdata/generated/Antarctica/McMurdo
diff --git a/contrib/libs/cctz/tzdata/generated/3a420ea50d496f0c159a0d18af06b211 b/contrib/libs/cctz/tzdata/generated/Antarctica/Palmer
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3a420ea50d496f0c159a0d18af06b211
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Palmer
diff --git a/contrib/libs/cctz/tzdata/generated/0fb4aa6fed3f28bc7a3dae35a993171a b/contrib/libs/cctz/tzdata/generated/Antarctica/Rothera
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0fb4aa6fed3f28bc7a3dae35a993171a
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Rothera
diff --git a/contrib/libs/cctz/tzdata/generated/Antarctica/South_Pole b/contrib/libs/cctz/tzdata/generated/Antarctica/South_Pole
new file mode 100644
index 000000000000..afb392931847
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Antarctica/South_Pole differ
diff --git a/contrib/libs/cctz/tzdata/generated/165baa2c51758e236a98a6a1c4cf09a0 b/contrib/libs/cctz/tzdata/generated/Antarctica/Syowa
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/165baa2c51758e236a98a6a1c4cf09a0
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Syowa
diff --git a/contrib/libs/cctz/tzdata/generated/5be25880a5bfb0b41e680f0cfbd222bc b/contrib/libs/cctz/tzdata/generated/Antarctica/Troll
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5be25880a5bfb0b41e680f0cfbd222bc
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Troll
diff --git a/contrib/libs/cctz/tzdata/generated/4b9d7c5b5f9ba7faf5bd875c5dd43707 b/contrib/libs/cctz/tzdata/generated/Antarctica/Vostok
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4b9d7c5b5f9ba7faf5bd875c5dd43707
rename to contrib/libs/cctz/tzdata/generated/Antarctica/Vostok
diff --git a/contrib/libs/cctz/tzdata/generated/2577d6d2ba90616ca47c8ee8d9fbca20 b/contrib/libs/cctz/tzdata/generated/Arctic/Longyearbyen
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2577d6d2ba90616ca47c8ee8d9fbca20
rename to contrib/libs/cctz/tzdata/generated/Arctic/Longyearbyen
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Aden b/contrib/libs/cctz/tzdata/generated/Asia/Aden
new file mode 100644
index 000000000000..01c47ccb86cc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Aden differ
diff --git a/contrib/libs/cctz/tzdata/generated/279d4250978d0c0149da78aeecd030bc b/contrib/libs/cctz/tzdata/generated/Asia/Almaty
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/279d4250978d0c0149da78aeecd030bc
rename to contrib/libs/cctz/tzdata/generated/Asia/Almaty
diff --git a/contrib/libs/cctz/tzdata/generated/0abd3c37bec0c4c7f1a2284c3457adb3 b/contrib/libs/cctz/tzdata/generated/Asia/Amman
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0abd3c37bec0c4c7f1a2284c3457adb3
rename to contrib/libs/cctz/tzdata/generated/Asia/Amman
diff --git a/contrib/libs/cctz/tzdata/generated/f627017649ea589681b7b0dd45c03118 b/contrib/libs/cctz/tzdata/generated/Asia/Anadyr
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f627017649ea589681b7b0dd45c03118
rename to contrib/libs/cctz/tzdata/generated/Asia/Anadyr
diff --git a/contrib/libs/cctz/tzdata/generated/af82eec1529bf616942df14b2ffb4403 b/contrib/libs/cctz/tzdata/generated/Asia/Aqtau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/af82eec1529bf616942df14b2ffb4403
rename to contrib/libs/cctz/tzdata/generated/Asia/Aqtau
diff --git a/contrib/libs/cctz/tzdata/generated/34dc35c8aa0f4e3a0064a92e5aa5d762 b/contrib/libs/cctz/tzdata/generated/Asia/Aqtobe
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/34dc35c8aa0f4e3a0064a92e5aa5d762
rename to contrib/libs/cctz/tzdata/generated/Asia/Aqtobe
diff --git a/contrib/libs/cctz/tzdata/generated/c68faf20645ecd953e8eb2fb70469f59 b/contrib/libs/cctz/tzdata/generated/Asia/Ashgabat
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c68faf20645ecd953e8eb2fb70469f59
rename to contrib/libs/cctz/tzdata/generated/Asia/Ashgabat
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Ashkhabad b/contrib/libs/cctz/tzdata/generated/Asia/Ashkhabad
new file mode 100644
index 000000000000..848216726908
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Ashkhabad differ
diff --git a/contrib/libs/cctz/tzdata/generated/dc74e10d17659800407d742d3a5db22b b/contrib/libs/cctz/tzdata/generated/Asia/Atyrau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dc74e10d17659800407d742d3a5db22b
rename to contrib/libs/cctz/tzdata/generated/Asia/Atyrau
diff --git a/contrib/libs/cctz/tzdata/generated/9aa23335da47827d5ce36afc1523bbd3 b/contrib/libs/cctz/tzdata/generated/Asia/Baghdad
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9aa23335da47827d5ce36afc1523bbd3
rename to contrib/libs/cctz/tzdata/generated/Asia/Baghdad
diff --git a/contrib/libs/cctz/tzdata/generated/ec12549279e64ebeb926579888cf89d9 b/contrib/libs/cctz/tzdata/generated/Asia/Bahrain
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ec12549279e64ebeb926579888cf89d9
rename to contrib/libs/cctz/tzdata/generated/Asia/Bahrain
diff --git a/contrib/libs/cctz/tzdata/generated/bde0fe003b2df5121f0d31d3954095a6 b/contrib/libs/cctz/tzdata/generated/Asia/Baku
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bde0fe003b2df5121f0d31d3954095a6
rename to contrib/libs/cctz/tzdata/generated/Asia/Baku
diff --git a/contrib/libs/cctz/tzdata/generated/ff94f36118acae9ef3e19438688e266b b/contrib/libs/cctz/tzdata/generated/Asia/Bangkok
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ff94f36118acae9ef3e19438688e266b
rename to contrib/libs/cctz/tzdata/generated/Asia/Bangkok
diff --git a/contrib/libs/cctz/tzdata/generated/8a8ef367f59b0e3880bd1cff6651b357 b/contrib/libs/cctz/tzdata/generated/Asia/Barnaul
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8a8ef367f59b0e3880bd1cff6651b357
rename to contrib/libs/cctz/tzdata/generated/Asia/Barnaul
diff --git a/contrib/libs/cctz/tzdata/generated/5e8c48c7a60c434f1e2f1e535172cbb9 b/contrib/libs/cctz/tzdata/generated/Asia/Beirut
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5e8c48c7a60c434f1e2f1e535172cbb9
rename to contrib/libs/cctz/tzdata/generated/Asia/Beirut
diff --git a/contrib/libs/cctz/tzdata/generated/56a77f4891fb3e9506aa233f5fbac27e b/contrib/libs/cctz/tzdata/generated/Asia/Bishkek
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/56a77f4891fb3e9506aa233f5fbac27e
rename to contrib/libs/cctz/tzdata/generated/Asia/Bishkek
diff --git a/contrib/libs/cctz/tzdata/generated/bf388a0a1da2be989c25dbfb587076d8 b/contrib/libs/cctz/tzdata/generated/Asia/Brunei
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bf388a0a1da2be989c25dbfb587076d8
rename to contrib/libs/cctz/tzdata/generated/Asia/Brunei
diff --git a/contrib/libs/cctz/tzdata/generated/16a0b637c31e7e480cfccfc46dd75d67 b/contrib/libs/cctz/tzdata/generated/Asia/Calcutta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/16a0b637c31e7e480cfccfc46dd75d67
rename to contrib/libs/cctz/tzdata/generated/Asia/Calcutta
diff --git a/contrib/libs/cctz/tzdata/generated/2d0a65ce6c15961ab95c917d9f23e882 b/contrib/libs/cctz/tzdata/generated/Asia/Chita
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2d0a65ce6c15961ab95c917d9f23e882
rename to contrib/libs/cctz/tzdata/generated/Asia/Chita
diff --git a/contrib/libs/cctz/tzdata/generated/66a0ec5d00519d1826d055514861779d b/contrib/libs/cctz/tzdata/generated/Asia/Choibalsan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/66a0ec5d00519d1826d055514861779d
rename to contrib/libs/cctz/tzdata/generated/Asia/Choibalsan
diff --git a/contrib/libs/cctz/tzdata/generated/dff9cd919f10d25842d1381cdff9f7f7 b/contrib/libs/cctz/tzdata/generated/Asia/Chongqing
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dff9cd919f10d25842d1381cdff9f7f7
rename to contrib/libs/cctz/tzdata/generated/Asia/Chongqing
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Chungking b/contrib/libs/cctz/tzdata/generated/Asia/Chungking
new file mode 100644
index 000000000000..d6b66984a2f3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Chungking differ
diff --git a/contrib/libs/cctz/tzdata/generated/d41b1974e5ec6b3bc790062a97894a37 b/contrib/libs/cctz/tzdata/generated/Asia/Colombo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d41b1974e5ec6b3bc790062a97894a37
rename to contrib/libs/cctz/tzdata/generated/Asia/Colombo
diff --git a/contrib/libs/cctz/tzdata/generated/940f5a339a1f12a7153474fc3c92c624 b/contrib/libs/cctz/tzdata/generated/Asia/Dacca
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/940f5a339a1f12a7153474fc3c92c624
rename to contrib/libs/cctz/tzdata/generated/Asia/Dacca
diff --git a/contrib/libs/cctz/tzdata/generated/c8376c6c326f4e99e093b6bc6cb9cd6e b/contrib/libs/cctz/tzdata/generated/Asia/Damascus
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c8376c6c326f4e99e093b6bc6cb9cd6e
rename to contrib/libs/cctz/tzdata/generated/Asia/Damascus
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Dhaka b/contrib/libs/cctz/tzdata/generated/Asia/Dhaka
new file mode 100644
index 000000000000..28136808b6d1
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Dhaka differ
diff --git a/contrib/libs/cctz/tzdata/generated/8a60b6309c1443774d2f065bcf2bbc61 b/contrib/libs/cctz/tzdata/generated/Asia/Dili
similarity index 62%
rename from contrib/libs/cctz/tzdata/generated/8a60b6309c1443774d2f065bcf2bbc61
rename to contrib/libs/cctz/tzdata/generated/Asia/Dili
index bb7be9f3a471..22e705ca1ab1 100644
Binary files a/contrib/libs/cctz/tzdata/generated/8a60b6309c1443774d2f065bcf2bbc61 and b/contrib/libs/cctz/tzdata/generated/Asia/Dili differ
diff --git a/contrib/libs/cctz/tzdata/generated/667e494c45d181f0706bd07b211c850b b/contrib/libs/cctz/tzdata/generated/Asia/Dubai
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/667e494c45d181f0706bd07b211c850b
rename to contrib/libs/cctz/tzdata/generated/Asia/Dubai
diff --git a/contrib/libs/cctz/tzdata/generated/7d4619fed11db15c54153613fcf23bda b/contrib/libs/cctz/tzdata/generated/Asia/Dushanbe
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7d4619fed11db15c54153613fcf23bda
rename to contrib/libs/cctz/tzdata/generated/Asia/Dushanbe
diff --git a/contrib/libs/cctz/tzdata/generated/4cd70a6fdc80b1b15c0b9f7c3b807107 b/contrib/libs/cctz/tzdata/generated/Asia/Famagusta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4cd70a6fdc80b1b15c0b9f7c3b807107
rename to contrib/libs/cctz/tzdata/generated/Asia/Famagusta
diff --git a/contrib/libs/cctz/tzdata/generated/c7ad5e1c33180b6d6195dad6f2e37562 b/contrib/libs/cctz/tzdata/generated/Asia/Gaza
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c7ad5e1c33180b6d6195dad6f2e37562
rename to contrib/libs/cctz/tzdata/generated/Asia/Gaza
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Harbin b/contrib/libs/cctz/tzdata/generated/Asia/Harbin
new file mode 100644
index 000000000000..d6b66984a2f3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Harbin differ
diff --git a/contrib/libs/cctz/tzdata/generated/322414fc3b2cc4a59f372395a1f19977 b/contrib/libs/cctz/tzdata/generated/Asia/Hebron
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/322414fc3b2cc4a59f372395a1f19977
rename to contrib/libs/cctz/tzdata/generated/Asia/Hebron
diff --git a/contrib/libs/cctz/tzdata/generated/497c12986b7f72014497d11c00f54b0a b/contrib/libs/cctz/tzdata/generated/Asia/Ho_Chi_Minh
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/497c12986b7f72014497d11c00f54b0a
rename to contrib/libs/cctz/tzdata/generated/Asia/Ho_Chi_Minh
diff --git a/contrib/libs/cctz/tzdata/generated/f729c88451bacd2895fc1c8d29064c46 b/contrib/libs/cctz/tzdata/generated/Asia/Hong_Kong
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f729c88451bacd2895fc1c8d29064c46
rename to contrib/libs/cctz/tzdata/generated/Asia/Hong_Kong
diff --git a/contrib/libs/cctz/tzdata/generated/3c4a6f9840f3d89534c5f511329704e8 b/contrib/libs/cctz/tzdata/generated/Asia/Hovd
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3c4a6f9840f3d89534c5f511329704e8
rename to contrib/libs/cctz/tzdata/generated/Asia/Hovd
diff --git a/contrib/libs/cctz/tzdata/generated/4e36cb5f575bdcbdd38b144d5a9195c9 b/contrib/libs/cctz/tzdata/generated/Asia/Irkutsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4e36cb5f575bdcbdd38b144d5a9195c9
rename to contrib/libs/cctz/tzdata/generated/Asia/Irkutsk
diff --git a/contrib/libs/cctz/tzdata/generated/48252c9a797f0f4bea97557a5094cf98 b/contrib/libs/cctz/tzdata/generated/Asia/Istanbul
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/48252c9a797f0f4bea97557a5094cf98
rename to contrib/libs/cctz/tzdata/generated/Asia/Istanbul
diff --git a/contrib/libs/cctz/tzdata/generated/325a2d872e0c0e5339f2e134e921047a b/contrib/libs/cctz/tzdata/generated/Asia/Jakarta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/325a2d872e0c0e5339f2e134e921047a
rename to contrib/libs/cctz/tzdata/generated/Asia/Jakarta
diff --git a/contrib/libs/cctz/tzdata/generated/4709fe18f39068d2ca7de4c5396e1513 b/contrib/libs/cctz/tzdata/generated/Asia/Jayapura
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4709fe18f39068d2ca7de4c5396e1513
rename to contrib/libs/cctz/tzdata/generated/Asia/Jayapura
diff --git a/contrib/libs/cctz/tzdata/generated/9360bb34802002d91d9bba174c25a8dc b/contrib/libs/cctz/tzdata/generated/Asia/Jerusalem
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9360bb34802002d91d9bba174c25a8dc
rename to contrib/libs/cctz/tzdata/generated/Asia/Jerusalem
diff --git a/contrib/libs/cctz/tzdata/generated/17ca5b7fed86c92696b863cb6a78187f b/contrib/libs/cctz/tzdata/generated/Asia/Kabul
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/17ca5b7fed86c92696b863cb6a78187f
rename to contrib/libs/cctz/tzdata/generated/Asia/Kabul
diff --git a/contrib/libs/cctz/tzdata/generated/959247e441092255286b22fef107172f b/contrib/libs/cctz/tzdata/generated/Asia/Kamchatka
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/959247e441092255286b22fef107172f
rename to contrib/libs/cctz/tzdata/generated/Asia/Kamchatka
diff --git a/contrib/libs/cctz/tzdata/generated/ef4485e168a60d91cc5347e5de9a3407 b/contrib/libs/cctz/tzdata/generated/Asia/Karachi
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ef4485e168a60d91cc5347e5de9a3407
rename to contrib/libs/cctz/tzdata/generated/Asia/Karachi
diff --git a/contrib/libs/cctz/tzdata/generated/67c981ccf51584922a1f72dd2d529730 b/contrib/libs/cctz/tzdata/generated/Asia/Kashgar
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/67c981ccf51584922a1f72dd2d529730
rename to contrib/libs/cctz/tzdata/generated/Asia/Kashgar
diff --git a/contrib/libs/cctz/tzdata/generated/90518d05c449fad639594f7f575407d6 b/contrib/libs/cctz/tzdata/generated/Asia/Kathmandu
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/90518d05c449fad639594f7f575407d6
rename to contrib/libs/cctz/tzdata/generated/Asia/Kathmandu
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Katmandu b/contrib/libs/cctz/tzdata/generated/Asia/Katmandu
new file mode 100644
index 000000000000..3a0d330ffd2f
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Katmandu differ
diff --git a/contrib/libs/cctz/tzdata/generated/c46a3b3c120085251d04dd583a06b6a4 b/contrib/libs/cctz/tzdata/generated/Asia/Khandyga
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c46a3b3c120085251d04dd583a06b6a4
rename to contrib/libs/cctz/tzdata/generated/Asia/Khandyga
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Kolkata b/contrib/libs/cctz/tzdata/generated/Asia/Kolkata
new file mode 100644
index 000000000000..00bc80a65e9a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Kolkata differ
diff --git a/contrib/libs/cctz/tzdata/generated/702a65f05da90971b14686c21add1a90 b/contrib/libs/cctz/tzdata/generated/Asia/Krasnoyarsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/702a65f05da90971b14686c21add1a90
rename to contrib/libs/cctz/tzdata/generated/Asia/Krasnoyarsk
diff --git a/contrib/libs/cctz/tzdata/generated/8a2bb95893137bb40748ef4ecd8d7435 b/contrib/libs/cctz/tzdata/generated/Asia/Kuala_Lumpur
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8a2bb95893137bb40748ef4ecd8d7435
rename to contrib/libs/cctz/tzdata/generated/Asia/Kuala_Lumpur
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Kuching b/contrib/libs/cctz/tzdata/generated/Asia/Kuching
new file mode 100644
index 000000000000..59bc6e40b7bb
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Kuching differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Kuwait b/contrib/libs/cctz/tzdata/generated/Asia/Kuwait
new file mode 100644
index 000000000000..01c47ccb86cc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Kuwait differ
diff --git a/contrib/libs/cctz/tzdata/generated/d3dfd69107a4d78facbc67c4d8cea004 b/contrib/libs/cctz/tzdata/generated/Asia/Macao
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d3dfd69107a4d78facbc67c4d8cea004
rename to contrib/libs/cctz/tzdata/generated/Asia/Macao
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Macau b/contrib/libs/cctz/tzdata/generated/Asia/Macau
new file mode 100644
index 000000000000..c22f75e42db6
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Macau differ
diff --git a/contrib/libs/cctz/tzdata/generated/656bd0f3d2def024f4d1e59fc668b538 b/contrib/libs/cctz/tzdata/generated/Asia/Magadan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/656bd0f3d2def024f4d1e59fc668b538
rename to contrib/libs/cctz/tzdata/generated/Asia/Magadan
diff --git a/contrib/libs/cctz/tzdata/generated/c8c41a468e356c6bb65e89c69e4406dc b/contrib/libs/cctz/tzdata/generated/Asia/Makassar
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c8c41a468e356c6bb65e89c69e4406dc
rename to contrib/libs/cctz/tzdata/generated/Asia/Makassar
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Manila b/contrib/libs/cctz/tzdata/generated/Asia/Manila
new file mode 100644
index 000000000000..145bb6fb162e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Manila differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Muscat b/contrib/libs/cctz/tzdata/generated/Asia/Muscat
new file mode 100644
index 000000000000..58d75bc26eec
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Muscat differ
diff --git a/contrib/libs/cctz/tzdata/generated/0ec72f7b73a20e311e127abd87a9ec26 b/contrib/libs/cctz/tzdata/generated/Asia/Nicosia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0ec72f7b73a20e311e127abd87a9ec26
rename to contrib/libs/cctz/tzdata/generated/Asia/Nicosia
diff --git a/contrib/libs/cctz/tzdata/generated/71705112182911b4327ac195ffae174b b/contrib/libs/cctz/tzdata/generated/Asia/Novokuznetsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/71705112182911b4327ac195ffae174b
rename to contrib/libs/cctz/tzdata/generated/Asia/Novokuznetsk
diff --git a/contrib/libs/cctz/tzdata/generated/8c3304792234093e5a3d5debcef24a32 b/contrib/libs/cctz/tzdata/generated/Asia/Novosibirsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8c3304792234093e5a3d5debcef24a32
rename to contrib/libs/cctz/tzdata/generated/Asia/Novosibirsk
diff --git a/contrib/libs/cctz/tzdata/generated/2ee30998e941f8d603ad278135230cbd b/contrib/libs/cctz/tzdata/generated/Asia/Omsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2ee30998e941f8d603ad278135230cbd
rename to contrib/libs/cctz/tzdata/generated/Asia/Omsk
diff --git a/contrib/libs/cctz/tzdata/generated/c72131eaa200e2aa58e1c12fe94f1f67 b/contrib/libs/cctz/tzdata/generated/Asia/Oral
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c72131eaa200e2aa58e1c12fe94f1f67
rename to contrib/libs/cctz/tzdata/generated/Asia/Oral
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Phnom_Penh b/contrib/libs/cctz/tzdata/generated/Asia/Phnom_Penh
new file mode 100644
index 000000000000..ed687d2985c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Phnom_Penh differ
diff --git a/contrib/libs/cctz/tzdata/generated/28fe8388ff78123cfd04d67e32057886 b/contrib/libs/cctz/tzdata/generated/Asia/Pontianak
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/28fe8388ff78123cfd04d67e32057886
rename to contrib/libs/cctz/tzdata/generated/Asia/Pontianak
diff --git a/contrib/libs/cctz/tzdata/generated/772e6342aeba16851eed7dcda632c5be b/contrib/libs/cctz/tzdata/generated/Asia/Pyongyang
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/772e6342aeba16851eed7dcda632c5be
rename to contrib/libs/cctz/tzdata/generated/Asia/Pyongyang
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Qatar b/contrib/libs/cctz/tzdata/generated/Asia/Qatar
new file mode 100644
index 000000000000..7409d74983c8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Qatar differ
diff --git a/contrib/libs/cctz/tzdata/generated/392cb3560b8232dee518c44c92295f10 b/contrib/libs/cctz/tzdata/generated/Asia/Qostanay
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/392cb3560b8232dee518c44c92295f10
rename to contrib/libs/cctz/tzdata/generated/Asia/Qostanay
diff --git a/contrib/libs/cctz/tzdata/generated/4fff9a8801bd2b75474dde3870d24e89 b/contrib/libs/cctz/tzdata/generated/Asia/Qyzylorda
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4fff9a8801bd2b75474dde3870d24e89
rename to contrib/libs/cctz/tzdata/generated/Asia/Qyzylorda
diff --git a/contrib/libs/cctz/tzdata/generated/37f26cf8b8fe9179833e366ca13b8916 b/contrib/libs/cctz/tzdata/generated/Asia/Rangoon
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/37f26cf8b8fe9179833e366ca13b8916
rename to contrib/libs/cctz/tzdata/generated/Asia/Rangoon
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Riyadh b/contrib/libs/cctz/tzdata/generated/Asia/Riyadh
new file mode 100644
index 000000000000..01c47ccb86cc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Riyadh differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Saigon b/contrib/libs/cctz/tzdata/generated/Asia/Saigon
new file mode 100644
index 000000000000..86e21b0f5244
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Saigon differ
diff --git a/contrib/libs/cctz/tzdata/generated/a1239114e71b76c885dbad8f2fa61de4 b/contrib/libs/cctz/tzdata/generated/Asia/Sakhalin
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a1239114e71b76c885dbad8f2fa61de4
rename to contrib/libs/cctz/tzdata/generated/Asia/Sakhalin
diff --git a/contrib/libs/cctz/tzdata/generated/9f39ae0771032afbfca86630bec12768 b/contrib/libs/cctz/tzdata/generated/Asia/Samarkand
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9f39ae0771032afbfca86630bec12768
rename to contrib/libs/cctz/tzdata/generated/Asia/Samarkand
diff --git a/contrib/libs/cctz/tzdata/generated/da5aae5f9a71de05b4625f74b007c461 b/contrib/libs/cctz/tzdata/generated/Asia/Seoul
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/da5aae5f9a71de05b4625f74b007c461
rename to contrib/libs/cctz/tzdata/generated/Asia/Seoul
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Shanghai b/contrib/libs/cctz/tzdata/generated/Asia/Shanghai
new file mode 100644
index 000000000000..d6b66984a2f3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Shanghai differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Singapore b/contrib/libs/cctz/tzdata/generated/Asia/Singapore
new file mode 100644
index 000000000000..dbbdea3c8149
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Singapore differ
diff --git a/contrib/libs/cctz/tzdata/generated/d155718faacae2f6288b0c88e66f851c b/contrib/libs/cctz/tzdata/generated/Asia/Srednekolymsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d155718faacae2f6288b0c88e66f851c
rename to contrib/libs/cctz/tzdata/generated/Asia/Srednekolymsk
diff --git a/contrib/libs/cctz/tzdata/generated/eda5a4ce01efed633c50e04d09fe73b2 b/contrib/libs/cctz/tzdata/generated/Asia/Taipei
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/eda5a4ce01efed633c50e04d09fe73b2
rename to contrib/libs/cctz/tzdata/generated/Asia/Taipei
diff --git a/contrib/libs/cctz/tzdata/generated/310f6ba2360c27c334c6e17fccf2b9a5 b/contrib/libs/cctz/tzdata/generated/Asia/Tashkent
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/310f6ba2360c27c334c6e17fccf2b9a5
rename to contrib/libs/cctz/tzdata/generated/Asia/Tashkent
diff --git a/contrib/libs/cctz/tzdata/generated/d3ca7527ee42255559acf2d74d749d00 b/contrib/libs/cctz/tzdata/generated/Asia/Tbilisi
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d3ca7527ee42255559acf2d74d749d00
rename to contrib/libs/cctz/tzdata/generated/Asia/Tbilisi
diff --git a/contrib/libs/cctz/tzdata/generated/f4825b22e2ad8fb3e0bf20daa84bd774 b/contrib/libs/cctz/tzdata/generated/Asia/Tehran
similarity index 92%
rename from contrib/libs/cctz/tzdata/generated/f4825b22e2ad8fb3e0bf20daa84bd774
rename to contrib/libs/cctz/tzdata/generated/Asia/Tehran
index 824acb0426fa..6fd31e075a29 100644
Binary files a/contrib/libs/cctz/tzdata/generated/f4825b22e2ad8fb3e0bf20daa84bd774 and b/contrib/libs/cctz/tzdata/generated/Asia/Tehran differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Tel_Aviv b/contrib/libs/cctz/tzdata/generated/Asia/Tel_Aviv
new file mode 100644
index 000000000000..4c49bbf52440
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Tel_Aviv differ
diff --git a/contrib/libs/cctz/tzdata/generated/b4aa5f2b966a76ebc38d1aab44d86bce b/contrib/libs/cctz/tzdata/generated/Asia/Thimbu
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b4aa5f2b966a76ebc38d1aab44d86bce
rename to contrib/libs/cctz/tzdata/generated/Asia/Thimbu
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Thimphu b/contrib/libs/cctz/tzdata/generated/Asia/Thimphu
new file mode 100644
index 000000000000..0edc72cfe46b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Thimphu differ
diff --git a/contrib/libs/cctz/tzdata/generated/618a4a8f78720e26749b9c29ed4fd1b3 b/contrib/libs/cctz/tzdata/generated/Asia/Tokyo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/618a4a8f78720e26749b9c29ed4fd1b3
rename to contrib/libs/cctz/tzdata/generated/Asia/Tokyo
diff --git a/contrib/libs/cctz/tzdata/generated/e770be0bb1b43b9bc7df85f9ac184a79 b/contrib/libs/cctz/tzdata/generated/Asia/Tomsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e770be0bb1b43b9bc7df85f9ac184a79
rename to contrib/libs/cctz/tzdata/generated/Asia/Tomsk
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Ujung_Pandang b/contrib/libs/cctz/tzdata/generated/Asia/Ujung_Pandang
new file mode 100644
index 000000000000..5990010b6497
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Ujung_Pandang differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Ulaanbaatar b/contrib/libs/cctz/tzdata/generated/Asia/Ulaanbaatar
new file mode 100644
index 000000000000..6f5d3a15abbe
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Ulaanbaatar differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Ulan_Bator b/contrib/libs/cctz/tzdata/generated/Asia/Ulan_Bator
new file mode 100644
index 000000000000..6f5d3a15abbe
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Ulan_Bator differ
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Urumqi b/contrib/libs/cctz/tzdata/generated/Asia/Urumqi
new file mode 100644
index 000000000000..69ff7f6fb497
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Urumqi differ
diff --git a/contrib/libs/cctz/tzdata/generated/04875c383508e7181ae595cec9856228 b/contrib/libs/cctz/tzdata/generated/Asia/Ust-Nera
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/04875c383508e7181ae595cec9856228
rename to contrib/libs/cctz/tzdata/generated/Asia/Ust-Nera
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Vientiane b/contrib/libs/cctz/tzdata/generated/Asia/Vientiane
new file mode 100644
index 000000000000..ed687d2985c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Vientiane differ
diff --git a/contrib/libs/cctz/tzdata/generated/4709139f1759e9693b8c02551b527f58 b/contrib/libs/cctz/tzdata/generated/Asia/Vladivostok
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4709139f1759e9693b8c02551b527f58
rename to contrib/libs/cctz/tzdata/generated/Asia/Vladivostok
diff --git a/contrib/libs/cctz/tzdata/generated/b22b7be8696db5ca60fb0b7bba4c8718 b/contrib/libs/cctz/tzdata/generated/Asia/Yakutsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b22b7be8696db5ca60fb0b7bba4c8718
rename to contrib/libs/cctz/tzdata/generated/Asia/Yakutsk
diff --git a/contrib/libs/cctz/tzdata/generated/Asia/Yangon b/contrib/libs/cctz/tzdata/generated/Asia/Yangon
new file mode 100644
index 000000000000..14b2ad09ead5
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Asia/Yangon differ
diff --git a/contrib/libs/cctz/tzdata/generated/bfd18d52a4546531e2f3112725f092d3 b/contrib/libs/cctz/tzdata/generated/Asia/Yekaterinburg
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bfd18d52a4546531e2f3112725f092d3
rename to contrib/libs/cctz/tzdata/generated/Asia/Yekaterinburg
diff --git a/contrib/libs/cctz/tzdata/generated/d1c5195eed8efac077678d1c6d988f7f b/contrib/libs/cctz/tzdata/generated/Asia/Yerevan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d1c5195eed8efac077678d1c6d988f7f
rename to contrib/libs/cctz/tzdata/generated/Asia/Yerevan
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/Azores b/contrib/libs/cctz/tzdata/generated/Atlantic/Azores
new file mode 100644
index 000000000000..cda1c1d225ae
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/Azores differ
diff --git a/contrib/libs/cctz/tzdata/generated/b85d659fabeeb1257ade1f6282a5ec7d b/contrib/libs/cctz/tzdata/generated/Atlantic/Bermuda
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b85d659fabeeb1257ade1f6282a5ec7d
rename to contrib/libs/cctz/tzdata/generated/Atlantic/Bermuda
diff --git a/contrib/libs/cctz/tzdata/generated/1e571eef4b7112bb58a746099afd9f02 b/contrib/libs/cctz/tzdata/generated/Atlantic/Canary
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1e571eef4b7112bb58a746099afd9f02
rename to contrib/libs/cctz/tzdata/generated/Atlantic/Canary
diff --git a/contrib/libs/cctz/tzdata/generated/b7ad70caecef25e4a9ba1e5afd95fe25 b/contrib/libs/cctz/tzdata/generated/Atlantic/Cape_Verde
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/b7ad70caecef25e4a9ba1e5afd95fe25
rename to contrib/libs/cctz/tzdata/generated/Atlantic/Cape_Verde
diff --git a/contrib/libs/cctz/tzdata/generated/253d5505eaf3a497f4fa107633bea235 b/contrib/libs/cctz/tzdata/generated/Atlantic/Faeroe
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/253d5505eaf3a497f4fa107633bea235
rename to contrib/libs/cctz/tzdata/generated/Atlantic/Faeroe
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/Faroe b/contrib/libs/cctz/tzdata/generated/Atlantic/Faroe
new file mode 100644
index 000000000000..9558bf7180ac
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/Faroe differ
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/Jan_Mayen b/contrib/libs/cctz/tzdata/generated/Atlantic/Jan_Mayen
new file mode 100644
index 000000000000..465546bd396a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/Jan_Mayen differ
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/Madeira b/contrib/libs/cctz/tzdata/generated/Atlantic/Madeira
new file mode 100644
index 000000000000..21e84571ee16
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/Madeira differ
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/Reykjavik b/contrib/libs/cctz/tzdata/generated/Atlantic/Reykjavik
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/Reykjavik differ
diff --git a/contrib/libs/cctz/tzdata/generated/2aa2dbd00a40fc7bdc1f1e3d461a2646 b/contrib/libs/cctz/tzdata/generated/Atlantic/South_Georgia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2aa2dbd00a40fc7bdc1f1e3d461a2646
rename to contrib/libs/cctz/tzdata/generated/Atlantic/South_Georgia
diff --git a/contrib/libs/cctz/tzdata/generated/Atlantic/St_Helena b/contrib/libs/cctz/tzdata/generated/Atlantic/St_Helena
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Atlantic/St_Helena differ
diff --git a/contrib/libs/cctz/tzdata/generated/2a4c8fd0d241b11b207c41b0aedd6cf9 b/contrib/libs/cctz/tzdata/generated/Atlantic/Stanley
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/2a4c8fd0d241b11b207c41b0aedd6cf9
rename to contrib/libs/cctz/tzdata/generated/Atlantic/Stanley
diff --git a/contrib/libs/cctz/tzdata/generated/a1085ba102822f56191705c405f2a8ad b/contrib/libs/cctz/tzdata/generated/Australia/ACT
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a1085ba102822f56191705c405f2a8ad
rename to contrib/libs/cctz/tzdata/generated/Australia/ACT
diff --git a/contrib/libs/cctz/tzdata/generated/02d7a06f7ede604bdd6bf40932b670c6 b/contrib/libs/cctz/tzdata/generated/Australia/Adelaide
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/02d7a06f7ede604bdd6bf40932b670c6
rename to contrib/libs/cctz/tzdata/generated/Australia/Adelaide
diff --git a/contrib/libs/cctz/tzdata/generated/d5464310b37a30d92f5b85d128dd4937 b/contrib/libs/cctz/tzdata/generated/Australia/Brisbane
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d5464310b37a30d92f5b85d128dd4937
rename to contrib/libs/cctz/tzdata/generated/Australia/Brisbane
diff --git a/contrib/libs/cctz/tzdata/generated/35eebba76b28756b47e8fff3157eafdb b/contrib/libs/cctz/tzdata/generated/Australia/Broken_Hill
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/35eebba76b28756b47e8fff3157eafdb
rename to contrib/libs/cctz/tzdata/generated/Australia/Broken_Hill
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Canberra b/contrib/libs/cctz/tzdata/generated/Australia/Canberra
new file mode 100644
index 000000000000..1975a3a4bd0e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Canberra differ
diff --git a/contrib/libs/cctz/tzdata/generated/8371d9f10ef8a679be6eadedc6641d73 b/contrib/libs/cctz/tzdata/generated/Australia/Currie
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8371d9f10ef8a679be6eadedc6641d73
rename to contrib/libs/cctz/tzdata/generated/Australia/Currie
diff --git a/contrib/libs/cctz/tzdata/generated/09e36f9135b9ddb666cbb9496fecdf89 b/contrib/libs/cctz/tzdata/generated/Australia/Darwin
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/09e36f9135b9ddb666cbb9496fecdf89
rename to contrib/libs/cctz/tzdata/generated/Australia/Darwin
diff --git a/contrib/libs/cctz/tzdata/generated/e0185725b852fe59ef8e5fef9f619990 b/contrib/libs/cctz/tzdata/generated/Australia/Eucla
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e0185725b852fe59ef8e5fef9f619990
rename to contrib/libs/cctz/tzdata/generated/Australia/Eucla
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Hobart b/contrib/libs/cctz/tzdata/generated/Australia/Hobart
new file mode 100644
index 000000000000..dc2ef554dc38
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Hobart differ
diff --git a/contrib/libs/cctz/tzdata/generated/e68c0f2ebe9dc247712393ab1bd168d2 b/contrib/libs/cctz/tzdata/generated/Australia/LHI
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e68c0f2ebe9dc247712393ab1bd168d2
rename to contrib/libs/cctz/tzdata/generated/Australia/LHI
diff --git a/contrib/libs/cctz/tzdata/generated/1b6ec1c2e23ea5b37361d885e1db8450 b/contrib/libs/cctz/tzdata/generated/Australia/Lindeman
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1b6ec1c2e23ea5b37361d885e1db8450
rename to contrib/libs/cctz/tzdata/generated/Australia/Lindeman
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Lord_Howe b/contrib/libs/cctz/tzdata/generated/Australia/Lord_Howe
new file mode 100644
index 000000000000..4d4ec8ceea9a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Lord_Howe differ
diff --git a/contrib/libs/cctz/tzdata/generated/e308055a9c06f33a854a9d579ed61249 b/contrib/libs/cctz/tzdata/generated/Australia/Melbourne
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e308055a9c06f33a854a9d579ed61249
rename to contrib/libs/cctz/tzdata/generated/Australia/Melbourne
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/NSW b/contrib/libs/cctz/tzdata/generated/Australia/NSW
new file mode 100644
index 000000000000..1975a3a4bd0e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/NSW differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/North b/contrib/libs/cctz/tzdata/generated/Australia/North
new file mode 100644
index 000000000000..a6a67300dd5e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/North differ
diff --git a/contrib/libs/cctz/tzdata/generated/543113396c7e34a7532457a1ce759c4e b/contrib/libs/cctz/tzdata/generated/Australia/Perth
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/543113396c7e34a7532457a1ce759c4e
rename to contrib/libs/cctz/tzdata/generated/Australia/Perth
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Queensland b/contrib/libs/cctz/tzdata/generated/Australia/Queensland
new file mode 100644
index 000000000000..dc9a980a6592
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Queensland differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/South b/contrib/libs/cctz/tzdata/generated/Australia/South
new file mode 100644
index 000000000000..3bfbbc563cf9
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/South differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Sydney b/contrib/libs/cctz/tzdata/generated/Australia/Sydney
new file mode 100644
index 000000000000..1975a3a4bd0e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Sydney differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Tasmania b/contrib/libs/cctz/tzdata/generated/Australia/Tasmania
new file mode 100644
index 000000000000..dc2ef554dc38
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Tasmania differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Victoria b/contrib/libs/cctz/tzdata/generated/Australia/Victoria
new file mode 100644
index 000000000000..d3f195ac2fac
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Victoria differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/West b/contrib/libs/cctz/tzdata/generated/Australia/West
new file mode 100644
index 000000000000..4f771828c9b5
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/West differ
diff --git a/contrib/libs/cctz/tzdata/generated/Australia/Yancowinna b/contrib/libs/cctz/tzdata/generated/Australia/Yancowinna
new file mode 100644
index 000000000000..947b50995f40
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Australia/Yancowinna differ
diff --git a/contrib/libs/cctz/tzdata/generated/Brazil/Acre b/contrib/libs/cctz/tzdata/generated/Brazil/Acre
new file mode 100644
index 000000000000..fb5185ca6028
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Brazil/Acre differ
diff --git a/contrib/libs/cctz/tzdata/generated/Brazil/DeNoronha b/contrib/libs/cctz/tzdata/generated/Brazil/DeNoronha
new file mode 100644
index 000000000000..9e74745ca791
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Brazil/DeNoronha differ
diff --git a/contrib/libs/cctz/tzdata/generated/Brazil/East b/contrib/libs/cctz/tzdata/generated/Brazil/East
new file mode 100644
index 000000000000..a16da2c4d5a9
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Brazil/East differ
diff --git a/contrib/libs/cctz/tzdata/generated/Brazil/West b/contrib/libs/cctz/tzdata/generated/Brazil/West
new file mode 100644
index 000000000000..59c952ebc651
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Brazil/West differ
diff --git a/contrib/libs/cctz/tzdata/generated/7a350885dea1ebe1bf630eb4254e9abc b/contrib/libs/cctz/tzdata/generated/CET
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7a350885dea1ebe1bf630eb4254e9abc
rename to contrib/libs/cctz/tzdata/generated/CET
diff --git a/contrib/libs/cctz/tzdata/generated/CST6CDT b/contrib/libs/cctz/tzdata/generated/CST6CDT
new file mode 100644
index 000000000000..b01688065392
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/CST6CDT differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Atlantic b/contrib/libs/cctz/tzdata/generated/Canada/Atlantic
new file mode 100644
index 000000000000..9fa850a7d4c3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Atlantic differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Central b/contrib/libs/cctz/tzdata/generated/Canada/Central
new file mode 100644
index 000000000000..7e646d18e188
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Central differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Eastern b/contrib/libs/cctz/tzdata/generated/Canada/Eastern
new file mode 100644
index 000000000000..668e70d765dc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Eastern differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Mountain b/contrib/libs/cctz/tzdata/generated/Canada/Mountain
new file mode 100644
index 000000000000..645ee9453073
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Mountain differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Newfoundland b/contrib/libs/cctz/tzdata/generated/Canada/Newfoundland
new file mode 100644
index 000000000000..94d790baaccb
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Newfoundland differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Pacific b/contrib/libs/cctz/tzdata/generated/Canada/Pacific
new file mode 100644
index 000000000000..c998491112ea
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Pacific differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Saskatchewan b/contrib/libs/cctz/tzdata/generated/Canada/Saskatchewan
new file mode 100644
index 000000000000..a3f8217a544e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Saskatchewan differ
diff --git a/contrib/libs/cctz/tzdata/generated/Canada/Yukon b/contrib/libs/cctz/tzdata/generated/Canada/Yukon
new file mode 100644
index 000000000000..40baa9aba2a8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Canada/Yukon differ
diff --git a/contrib/libs/cctz/tzdata/generated/Chile/Continental b/contrib/libs/cctz/tzdata/generated/Chile/Continental
new file mode 100644
index 000000000000..d3fc9b834336
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Chile/Continental differ
diff --git a/contrib/libs/cctz/tzdata/generated/57aca34c4b3ca88d9c94b88990c62c79 b/contrib/libs/cctz/tzdata/generated/Chile/EasterIsland
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/57aca34c4b3ca88d9c94b88990c62c79
rename to contrib/libs/cctz/tzdata/generated/Chile/EasterIsland
diff --git a/contrib/libs/cctz/tzdata/generated/Cuba b/contrib/libs/cctz/tzdata/generated/Cuba
new file mode 100644
index 000000000000..e06629d36841
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Cuba differ
diff --git a/contrib/libs/cctz/tzdata/generated/9006b968810f68ce90473c809b252776 b/contrib/libs/cctz/tzdata/generated/EET
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9006b968810f68ce90473c809b252776
rename to contrib/libs/cctz/tzdata/generated/EET
diff --git a/contrib/libs/cctz/tzdata/generated/EST b/contrib/libs/cctz/tzdata/generated/EST
new file mode 100644
index 000000000000..9154643f4c91
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/EST differ
diff --git a/contrib/libs/cctz/tzdata/generated/EST5EDT b/contrib/libs/cctz/tzdata/generated/EST5EDT
new file mode 100644
index 000000000000..2b6c2eea14df
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/EST5EDT differ
diff --git a/contrib/libs/cctz/tzdata/generated/Egypt b/contrib/libs/cctz/tzdata/generated/Egypt
new file mode 100644
index 000000000000..1e6d48d1ca4e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Egypt differ
diff --git a/contrib/libs/cctz/tzdata/generated/1917c051a13995cc4c32d2ce05bc3e7b b/contrib/libs/cctz/tzdata/generated/Eire
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1917c051a13995cc4c32d2ce05bc3e7b
rename to contrib/libs/cctz/tzdata/generated/Eire
diff --git a/contrib/libs/cctz/tzdata/generated/e7577ad74319a942781e7153a97d7690 b/contrib/libs/cctz/tzdata/generated/Etc/GMT
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e7577ad74319a942781e7153a97d7690
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT
diff --git a/contrib/libs/cctz/tzdata/generated/ef8eca09259416ea4e1d5b4bb865a645 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+0
similarity index 57%
rename from contrib/libs/cctz/tzdata/generated/ef8eca09259416ea4e1d5b4bb865a645
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+0
index a0953d1e791e..157573b1d340 100644
Binary files a/contrib/libs/cctz/tzdata/generated/ef8eca09259416ea4e1d5b4bb865a645 and b/contrib/libs/cctz/tzdata/generated/Etc/GMT+0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/d8af0cadc03a3813b866bbfeb041e167 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+1
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d8af0cadc03a3813b866bbfeb041e167
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+1
diff --git a/contrib/libs/cctz/tzdata/generated/9766867907fd0631d6357abfcb71fde5 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+10
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9766867907fd0631d6357abfcb71fde5
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+10
diff --git a/contrib/libs/cctz/tzdata/generated/d40107fc4f4515f2f2eed25a1ca88fb8 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+11
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d40107fc4f4515f2f2eed25a1ca88fb8
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+11
diff --git a/contrib/libs/cctz/tzdata/generated/52569f1fcc560faffd0ed78e0e9eb69f b/contrib/libs/cctz/tzdata/generated/Etc/GMT+12
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/52569f1fcc560faffd0ed78e0e9eb69f
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+12
diff --git a/contrib/libs/cctz/tzdata/generated/29c0187634c10fc717832169fc449715 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+2
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/29c0187634c10fc717832169fc449715
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+2
diff --git a/contrib/libs/cctz/tzdata/generated/0d49585e3c48010af348561943e319a2 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+3
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0d49585e3c48010af348561943e319a2
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+3
diff --git a/contrib/libs/cctz/tzdata/generated/88546761589cb98c5209ff92ac71be7d b/contrib/libs/cctz/tzdata/generated/Etc/GMT+4
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/88546761589cb98c5209ff92ac71be7d
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+4
diff --git a/contrib/libs/cctz/tzdata/generated/9c4035bc2046d3be368e14a46fc8685d b/contrib/libs/cctz/tzdata/generated/Etc/GMT+5
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9c4035bc2046d3be368e14a46fc8685d
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+5
diff --git a/contrib/libs/cctz/tzdata/generated/a79c9f48310a80244f2065d08f09f91a b/contrib/libs/cctz/tzdata/generated/Etc/GMT+6
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a79c9f48310a80244f2065d08f09f91a
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+6
diff --git a/contrib/libs/cctz/tzdata/generated/7956f01b2e6933717e9ba4adfd327ccc b/contrib/libs/cctz/tzdata/generated/Etc/GMT+7
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7956f01b2e6933717e9ba4adfd327ccc
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+7
diff --git a/contrib/libs/cctz/tzdata/generated/9eaedd2c3574882c46ddbbfeabc5c444 b/contrib/libs/cctz/tzdata/generated/Etc/GMT+8
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9eaedd2c3574882c46ddbbfeabc5c444
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+8
diff --git a/contrib/libs/cctz/tzdata/generated/0d81f8cc7c4066b8f84371ebbbb3e00c b/contrib/libs/cctz/tzdata/generated/Etc/GMT+9
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0d81f8cc7c4066b8f84371ebbbb3e00c
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT+9
diff --git a/contrib/libs/cctz/tzdata/generated/b33eb6506380f950ad798d4d788d136a b/contrib/libs/cctz/tzdata/generated/Etc/GMT-0
similarity index 57%
rename from contrib/libs/cctz/tzdata/generated/b33eb6506380f950ad798d4d788d136a
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-0
index 3ae969114563..157573b1d340 100644
Binary files a/contrib/libs/cctz/tzdata/generated/b33eb6506380f950ad798d4d788d136a and b/contrib/libs/cctz/tzdata/generated/Etc/GMT-0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/721967abda97296c7f361100d8b868e4 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-1
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/721967abda97296c7f361100d8b868e4
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-1
diff --git a/contrib/libs/cctz/tzdata/generated/42fcd2bd28f14995f4fec31b081d88b0 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-10
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/42fcd2bd28f14995f4fec31b081d88b0
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-10
diff --git a/contrib/libs/cctz/tzdata/generated/ba0134eab8c956f482f642c6a5440ee0 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-11
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ba0134eab8c956f482f642c6a5440ee0
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-11
diff --git a/contrib/libs/cctz/tzdata/generated/f669833977d5968e30ce9d8288dccd22 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-12
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f669833977d5968e30ce9d8288dccd22
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-12
diff --git a/contrib/libs/cctz/tzdata/generated/7176177837995c39668c29a4a459cb55 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-13
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7176177837995c39668c29a4a459cb55
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-13
diff --git a/contrib/libs/cctz/tzdata/generated/39ffa0df7491f260ed87949d60aa34da b/contrib/libs/cctz/tzdata/generated/Etc/GMT-14
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/39ffa0df7491f260ed87949d60aa34da
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-14
diff --git a/contrib/libs/cctz/tzdata/generated/f72cea14be81564422856a5e3633b0f0 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-2
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f72cea14be81564422856a5e3633b0f0
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-2
diff --git a/contrib/libs/cctz/tzdata/generated/6af1f235706f2c48a99cabb1efcd0e53 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-3
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/6af1f235706f2c48a99cabb1efcd0e53
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-3
diff --git a/contrib/libs/cctz/tzdata/generated/dced2b01cc7c29f0b1adf9c62f8603fd b/contrib/libs/cctz/tzdata/generated/Etc/GMT-4
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dced2b01cc7c29f0b1adf9c62f8603fd
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-4
diff --git a/contrib/libs/cctz/tzdata/generated/167b215e24978122218b1a0eec97ea7a b/contrib/libs/cctz/tzdata/generated/Etc/GMT-5
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/167b215e24978122218b1a0eec97ea7a
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-5
diff --git a/contrib/libs/cctz/tzdata/generated/43d37a94ef2f6ee11c55e0a14c2898cb b/contrib/libs/cctz/tzdata/generated/Etc/GMT-6
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/43d37a94ef2f6ee11c55e0a14c2898cb
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-6
diff --git a/contrib/libs/cctz/tzdata/generated/ade2a36e23a06174c36b6fd5d795e865 b/contrib/libs/cctz/tzdata/generated/Etc/GMT-7
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ade2a36e23a06174c36b6fd5d795e865
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-7
diff --git a/contrib/libs/cctz/tzdata/generated/8e7f6cfc11d44c8e29f7f4a59df5fcae b/contrib/libs/cctz/tzdata/generated/Etc/GMT-8
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8e7f6cfc11d44c8e29f7f4a59df5fcae
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-8
diff --git a/contrib/libs/cctz/tzdata/generated/ccc5a76bcf9b46bc41f3ffb232850bbb b/contrib/libs/cctz/tzdata/generated/Etc/GMT-9
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ccc5a76bcf9b46bc41f3ffb232850bbb
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT-9
diff --git a/contrib/libs/cctz/tzdata/generated/a813cd94645ca8774632d328080f8d97 b/contrib/libs/cctz/tzdata/generated/Etc/GMT0
similarity index 57%
rename from contrib/libs/cctz/tzdata/generated/a813cd94645ca8774632d328080f8d97
rename to contrib/libs/cctz/tzdata/generated/Etc/GMT0
index 160a53e045c8..157573b1d340 100644
Binary files a/contrib/libs/cctz/tzdata/generated/a813cd94645ca8774632d328080f8d97 and b/contrib/libs/cctz/tzdata/generated/Etc/GMT0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/Etc/Greenwich b/contrib/libs/cctz/tzdata/generated/Etc/Greenwich
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Etc/Greenwich differ
diff --git a/contrib/libs/cctz/tzdata/generated/51d8a0e68892ebf0854a1b4250ffb26b b/contrib/libs/cctz/tzdata/generated/Etc/UCT
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/51d8a0e68892ebf0854a1b4250ffb26b
rename to contrib/libs/cctz/tzdata/generated/Etc/UCT
diff --git a/contrib/libs/cctz/tzdata/generated/Etc/UTC b/contrib/libs/cctz/tzdata/generated/Etc/UTC
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Etc/UTC differ
diff --git a/contrib/libs/cctz/tzdata/generated/Etc/Universal b/contrib/libs/cctz/tzdata/generated/Etc/Universal
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Etc/Universal differ
diff --git a/contrib/libs/cctz/tzdata/generated/Etc/Zulu b/contrib/libs/cctz/tzdata/generated/Etc/Zulu
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Etc/Zulu differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Amsterdam b/contrib/libs/cctz/tzdata/generated/Europe/Amsterdam
new file mode 100644
index 000000000000..31973271d2f8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Amsterdam differ
diff --git a/contrib/libs/cctz/tzdata/generated/89cb42bccb29740b74d74dad225a7f70 b/contrib/libs/cctz/tzdata/generated/Europe/Andorra
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/89cb42bccb29740b74d74dad225a7f70
rename to contrib/libs/cctz/tzdata/generated/Europe/Andorra
diff --git a/contrib/libs/cctz/tzdata/generated/29067b92c3481871788d16e05841ce78 b/contrib/libs/cctz/tzdata/generated/Europe/Astrakhan
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/29067b92c3481871788d16e05841ce78
rename to contrib/libs/cctz/tzdata/generated/Europe/Astrakhan
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Athens b/contrib/libs/cctz/tzdata/generated/Europe/Athens
new file mode 100644
index 000000000000..231bf9c3b713
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Athens differ
diff --git a/contrib/libs/cctz/tzdata/generated/d111147703d04769072d1b824d0ddc0c b/contrib/libs/cctz/tzdata/generated/Europe/Belfast
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d111147703d04769072d1b824d0ddc0c
rename to contrib/libs/cctz/tzdata/generated/Europe/Belfast
diff --git a/contrib/libs/cctz/tzdata/generated/a4ac1780d547f4e4c41cab4c6cf1d76d b/contrib/libs/cctz/tzdata/generated/Europe/Belgrade
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a4ac1780d547f4e4c41cab4c6cf1d76d
rename to contrib/libs/cctz/tzdata/generated/Europe/Belgrade
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Berlin b/contrib/libs/cctz/tzdata/generated/Europe/Berlin
new file mode 100644
index 000000000000..465546bd396a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Berlin differ
diff --git a/contrib/libs/cctz/tzdata/generated/9ac4de9fb3bcae616f7de40984ccb6b2 b/contrib/libs/cctz/tzdata/generated/Europe/Bratislava
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/9ac4de9fb3bcae616f7de40984ccb6b2
rename to contrib/libs/cctz/tzdata/generated/Europe/Bratislava
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Brussels b/contrib/libs/cctz/tzdata/generated/Europe/Brussels
new file mode 100644
index 000000000000..31973271d2f8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Brussels differ
diff --git a/contrib/libs/cctz/tzdata/generated/c6c2b3eb822cbc1acd02af84c3f9b702 b/contrib/libs/cctz/tzdata/generated/Europe/Bucharest
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c6c2b3eb822cbc1acd02af84c3f9b702
rename to contrib/libs/cctz/tzdata/generated/Europe/Bucharest
diff --git a/contrib/libs/cctz/tzdata/generated/0b00b9da0d4f68857bdebb750ea28c4d b/contrib/libs/cctz/tzdata/generated/Europe/Budapest
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0b00b9da0d4f68857bdebb750ea28c4d
rename to contrib/libs/cctz/tzdata/generated/Europe/Budapest
diff --git a/contrib/libs/cctz/tzdata/generated/07b0081174b26fd15187b9d6a019e322 b/contrib/libs/cctz/tzdata/generated/Europe/Busingen
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/07b0081174b26fd15187b9d6a019e322
rename to contrib/libs/cctz/tzdata/generated/Europe/Busingen
diff --git a/contrib/libs/cctz/tzdata/generated/bdcf406109db9b568f585ccd3b82b045 b/contrib/libs/cctz/tzdata/generated/Europe/Chisinau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/bdcf406109db9b568f585ccd3b82b045
rename to contrib/libs/cctz/tzdata/generated/Europe/Chisinau
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Copenhagen b/contrib/libs/cctz/tzdata/generated/Europe/Copenhagen
new file mode 100644
index 000000000000..465546bd396a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Copenhagen differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Dublin b/contrib/libs/cctz/tzdata/generated/Europe/Dublin
new file mode 100644
index 000000000000..17d2b1582df8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Dublin differ
diff --git a/contrib/libs/cctz/tzdata/generated/8629c4ecded1abb6072c099aa6781c47 b/contrib/libs/cctz/tzdata/generated/Europe/Gibraltar
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8629c4ecded1abb6072c099aa6781c47
rename to contrib/libs/cctz/tzdata/generated/Europe/Gibraltar
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Guernsey b/contrib/libs/cctz/tzdata/generated/Europe/Guernsey
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Guernsey differ
diff --git a/contrib/libs/cctz/tzdata/generated/aecc05607e312ffdbdf3a8f07ac64a6b b/contrib/libs/cctz/tzdata/generated/Europe/Helsinki
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/aecc05607e312ffdbdf3a8f07ac64a6b
rename to contrib/libs/cctz/tzdata/generated/Europe/Helsinki
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Isle_of_Man b/contrib/libs/cctz/tzdata/generated/Europe/Isle_of_Man
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Isle_of_Man differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Istanbul b/contrib/libs/cctz/tzdata/generated/Europe/Istanbul
new file mode 100644
index 000000000000..c89186687300
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Istanbul differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Jersey b/contrib/libs/cctz/tzdata/generated/Europe/Jersey
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Jersey differ
diff --git a/contrib/libs/cctz/tzdata/generated/e019dabd72a8783f7d4b4c1fe3dd5c11 b/contrib/libs/cctz/tzdata/generated/Europe/Kaliningrad
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e019dabd72a8783f7d4b4c1fe3dd5c11
rename to contrib/libs/cctz/tzdata/generated/Europe/Kaliningrad
diff --git a/contrib/libs/cctz/tzdata/generated/f2dfc019c4f320ae616a51ab406e8c70 b/contrib/libs/cctz/tzdata/generated/Europe/Kiev
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f2dfc019c4f320ae616a51ab406e8c70
rename to contrib/libs/cctz/tzdata/generated/Europe/Kiev
diff --git a/contrib/libs/cctz/tzdata/generated/dd8da7d587e8614c215c9654fa7fe566 b/contrib/libs/cctz/tzdata/generated/Europe/Kirov
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/dd8da7d587e8614c215c9654fa7fe566
rename to contrib/libs/cctz/tzdata/generated/Europe/Kirov
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Kyiv b/contrib/libs/cctz/tzdata/generated/Europe/Kyiv
new file mode 100644
index 000000000000..753a6c86f385
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Kyiv differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Lisbon b/contrib/libs/cctz/tzdata/generated/Europe/Lisbon
new file mode 100644
index 000000000000..7e9aae727b2b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Lisbon differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Ljubljana b/contrib/libs/cctz/tzdata/generated/Europe/Ljubljana
new file mode 100644
index 000000000000..a1bf9281ed1b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Ljubljana differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/London b/contrib/libs/cctz/tzdata/generated/Europe/London
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/London differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Luxembourg b/contrib/libs/cctz/tzdata/generated/Europe/Luxembourg
new file mode 100644
index 000000000000..31973271d2f8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Luxembourg differ
diff --git a/contrib/libs/cctz/tzdata/generated/1377f55949e2a3c4cf3ccc96bb5a91a5 b/contrib/libs/cctz/tzdata/generated/Europe/Madrid
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1377f55949e2a3c4cf3ccc96bb5a91a5
rename to contrib/libs/cctz/tzdata/generated/Europe/Madrid
diff --git a/contrib/libs/cctz/tzdata/generated/1fd961b54d21dd2ad91b05c7c71435a8 b/contrib/libs/cctz/tzdata/generated/Europe/Malta
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1fd961b54d21dd2ad91b05c7c71435a8
rename to contrib/libs/cctz/tzdata/generated/Europe/Malta
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Mariehamn b/contrib/libs/cctz/tzdata/generated/Europe/Mariehamn
new file mode 100644
index 000000000000..ff5e56530570
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Mariehamn differ
diff --git a/contrib/libs/cctz/tzdata/generated/aed64fc971bc7aa23cab042415d57d53 b/contrib/libs/cctz/tzdata/generated/Europe/Minsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/aed64fc971bc7aa23cab042415d57d53
rename to contrib/libs/cctz/tzdata/generated/Europe/Minsk
diff --git a/contrib/libs/cctz/tzdata/generated/506e99f9c797d9798e7a411495691504 b/contrib/libs/cctz/tzdata/generated/Europe/Monaco
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/506e99f9c797d9798e7a411495691504
rename to contrib/libs/cctz/tzdata/generated/Europe/Monaco
diff --git a/contrib/libs/cctz/tzdata/generated/39b47bf37a27f7bcd5d3f7c51343c7fc b/contrib/libs/cctz/tzdata/generated/Europe/Moscow
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/39b47bf37a27f7bcd5d3f7c51343c7fc
rename to contrib/libs/cctz/tzdata/generated/Europe/Moscow
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Nicosia b/contrib/libs/cctz/tzdata/generated/Europe/Nicosia
new file mode 100644
index 000000000000..390347f442a4
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Nicosia differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Oslo b/contrib/libs/cctz/tzdata/generated/Europe/Oslo
new file mode 100644
index 000000000000..465546bd396a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Oslo differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Paris b/contrib/libs/cctz/tzdata/generated/Europe/Paris
new file mode 100644
index 000000000000..00a27264c2cb
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Paris differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Podgorica b/contrib/libs/cctz/tzdata/generated/Europe/Podgorica
new file mode 100644
index 000000000000..a1bf9281ed1b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Podgorica differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Prague b/contrib/libs/cctz/tzdata/generated/Europe/Prague
new file mode 100644
index 000000000000..fb7c145ac4c8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Prague differ
diff --git a/contrib/libs/cctz/tzdata/generated/5462443637d5f64dec33b537afb06863 b/contrib/libs/cctz/tzdata/generated/Europe/Riga
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5462443637d5f64dec33b537afb06863
rename to contrib/libs/cctz/tzdata/generated/Europe/Riga
diff --git a/contrib/libs/cctz/tzdata/generated/c57843caa48aa4715344a26830df1f13 b/contrib/libs/cctz/tzdata/generated/Europe/Rome
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c57843caa48aa4715344a26830df1f13
rename to contrib/libs/cctz/tzdata/generated/Europe/Rome
diff --git a/contrib/libs/cctz/tzdata/generated/8baab5c53cf4270f860fb2de701ded9d b/contrib/libs/cctz/tzdata/generated/Europe/Samara
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8baab5c53cf4270f860fb2de701ded9d
rename to contrib/libs/cctz/tzdata/generated/Europe/Samara
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/San_Marino b/contrib/libs/cctz/tzdata/generated/Europe/San_Marino
new file mode 100644
index 000000000000..639ca3be4062
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/San_Marino differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Sarajevo b/contrib/libs/cctz/tzdata/generated/Europe/Sarajevo
new file mode 100644
index 000000000000..a1bf9281ed1b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Sarajevo differ
diff --git a/contrib/libs/cctz/tzdata/generated/c4aa97ffb42eeeb70479979e2050d866 b/contrib/libs/cctz/tzdata/generated/Europe/Saratov
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/c4aa97ffb42eeeb70479979e2050d866
rename to contrib/libs/cctz/tzdata/generated/Europe/Saratov
diff --git a/contrib/libs/cctz/tzdata/generated/3465e5d0858d49481e9bcfea787d1be7 b/contrib/libs/cctz/tzdata/generated/Europe/Simferopol
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/3465e5d0858d49481e9bcfea787d1be7
rename to contrib/libs/cctz/tzdata/generated/Europe/Simferopol
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Skopje b/contrib/libs/cctz/tzdata/generated/Europe/Skopje
new file mode 100644
index 000000000000..a1bf9281ed1b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Skopje differ
diff --git a/contrib/libs/cctz/tzdata/generated/1fa22f3b099ee00c828b0902991ed179 b/contrib/libs/cctz/tzdata/generated/Europe/Sofia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1fa22f3b099ee00c828b0902991ed179
rename to contrib/libs/cctz/tzdata/generated/Europe/Sofia
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Stockholm b/contrib/libs/cctz/tzdata/generated/Europe/Stockholm
new file mode 100644
index 000000000000..465546bd396a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Stockholm differ
diff --git a/contrib/libs/cctz/tzdata/generated/73c8ea0a371b9e73efd5a269509580c5 b/contrib/libs/cctz/tzdata/generated/Europe/Tallinn
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/73c8ea0a371b9e73efd5a269509580c5
rename to contrib/libs/cctz/tzdata/generated/Europe/Tallinn
diff --git a/contrib/libs/cctz/tzdata/generated/e9faa2fda4c9671e5002bf470313be76 b/contrib/libs/cctz/tzdata/generated/Europe/Tirane
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e9faa2fda4c9671e5002bf470313be76
rename to contrib/libs/cctz/tzdata/generated/Europe/Tirane
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Tiraspol b/contrib/libs/cctz/tzdata/generated/Europe/Tiraspol
new file mode 100644
index 000000000000..9152e68594bb
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Tiraspol differ
diff --git a/contrib/libs/cctz/tzdata/generated/0dfaf73a64a7c3cfcd10756a6d545e08 b/contrib/libs/cctz/tzdata/generated/Europe/Ulyanovsk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0dfaf73a64a7c3cfcd10756a6d545e08
rename to contrib/libs/cctz/tzdata/generated/Europe/Ulyanovsk
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Uzhgorod b/contrib/libs/cctz/tzdata/generated/Europe/Uzhgorod
new file mode 100644
index 000000000000..753a6c86f385
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Uzhgorod differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Vaduz b/contrib/libs/cctz/tzdata/generated/Europe/Vaduz
new file mode 100644
index 000000000000..388df2969f2d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Vaduz differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Vatican b/contrib/libs/cctz/tzdata/generated/Europe/Vatican
new file mode 100644
index 000000000000..639ca3be4062
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Vatican differ
diff --git a/contrib/libs/cctz/tzdata/generated/fe03dcb43031a0d45d0039e33f1e4c42 b/contrib/libs/cctz/tzdata/generated/Europe/Vienna
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fe03dcb43031a0d45d0039e33f1e4c42
rename to contrib/libs/cctz/tzdata/generated/Europe/Vienna
diff --git a/contrib/libs/cctz/tzdata/generated/01293608aae8489ba88d54dea661c996 b/contrib/libs/cctz/tzdata/generated/Europe/Vilnius
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/01293608aae8489ba88d54dea661c996
rename to contrib/libs/cctz/tzdata/generated/Europe/Vilnius
diff --git a/contrib/libs/cctz/tzdata/generated/741c357f646af80fcc1cc2953af0e991 b/contrib/libs/cctz/tzdata/generated/Europe/Volgograd
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/741c357f646af80fcc1cc2953af0e991
rename to contrib/libs/cctz/tzdata/generated/Europe/Volgograd
diff --git a/contrib/libs/cctz/tzdata/generated/d44a4791346a5defc84c6bec9e52645d b/contrib/libs/cctz/tzdata/generated/Europe/Warsaw
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d44a4791346a5defc84c6bec9e52645d
rename to contrib/libs/cctz/tzdata/generated/Europe/Warsaw
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Zagreb b/contrib/libs/cctz/tzdata/generated/Europe/Zagreb
new file mode 100644
index 000000000000..a1bf9281ed1b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Zagreb differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Zaporozhye b/contrib/libs/cctz/tzdata/generated/Europe/Zaporozhye
new file mode 100644
index 000000000000..753a6c86f385
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Zaporozhye differ
diff --git a/contrib/libs/cctz/tzdata/generated/Europe/Zurich b/contrib/libs/cctz/tzdata/generated/Europe/Zurich
new file mode 100644
index 000000000000..388df2969f2d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Europe/Zurich differ
diff --git a/contrib/libs/cctz/tzdata/generated/e369eb23db7f75930ece7bf91b6b86a7 b/contrib/libs/cctz/tzdata/generated/Factory
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/e369eb23db7f75930ece7bf91b6b86a7
rename to contrib/libs/cctz/tzdata/generated/Factory
diff --git a/contrib/libs/cctz/tzdata/generated/GB b/contrib/libs/cctz/tzdata/generated/GB
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GB differ
diff --git a/contrib/libs/cctz/tzdata/generated/GB-Eire b/contrib/libs/cctz/tzdata/generated/GB-Eire
new file mode 100644
index 000000000000..b9e95d92623c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GB-Eire differ
diff --git a/contrib/libs/cctz/tzdata/generated/GMT b/contrib/libs/cctz/tzdata/generated/GMT
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GMT differ
diff --git a/contrib/libs/cctz/tzdata/generated/GMT+0 b/contrib/libs/cctz/tzdata/generated/GMT+0
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GMT+0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/GMT-0 b/contrib/libs/cctz/tzdata/generated/GMT-0
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GMT-0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/GMT0 b/contrib/libs/cctz/tzdata/generated/GMT0
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/GMT0 differ
diff --git a/contrib/libs/cctz/tzdata/generated/Greenwich b/contrib/libs/cctz/tzdata/generated/Greenwich
new file mode 100644
index 000000000000..157573b1d340
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Greenwich differ
diff --git a/contrib/libs/cctz/tzdata/generated/5ed332a521639d91536739cfb9e4dde6 b/contrib/libs/cctz/tzdata/generated/HST
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5ed332a521639d91536739cfb9e4dde6
rename to contrib/libs/cctz/tzdata/generated/HST
diff --git a/contrib/libs/cctz/tzdata/generated/Hongkong b/contrib/libs/cctz/tzdata/generated/Hongkong
new file mode 100644
index 000000000000..c80e364801be
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Hongkong differ
diff --git a/contrib/libs/cctz/tzdata/generated/Iceland b/contrib/libs/cctz/tzdata/generated/Iceland
new file mode 100644
index 000000000000..8906e88c819d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Iceland differ
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Antananarivo b/contrib/libs/cctz/tzdata/generated/Indian/Antananarivo
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Antananarivo differ
diff --git a/contrib/libs/cctz/tzdata/generated/f3ac587344d641763d27895afbe16345 b/contrib/libs/cctz/tzdata/generated/Indian/Chagos
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f3ac587344d641763d27895afbe16345
rename to contrib/libs/cctz/tzdata/generated/Indian/Chagos
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Christmas b/contrib/libs/cctz/tzdata/generated/Indian/Christmas
new file mode 100644
index 000000000000..ed687d2985c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Christmas differ
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Cocos b/contrib/libs/cctz/tzdata/generated/Indian/Cocos
new file mode 100644
index 000000000000..14b2ad09ead5
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Cocos differ
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Comoro b/contrib/libs/cctz/tzdata/generated/Indian/Comoro
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Comoro differ
diff --git a/contrib/libs/cctz/tzdata/generated/5d62b2758da6d68cb971d8f2cf64d432 b/contrib/libs/cctz/tzdata/generated/Indian/Kerguelen
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5d62b2758da6d68cb971d8f2cf64d432
rename to contrib/libs/cctz/tzdata/generated/Indian/Kerguelen
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Mahe b/contrib/libs/cctz/tzdata/generated/Indian/Mahe
new file mode 100644
index 000000000000..58d75bc26eec
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Mahe differ
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Maldives b/contrib/libs/cctz/tzdata/generated/Indian/Maldives
new file mode 100644
index 000000000000..58a82e4eb701
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Maldives differ
diff --git a/contrib/libs/cctz/tzdata/generated/cea8767711bc79a4ec192e25706de5a5 b/contrib/libs/cctz/tzdata/generated/Indian/Mauritius
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/cea8767711bc79a4ec192e25706de5a5
rename to contrib/libs/cctz/tzdata/generated/Indian/Mauritius
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Mayotte b/contrib/libs/cctz/tzdata/generated/Indian/Mayotte
new file mode 100644
index 000000000000..5f4ebcb7f978
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Mayotte differ
diff --git a/contrib/libs/cctz/tzdata/generated/Indian/Reunion b/contrib/libs/cctz/tzdata/generated/Indian/Reunion
new file mode 100644
index 000000000000..58d75bc26eec
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Indian/Reunion differ
diff --git a/contrib/libs/cctz/tzdata/generated/Iran b/contrib/libs/cctz/tzdata/generated/Iran
new file mode 100644
index 000000000000..6fd31e075a29
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Iran differ
diff --git a/contrib/libs/cctz/tzdata/generated/Israel b/contrib/libs/cctz/tzdata/generated/Israel
new file mode 100644
index 000000000000..4c49bbf52440
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Israel differ
diff --git a/contrib/libs/cctz/tzdata/generated/Jamaica b/contrib/libs/cctz/tzdata/generated/Jamaica
new file mode 100644
index 000000000000..be6b1b6f1e77
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Jamaica differ
diff --git a/contrib/libs/cctz/tzdata/generated/Japan b/contrib/libs/cctz/tzdata/generated/Japan
new file mode 100644
index 000000000000..1aa066ce38fc
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Japan differ
diff --git a/contrib/libs/cctz/tzdata/generated/475a8ae9a30287527356f20d4456abd4 b/contrib/libs/cctz/tzdata/generated/Kwajalein
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/475a8ae9a30287527356f20d4456abd4
rename to contrib/libs/cctz/tzdata/generated/Kwajalein
diff --git a/contrib/libs/cctz/tzdata/generated/Libya b/contrib/libs/cctz/tzdata/generated/Libya
new file mode 100644
index 000000000000..e0c89971aabe
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Libya differ
diff --git a/contrib/libs/cctz/tzdata/generated/MET b/contrib/libs/cctz/tzdata/generated/MET
new file mode 100644
index 000000000000..31973271d2f8
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/MET differ
diff --git a/contrib/libs/cctz/tzdata/generated/MST b/contrib/libs/cctz/tzdata/generated/MST
new file mode 100644
index 000000000000..c2bd2f949b24
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/MST differ
diff --git a/contrib/libs/cctz/tzdata/generated/MST7MDT b/contrib/libs/cctz/tzdata/generated/MST7MDT
new file mode 100644
index 000000000000..09e54e5c7c5b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/MST7MDT differ
diff --git a/contrib/libs/cctz/tzdata/generated/Mexico/BajaNorte b/contrib/libs/cctz/tzdata/generated/Mexico/BajaNorte
new file mode 100644
index 000000000000..18d0d14afc1c
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Mexico/BajaNorte differ
diff --git a/contrib/libs/cctz/tzdata/generated/Mexico/BajaSur b/contrib/libs/cctz/tzdata/generated/Mexico/BajaSur
new file mode 100644
index 000000000000..5aa6039ea4cb
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Mexico/BajaSur differ
diff --git a/contrib/libs/cctz/tzdata/generated/Mexico/General b/contrib/libs/cctz/tzdata/generated/Mexico/General
new file mode 100644
index 000000000000..18112346129a
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Mexico/General differ
diff --git a/contrib/libs/cctz/tzdata/generated/NZ b/contrib/libs/cctz/tzdata/generated/NZ
new file mode 100644
index 000000000000..afb392931847
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/NZ differ
diff --git a/contrib/libs/cctz/tzdata/generated/41dd4c2678c8776c4abdcc809932bbe7 b/contrib/libs/cctz/tzdata/generated/NZ-CHAT
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/41dd4c2678c8776c4abdcc809932bbe7
rename to contrib/libs/cctz/tzdata/generated/NZ-CHAT
diff --git a/contrib/libs/cctz/tzdata/generated/Navajo b/contrib/libs/cctz/tzdata/generated/Navajo
new file mode 100644
index 000000000000..09e54e5c7c5b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Navajo differ
diff --git a/contrib/libs/cctz/tzdata/generated/PRC b/contrib/libs/cctz/tzdata/generated/PRC
new file mode 100644
index 000000000000..d6b66984a2f3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/PRC differ
diff --git a/contrib/libs/cctz/tzdata/generated/PST8PDT b/contrib/libs/cctz/tzdata/generated/PST8PDT
new file mode 100644
index 000000000000..aaf07787ad92
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/PST8PDT differ
diff --git a/contrib/libs/cctz/tzdata/generated/fa334faf4eac0c30d0a20353b78f1685 b/contrib/libs/cctz/tzdata/generated/Pacific/Apia
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fa334faf4eac0c30d0a20353b78f1685
rename to contrib/libs/cctz/tzdata/generated/Pacific/Apia
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Auckland b/contrib/libs/cctz/tzdata/generated/Pacific/Auckland
new file mode 100644
index 000000000000..afb392931847
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Auckland differ
diff --git a/contrib/libs/cctz/tzdata/generated/d8977a620cda17fb8da4421e6c474f0c b/contrib/libs/cctz/tzdata/generated/Pacific/Bougainville
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/d8977a620cda17fb8da4421e6c474f0c
rename to contrib/libs/cctz/tzdata/generated/Pacific/Bougainville
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Chatham b/contrib/libs/cctz/tzdata/generated/Pacific/Chatham
new file mode 100644
index 000000000000..f06065ebd183
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Chatham differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Chuuk b/contrib/libs/cctz/tzdata/generated/Pacific/Chuuk
new file mode 100644
index 000000000000..5d8fc3a1b253
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Chuuk differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Easter b/contrib/libs/cctz/tzdata/generated/Pacific/Easter
new file mode 100644
index 000000000000..54dff005b876
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Easter differ
diff --git a/contrib/libs/cctz/tzdata/generated/4cddbf0831a9bbaa79369d3b91961a8f b/contrib/libs/cctz/tzdata/generated/Pacific/Efate
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/4cddbf0831a9bbaa79369d3b91961a8f
rename to contrib/libs/cctz/tzdata/generated/Pacific/Efate
diff --git a/contrib/libs/cctz/tzdata/generated/99cc3c716bf45f1ae5bb572baa4ad256 b/contrib/libs/cctz/tzdata/generated/Pacific/Enderbury
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/99cc3c716bf45f1ae5bb572baa4ad256
rename to contrib/libs/cctz/tzdata/generated/Pacific/Enderbury
diff --git a/contrib/libs/cctz/tzdata/generated/afaa4c77a1e912306f4ca578c933d4a6 b/contrib/libs/cctz/tzdata/generated/Pacific/Fakaofo
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/afaa4c77a1e912306f4ca578c933d4a6
rename to contrib/libs/cctz/tzdata/generated/Pacific/Fakaofo
diff --git a/contrib/libs/cctz/tzdata/generated/a92ef316c0c20b37f585aa00209c65cf b/contrib/libs/cctz/tzdata/generated/Pacific/Fiji
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/a92ef316c0c20b37f585aa00209c65cf
rename to contrib/libs/cctz/tzdata/generated/Pacific/Fiji
diff --git a/contrib/libs/cctz/tzdata/generated/ba8d62a6ed66f462087e00ad76f7354d b/contrib/libs/cctz/tzdata/generated/Pacific/Funafuti
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ba8d62a6ed66f462087e00ad76f7354d
rename to contrib/libs/cctz/tzdata/generated/Pacific/Funafuti
diff --git a/contrib/libs/cctz/tzdata/generated/055c3628d78f3c9a01a7732c442f78f9 b/contrib/libs/cctz/tzdata/generated/Pacific/Galapagos
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/055c3628d78f3c9a01a7732c442f78f9
rename to contrib/libs/cctz/tzdata/generated/Pacific/Galapagos
diff --git a/contrib/libs/cctz/tzdata/generated/f4cf94e44810f7c25b2529ffe37ab772 b/contrib/libs/cctz/tzdata/generated/Pacific/Gambier
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f4cf94e44810f7c25b2529ffe37ab772
rename to contrib/libs/cctz/tzdata/generated/Pacific/Gambier
diff --git a/contrib/libs/cctz/tzdata/generated/44355d47052f97ac7388446bce23e3ab b/contrib/libs/cctz/tzdata/generated/Pacific/Guadalcanal
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/44355d47052f97ac7388446bce23e3ab
rename to contrib/libs/cctz/tzdata/generated/Pacific/Guadalcanal
diff --git a/contrib/libs/cctz/tzdata/generated/ec185892bb2764a8280ee41ff8f2b032 b/contrib/libs/cctz/tzdata/generated/Pacific/Guam
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/ec185892bb2764a8280ee41ff8f2b032
rename to contrib/libs/cctz/tzdata/generated/Pacific/Guam
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Honolulu b/contrib/libs/cctz/tzdata/generated/Pacific/Honolulu
new file mode 100644
index 000000000000..40e3d492e6c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Honolulu differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Johnston b/contrib/libs/cctz/tzdata/generated/Pacific/Johnston
new file mode 100644
index 000000000000..40e3d492e6c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Johnston differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Kanton b/contrib/libs/cctz/tzdata/generated/Pacific/Kanton
new file mode 100644
index 000000000000..2b6a06088ef6
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Kanton differ
diff --git a/contrib/libs/cctz/tzdata/generated/1530b1e45e83ed3f4e61d1a6f2f4f706 b/contrib/libs/cctz/tzdata/generated/Pacific/Kiritimati
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/1530b1e45e83ed3f4e61d1a6f2f4f706
rename to contrib/libs/cctz/tzdata/generated/Pacific/Kiritimati
diff --git a/contrib/libs/cctz/tzdata/generated/fb8a999658da8686edc727548949fd88 b/contrib/libs/cctz/tzdata/generated/Pacific/Kosrae
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fb8a999658da8686edc727548949fd88
rename to contrib/libs/cctz/tzdata/generated/Pacific/Kosrae
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Kwajalein b/contrib/libs/cctz/tzdata/generated/Pacific/Kwajalein
new file mode 100644
index 000000000000..9416d522d0a3
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Kwajalein differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Majuro b/contrib/libs/cctz/tzdata/generated/Pacific/Majuro
new file mode 100644
index 000000000000..6bc216823e00
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Majuro differ
diff --git a/contrib/libs/cctz/tzdata/generated/82b091bd4358c77e600c08893560419b b/contrib/libs/cctz/tzdata/generated/Pacific/Marquesas
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/82b091bd4358c77e600c08893560419b
rename to contrib/libs/cctz/tzdata/generated/Pacific/Marquesas
diff --git a/contrib/libs/cctz/tzdata/generated/f789c65f289caa627ea1f690836c48f6 b/contrib/libs/cctz/tzdata/generated/Pacific/Midway
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/f789c65f289caa627ea1f690836c48f6
rename to contrib/libs/cctz/tzdata/generated/Pacific/Midway
diff --git a/contrib/libs/cctz/tzdata/generated/fa85e90a2dcd44ced6128397a99b2668 b/contrib/libs/cctz/tzdata/generated/Pacific/Nauru
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/fa85e90a2dcd44ced6128397a99b2668
rename to contrib/libs/cctz/tzdata/generated/Pacific/Nauru
diff --git a/contrib/libs/cctz/tzdata/generated/92ab841a2a7aa104cb62a09be6f1a232 b/contrib/libs/cctz/tzdata/generated/Pacific/Niue
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/92ab841a2a7aa104cb62a09be6f1a232
rename to contrib/libs/cctz/tzdata/generated/Pacific/Niue
diff --git a/contrib/libs/cctz/tzdata/generated/85ee119f6640a16fe650874106f53792 b/contrib/libs/cctz/tzdata/generated/Pacific/Norfolk
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/85ee119f6640a16fe650874106f53792
rename to contrib/libs/cctz/tzdata/generated/Pacific/Norfolk
diff --git a/contrib/libs/cctz/tzdata/generated/7f89369fd9501f16ae77919d4c0e5658 b/contrib/libs/cctz/tzdata/generated/Pacific/Noumea
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/7f89369fd9501f16ae77919d4c0e5658
rename to contrib/libs/cctz/tzdata/generated/Pacific/Noumea
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Pago_Pago b/contrib/libs/cctz/tzdata/generated/Pacific/Pago_Pago
new file mode 100644
index 000000000000..001289ceecff
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Pago_Pago differ
diff --git a/contrib/libs/cctz/tzdata/generated/8d2aeb9646f427ba69fab8ad34c51552 b/contrib/libs/cctz/tzdata/generated/Pacific/Palau
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/8d2aeb9646f427ba69fab8ad34c51552
rename to contrib/libs/cctz/tzdata/generated/Pacific/Palau
diff --git a/contrib/libs/cctz/tzdata/generated/acf014221290656a061fff7e9fa818ee b/contrib/libs/cctz/tzdata/generated/Pacific/Pitcairn
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/acf014221290656a061fff7e9fa818ee
rename to contrib/libs/cctz/tzdata/generated/Pacific/Pitcairn
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Pohnpei b/contrib/libs/cctz/tzdata/generated/Pacific/Pohnpei
new file mode 100644
index 000000000000..720c67901740
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Pohnpei differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Ponape b/contrib/libs/cctz/tzdata/generated/Pacific/Ponape
new file mode 100644
index 000000000000..720c67901740
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Ponape differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Port_Moresby b/contrib/libs/cctz/tzdata/generated/Pacific/Port_Moresby
new file mode 100644
index 000000000000..5d8fc3a1b253
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Port_Moresby differ
diff --git a/contrib/libs/cctz/tzdata/generated/5b3b7bd518d8afe48e97f141617c0531 b/contrib/libs/cctz/tzdata/generated/Pacific/Rarotonga
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/5b3b7bd518d8afe48e97f141617c0531
rename to contrib/libs/cctz/tzdata/generated/Pacific/Rarotonga
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Saipan b/contrib/libs/cctz/tzdata/generated/Pacific/Saipan
new file mode 100644
index 000000000000..bf9a2d955fc2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Saipan differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Samoa b/contrib/libs/cctz/tzdata/generated/Pacific/Samoa
new file mode 100644
index 000000000000..001289ceecff
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Samoa differ
diff --git a/contrib/libs/cctz/tzdata/generated/0672593cd4756dbfb8bba02b4555c91d b/contrib/libs/cctz/tzdata/generated/Pacific/Tahiti
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/0672593cd4756dbfb8bba02b4555c91d
rename to contrib/libs/cctz/tzdata/generated/Pacific/Tahiti
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Tarawa b/contrib/libs/cctz/tzdata/generated/Pacific/Tarawa
new file mode 100644
index 000000000000..6bc216823e00
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Tarawa differ
diff --git a/contrib/libs/cctz/tzdata/generated/460900dfed7410df3acffe5b811d0f02 b/contrib/libs/cctz/tzdata/generated/Pacific/Tongatapu
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/460900dfed7410df3acffe5b811d0f02
rename to contrib/libs/cctz/tzdata/generated/Pacific/Tongatapu
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Truk b/contrib/libs/cctz/tzdata/generated/Pacific/Truk
new file mode 100644
index 000000000000..5d8fc3a1b253
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Truk differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Wake b/contrib/libs/cctz/tzdata/generated/Pacific/Wake
new file mode 100644
index 000000000000..6bc216823e00
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Wake differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Wallis b/contrib/libs/cctz/tzdata/generated/Pacific/Wallis
new file mode 100644
index 000000000000..6bc216823e00
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Wallis differ
diff --git a/contrib/libs/cctz/tzdata/generated/Pacific/Yap b/contrib/libs/cctz/tzdata/generated/Pacific/Yap
new file mode 100644
index 000000000000..5d8fc3a1b253
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Pacific/Yap differ
diff --git a/contrib/libs/cctz/tzdata/generated/Poland b/contrib/libs/cctz/tzdata/generated/Poland
new file mode 100644
index 000000000000..efe1a40f2a8f
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Poland differ
diff --git a/contrib/libs/cctz/tzdata/generated/Portugal b/contrib/libs/cctz/tzdata/generated/Portugal
new file mode 100644
index 000000000000..7e9aae727b2b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Portugal differ
diff --git a/contrib/libs/cctz/tzdata/generated/ROC b/contrib/libs/cctz/tzdata/generated/ROC
new file mode 100644
index 000000000000..35d89d036d07
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/ROC differ
diff --git a/contrib/libs/cctz/tzdata/generated/ROK b/contrib/libs/cctz/tzdata/generated/ROK
new file mode 100644
index 000000000000..1755147fab44
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/ROK differ
diff --git a/contrib/libs/cctz/tzdata/generated/Singapore b/contrib/libs/cctz/tzdata/generated/Singapore
new file mode 100644
index 000000000000..dbbdea3c8149
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Singapore differ
diff --git a/contrib/libs/cctz/tzdata/generated/Turkey b/contrib/libs/cctz/tzdata/generated/Turkey
new file mode 100644
index 000000000000..c89186687300
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Turkey differ
diff --git a/contrib/libs/cctz/tzdata/generated/UCT b/contrib/libs/cctz/tzdata/generated/UCT
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/UCT differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Alaska b/contrib/libs/cctz/tzdata/generated/US/Alaska
new file mode 100644
index 000000000000..cdf0572be31d
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Alaska differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Aleutian b/contrib/libs/cctz/tzdata/generated/US/Aleutian
new file mode 100644
index 000000000000..b1497bda631e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Aleutian differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Arizona b/contrib/libs/cctz/tzdata/generated/US/Arizona
new file mode 100644
index 000000000000..c2bd2f949b24
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Arizona differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Central b/contrib/libs/cctz/tzdata/generated/US/Central
new file mode 100644
index 000000000000..b01688065392
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Central differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/East-Indiana b/contrib/libs/cctz/tzdata/generated/US/East-Indiana
new file mode 100644
index 000000000000..6b08d15bdaba
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/East-Indiana differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Eastern b/contrib/libs/cctz/tzdata/generated/US/Eastern
new file mode 100644
index 000000000000..2b6c2eea14df
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Eastern differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Hawaii b/contrib/libs/cctz/tzdata/generated/US/Hawaii
new file mode 100644
index 000000000000..40e3d492e6c2
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Hawaii differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Indiana-Starke b/contrib/libs/cctz/tzdata/generated/US/Indiana-Starke
new file mode 100644
index 000000000000..b187d5f8c756
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Indiana-Starke differ
diff --git a/contrib/libs/cctz/tzdata/generated/5fbedfd64bddc3ec7790a4eb0f22b66c b/contrib/libs/cctz/tzdata/generated/US/Michigan
similarity index 56%
rename from contrib/libs/cctz/tzdata/generated/5fbedfd64bddc3ec7790a4eb0f22b66c
rename to contrib/libs/cctz/tzdata/generated/US/Michigan
index 50c95e0cb076..6eb3ac46ec56 100644
Binary files a/contrib/libs/cctz/tzdata/generated/5fbedfd64bddc3ec7790a4eb0f22b66c and b/contrib/libs/cctz/tzdata/generated/US/Michigan differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Mountain b/contrib/libs/cctz/tzdata/generated/US/Mountain
new file mode 100644
index 000000000000..09e54e5c7c5b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Mountain differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Pacific b/contrib/libs/cctz/tzdata/generated/US/Pacific
new file mode 100644
index 000000000000..aaf07787ad92
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Pacific differ
diff --git a/contrib/libs/cctz/tzdata/generated/US/Samoa b/contrib/libs/cctz/tzdata/generated/US/Samoa
new file mode 100644
index 000000000000..001289ceecff
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/US/Samoa differ
diff --git a/contrib/libs/cctz/tzdata/generated/UTC b/contrib/libs/cctz/tzdata/generated/UTC
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/UTC differ
diff --git a/contrib/libs/cctz/tzdata/generated/Universal b/contrib/libs/cctz/tzdata/generated/Universal
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Universal differ
diff --git a/contrib/libs/cctz/tzdata/generated/W-SU b/contrib/libs/cctz/tzdata/generated/W-SU
new file mode 100644
index 000000000000..5e6b6de6451b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/W-SU differ
diff --git a/contrib/libs/cctz/tzdata/generated/WET b/contrib/libs/cctz/tzdata/generated/WET
new file mode 100644
index 000000000000..7e9aae727b2b
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/WET differ
diff --git a/contrib/libs/cctz/tzdata/generated/Zulu b/contrib/libs/cctz/tzdata/generated/Zulu
new file mode 100644
index 000000000000..00841a62213e
Binary files /dev/null and b/contrib/libs/cctz/tzdata/generated/Zulu differ
diff --git a/contrib/libs/cctz/tzdata/generated/bc1bca66f089c87648f0e54b0d0559a6 b/contrib/libs/cctz/tzdata/generated/bc1bca66f089c87648f0e54b0d0559a6
deleted file mode 100644
index a5822e2c626a..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/bc1bca66f089c87648f0e54b0d0559a6 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/e693fd65c9bc0b6bf05257d8ff5c4e81 b/contrib/libs/cctz/tzdata/generated/e693fd65c9bc0b6bf05257d8ff5c4e81
deleted file mode 100644
index 42087af4cceb..000000000000
Binary files a/contrib/libs/cctz/tzdata/generated/e693fd65c9bc0b6bf05257d8ff5c4e81 and /dev/null differ
diff --git a/contrib/libs/cctz/tzdata/generated/58543f30ac34b6510b552b9b3e82b772 b/contrib/libs/cctz/tzdata/generated/posixrules
similarity index 100%
rename from contrib/libs/cctz/tzdata/generated/58543f30ac34b6510b552b9b3e82b772
rename to contrib/libs/cctz/tzdata/generated/posixrules
diff --git a/contrib/libs/cctz/tzdata/update.py b/contrib/libs/cctz/tzdata/update.py
index aaf01a01afb0..e0f5208a189a 100755
--- a/contrib/libs/cctz/tzdata/update.py
+++ b/contrib/libs/cctz/tzdata/update.py
@@ -4,6 +4,7 @@
import hashlib
import io
import os
+import pathlib
import re
import shutil
import string
@@ -15,50 +16,22 @@
def create_cmakelists(zoneinfo_dir):
- tz_to_hash = {}
- hash_to_content = {}
- total_size = 0
- for dirpath, _, filenames in os.walk(zoneinfo_dir):
- for fn in filenames:
- tz_file_name = os.path.join(dirpath, fn)
- with open(tz_file_name, 'rb') as f:
- tz_content = f.read()
- if not tz_content.startswith(b'TZif'):
- continue
- tz_hash = hashlib.md5(tz_content).hexdigest()
- tz_name = tz_file_name.replace(zoneinfo_dir, '').lstrip('/')
- tz_to_hash[tz_name] = tz_hash
- hash_to_content[tz_hash] = tz_content
- total_size += len(tz_content)
- print('Total data size in bytes:', total_size)
-
- generated_dir = 'generated'
- if not os.path.isdir(generated_dir):
- os.mkdir(generated_dir)
- for tz_hash, tz_content in hash_to_content.items():
- with open(os.path.join(generated_dir, tz_hash), 'wb') as f:
- f.write(tz_content)
-
- yamake_template = (
- 'RESOURCE(\n'
- '{}\n'
- ')'
- )
- resources = '\n'.join(' generated/{} /cctz/tzdata/{}'.format(tz_hash, tz_name) for tz_name, tz_hash in sorted(tz_to_hash.items()))
-
- all_hashes = set(tz_to_hash.values())
- hash_pattern = os.path.join('generated', '[{}]'.format(string.hexdigits) * 32)
- for fn in glob.glob(hash_pattern):
- cmd = 'add' if os.path.basename(fn) in all_hashes else 'rm'
- subprocess.check_call(['arc', cmd, fn])
-
- with open('ya.make.resources', 'w') as f:
- print(yamake_template.format(resources), file=f)
+ zoneinfo_dir = pathlib.Path(zoneinfo_dir)
+ with open("ya.make.resources", "wt") as f:
+ all_files = []
+ for dir, _, files in zoneinfo_dir.walk():
+ all_files += [
+ (dir / file).relative_to(".")
+ for file in files
+ ]
+ f.write("RESOURCE(\n")
+ for file in sorted(all_files):
+ rel_path = file.relative_to(zoneinfo_dir)
+ f.write(f" {str(file): <40} /cctz/tzdata/{rel_path}\n")
+ f.write(")")
def get_latest_version():
- # Temporary here for the purposes of reimport
- return "2024a"
index_html = urllib.request.urlopen('http://www.iana.org/time-zones').read()
version_match = re.search('tzdata(.*).tar.gz', index_html.decode())
if not version_match:
@@ -66,21 +39,16 @@ def get_latest_version():
return version_match.group(1)
-def get_current_version():
- try:
- with open('VERSION') as f:
- return f.read()
- except:
- return 0
-
-
def prepare_tzdata(version):
temp_dir = "tmp"
shutil.rmtree(temp_dir, ignore_errors=True)
EXCLUDE = [
"iso3166.tab",
+ "leapseconds",
+ "tzdata.zi",
"zone.tab",
+ "zone1970.tab",
"zonenow.tab",
]
@@ -107,21 +75,22 @@ def prepare_tzdata(version):
# keep posixrules for now
shutil.copyfile(
- "generated/58543f30ac34b6510b552b9b3e82b772",
+ "generated/posixrules",
f"{temp_dir}/usr/share/zoneinfo/posixrules",
)
print('Preparing ya.make.resources')
- create_cmakelists(f"{temp_dir}/usr/share/zoneinfo")
+ shutil.rmtree("generated", ignore_errors=True)
+ os.rename(f"{temp_dir}/usr/share/zoneinfo", "generated")
+ create_cmakelists("generated")
finally:
shutil.rmtree(temp_dir)
def main():
- version_current = get_current_version()
- version_latest = get_latest_version()
- print(f'Updating from {version_current} to {version_latest}')
- prepare_tzdata(version_latest)
+ version = get_latest_version()
+ print(f'Importing tzdata {version}')
+ prepare_tzdata(version)
if __name__ == '__main__':
diff --git a/contrib/libs/cctz/tzdata/ya.make b/contrib/libs/cctz/tzdata/ya.make
index 681f98321a27..92ab4a843551 100644
--- a/contrib/libs/cctz/tzdata/ya.make
+++ b/contrib/libs/cctz/tzdata/ya.make
@@ -2,7 +2,7 @@ LIBRARY()
WITHOUT_LICENSE_TEXTS()
-VERSION(Service-proxy-version)
+VERSION(2025b)
LICENSE(Apache-2.0)
diff --git a/contrib/libs/cctz/tzdata/ya.make.resources b/contrib/libs/cctz/tzdata/ya.make.resources
index 9ba4ed82160d..9452f9e787f8 100644
--- a/contrib/libs/cctz/tzdata/ya.make.resources
+++ b/contrib/libs/cctz/tzdata/ya.make.resources
@@ -1,600 +1,601 @@
RESOURCE(
- generated/58543f30ac34b6510b552b9b3e82b772 /cctz/tzdata/posixrules
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Abidjan
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Accra
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Addis_Ababa
- generated/da87d45f88e4684903d7dbb5b7ed08dc /cctz/tzdata/Africa/Algiers
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Asmara
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Asmera
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Bamako
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Bangui
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Banjul
- generated/767406f25e6c1c5396e19a3be033304b /cctz/tzdata/Africa/Bissau
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Blantyre
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Brazzaville
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Bujumbura
- generated/8dcab26c06fc82939d77511b0c7c24b2 /cctz/tzdata/Africa/Cairo
- generated/12de6e9419a748db0e69972d23a640c2 /cctz/tzdata/Africa/Casablanca
- generated/00636062cbcd94f2ead5a75cc197675a /cctz/tzdata/Africa/Ceuta
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Conakry
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Dakar
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Dar_es_Salaam
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Djibouti
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Douala
- generated/8ba86418f34ed83656d38bcfb19f85ea /cctz/tzdata/Africa/El_Aaiun
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Freetown
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Gaborone
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Harare
- generated/a46a56e63a69fd5c5373a33203250d39 /cctz/tzdata/Africa/Johannesburg
- generated/c263ea3cac3cd3410ac15d96040c3b3c /cctz/tzdata/Africa/Juba
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Kampala
- generated/d00638c4bf95fabcc0c651f13e32e253 /cctz/tzdata/Africa/Khartoum
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Kigali
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Kinshasa
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Lagos
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Libreville
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Lome
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Luanda
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Lubumbashi
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Lusaka
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Malabo
- generated/a87061b72790e27d9f155644521d8cce /cctz/tzdata/Africa/Maputo
- generated/a46a56e63a69fd5c5373a33203250d39 /cctz/tzdata/Africa/Maseru
- generated/a46a56e63a69fd5c5373a33203250d39 /cctz/tzdata/Africa/Mbabane
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Mogadishu
- generated/4afacd60281211a6a7530a3ff8062781 /cctz/tzdata/Africa/Monrovia
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Africa/Nairobi
- generated/510c0710993f09c4d93d3639ac3fe609 /cctz/tzdata/Africa/Ndjamena
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Niamey
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Nouakchott
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Ouagadougou
- generated/89de77d185e9a76612bd5f9fb043a9c2 /cctz/tzdata/Africa/Porto-Novo
- generated/7353b5d25ddb353ced2f1f9639251c16 /cctz/tzdata/Africa/Sao_Tome
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Africa/Timbuktu
- generated/a6b8c0b7319f5fdca0ed634760ff6e3b /cctz/tzdata/Africa/Tripoli
- generated/63615364c91acab170ec8f719aa6f59f /cctz/tzdata/Africa/Tunis
- generated/3c6db0baa05cea4617bcad88b40b1e6a /cctz/tzdata/Africa/Windhoek
- generated/1df7e605c33529940c76c1c145c52fc5 /cctz/tzdata/America/Adak
- generated/77ea6e8a582f87d7a397a9e7b2111be0 /cctz/tzdata/America/Anchorage
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Anguilla
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Antigua
- generated/82840448c9d4782ffa56514a7fb4ca95 /cctz/tzdata/America/Araguaina
- generated/a4fc7ef39a80ff8875d1cb2708ebc49e /cctz/tzdata/America/Argentina/Buenos_Aires
- generated/e3467a68822f3d1365e3494970219b03 /cctz/tzdata/America/Argentina/Catamarca
- generated/e3467a68822f3d1365e3494970219b03 /cctz/tzdata/America/Argentina/ComodRivadavia
- generated/5c57dc3d11f5a64fac22a08ea0c64d25 /cctz/tzdata/America/Argentina/Cordoba
- generated/239a70724a0ff39d5dd3e6b7f4a34212 /cctz/tzdata/America/Argentina/Jujuy
- generated/0e84cda11c5dc9030c43c51187a6c78d /cctz/tzdata/America/Argentina/La_Rioja
- generated/839eacc63921f196e4ecfded7245a67b /cctz/tzdata/America/Argentina/Mendoza
- generated/e0e8162a9ade838f582c23557e530019 /cctz/tzdata/America/Argentina/Rio_Gallegos
- generated/0249d27eff0294ba6c5d090d9895fd17 /cctz/tzdata/America/Argentina/Salta
- generated/4a5ba954919a3b34fb7779965387992f /cctz/tzdata/America/Argentina/San_Juan
- generated/6413085a3a485b5683da3f49944995f0 /cctz/tzdata/America/Argentina/San_Luis
- generated/70483b70b5e389865d462a090b99f2ed /cctz/tzdata/America/Argentina/Tucuman
- generated/07844fc101071f657d084ecb7d161aa0 /cctz/tzdata/America/Argentina/Ushuaia
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Aruba
- generated/9f8d9f5acd176a1a163855959b566bb4 /cctz/tzdata/America/Asuncion
- generated/595e67b4c97fda031a90e5ef80813e7d /cctz/tzdata/America/Atikokan
- generated/1df7e605c33529940c76c1c145c52fc5 /cctz/tzdata/America/Atka
- generated/1c750fa694668ef0a1aad95b61533b2a /cctz/tzdata/America/Bahia
- generated/e4bd3e0b46733cfe080ae7a159951665 /cctz/tzdata/America/Bahia_Banderas
- generated/c779f9c0f9698e7646946312f10dfc4a /cctz/tzdata/America/Barbados
- generated/ace635d426a79002a8e3657033da7795 /cctz/tzdata/America/Belem
- generated/fb4e7ca8ebc94bf7b651ad1921cb62df /cctz/tzdata/America/Belize
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Blanc-Sablon
- generated/30c97d0792df5d5939ff0f09c53c385d /cctz/tzdata/America/Boa_Vista
- generated/ee4b5e263472bc5adf6309f2f5cd8858 /cctz/tzdata/America/Bogota
- generated/f3ce1cb0fb7595deac1b8caa16cae961 /cctz/tzdata/America/Boise
- generated/a4fc7ef39a80ff8875d1cb2708ebc49e /cctz/tzdata/America/Buenos_Aires
- generated/628a7252c0237ddace06127f3f97d066 /cctz/tzdata/America/Cambridge_Bay
- generated/8fa410ffc232e56d0f945bd2b6c34dfe /cctz/tzdata/America/Campo_Grande
- generated/93e1c90eb5222ffb3eca2a2a29b69a69 /cctz/tzdata/America/Cancun
- generated/4d7ff90583dcd0e08fc8c51792761c2b /cctz/tzdata/America/Caracas
- generated/e3467a68822f3d1365e3494970219b03 /cctz/tzdata/America/Catamarca
- generated/806c5856106eb6b28c3846dd93d3acc4 /cctz/tzdata/America/Cayenne
- generated/595e67b4c97fda031a90e5ef80813e7d /cctz/tzdata/America/Cayman
- generated/85435a33486747b319872947c68317f3 /cctz/tzdata/America/Chicago
- generated/46d5d8b3710cb4825d4cca19f239aade /cctz/tzdata/America/Chihuahua
- generated/587990ea7ea7cb10bfd0618d8d314de3 /cctz/tzdata/America/Ciudad_Juarez
- generated/595e67b4c97fda031a90e5ef80813e7d /cctz/tzdata/America/Coral_Harbour
- generated/5c57dc3d11f5a64fac22a08ea0c64d25 /cctz/tzdata/America/Cordoba
- generated/f32590f9bcdfb4ab134294d441804ae5 /cctz/tzdata/America/Costa_Rica
- generated/db536e94d95836d7c5725c3b3c086586 /cctz/tzdata/America/Creston
- generated/268c9a38823e18c714ec9fb756a8042e /cctz/tzdata/America/Cuiaba
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Curacao
- generated/356ff8bd249ee3f6983cba8426901244 /cctz/tzdata/America/Danmarkshavn
- generated/79eedb7a0a4788b9bc3c291c4c643b50 /cctz/tzdata/America/Dawson
- generated/6ece595060d1d2db3153c5d523fb106b /cctz/tzdata/America/Dawson_Creek
- generated/c1b9655d5b1ce7fbc9ac213e921acc88 /cctz/tzdata/America/Denver
- generated/48c96bff46ef373ce5d759dc4a4d2de2 /cctz/tzdata/America/Detroit
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Dominica
- generated/beb91df50b24718aed963a509c0c2958 /cctz/tzdata/America/Edmonton
- generated/fefe5ae6107231a3f738b36d95153f77 /cctz/tzdata/America/Eirunepe
- generated/ec589bada56b3352067a359694896292 /cctz/tzdata/America/El_Salvador
- generated/e693fd65c9bc0b6bf05257d8ff5c4e81 /cctz/tzdata/America/Ensenada
- generated/0998859e2d38d079cc1a3429aa428db4 /cctz/tzdata/America/Fort_Nelson
- generated/9208172103191bf0d660e0023b358ea1 /cctz/tzdata/America/Fort_Wayne
- generated/c72cd4fac2e9b8659f6b5bb2392b9ae5 /cctz/tzdata/America/Fortaleza
- generated/8f9746ead1fc03c962cdd7ddacde663d /cctz/tzdata/America/Glace_Bay
- generated/2d1f992b4b2db0d5b93386a2df8579fe /cctz/tzdata/America/Godthab
- generated/dc00543b628bf4458546124a642c9ac3 /cctz/tzdata/America/Goose_Bay
- generated/eac76eb95be7b5cc25a41e0485b58c41 /cctz/tzdata/America/Grand_Turk
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Grenada
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Guadeloupe
- generated/f8be05a9398502fc14e50eea2693497c /cctz/tzdata/America/Guatemala
- generated/dada91f7db29bcab55bfd2478a5b0779 /cctz/tzdata/America/Guayaquil
- generated/10089d01ae922cfd19a041f3de5ae1ea /cctz/tzdata/America/Guyana
- generated/ef31a488808a56cc6d3c9a3c5a53abeb /cctz/tzdata/America/Halifax
- generated/14af0ba77d76b97e0e666c070c2172cf /cctz/tzdata/America/Havana
- generated/03ff2b0ed691f72f1e04e18e84818dcf /cctz/tzdata/America/Hermosillo
- generated/9208172103191bf0d660e0023b358ea1 /cctz/tzdata/America/Indiana/Indianapolis
- generated/964fb4bc6d047b2a8826a0734633ab0b /cctz/tzdata/America/Indiana/Knox
- generated/fdc9d5431dd16120c1465f298e28e260 /cctz/tzdata/America/Indiana/Marengo
- generated/2c18bc1a2ddb1b06e98ffa553ef1aaee /cctz/tzdata/America/Indiana/Petersburg
- generated/90db76a975de863aadbcf37b47e18cd2 /cctz/tzdata/America/Indiana/Tell_City
- generated/768d11c820a4f93683de8f8bc03df8c8 /cctz/tzdata/America/Indiana/Vevay
- generated/7ca29f8adb394d878db41ab40c4c9a5d /cctz/tzdata/America/Indiana/Vincennes
- generated/f429fd3eab0a434754c001ba1e5aa719 /cctz/tzdata/America/Indiana/Winamac
- generated/9208172103191bf0d660e0023b358ea1 /cctz/tzdata/America/Indianapolis
- generated/f51089782974399a845a8ab6e8825bfd /cctz/tzdata/America/Inuvik
- generated/b8248a79b8e4c6de4f23c59e360d333e /cctz/tzdata/America/Iqaluit
- generated/6ddb543268cbeb4a7fffad436081b019 /cctz/tzdata/America/Jamaica
- generated/239a70724a0ff39d5dd3e6b7f4a34212 /cctz/tzdata/America/Jujuy
- generated/a9b6712f7efd08406ebb3f4a43bf1862 /cctz/tzdata/America/Juneau
- generated/9d9fdcb5bec6ef7173f20c0b968ae540 /cctz/tzdata/America/Kentucky/Louisville
- generated/755a91932697ce463a5c9b642e5292d6 /cctz/tzdata/America/Kentucky/Monticello
- generated/964fb4bc6d047b2a8826a0734633ab0b /cctz/tzdata/America/Knox_IN
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Kralendijk
- generated/fd46d501559b1cf8c8c1fa330196b1b0 /cctz/tzdata/America/La_Paz
- generated/bd9c4fdf467f96ab33dde64bf0ac700c /cctz/tzdata/America/Lima
- generated/641e03b9a1178df8c823447ea6563f25 /cctz/tzdata/America/Los_Angeles
- generated/9d9fdcb5bec6ef7173f20c0b968ae540 /cctz/tzdata/America/Louisville
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Lower_Princes
- generated/823a97c8e447d6f0016bacafd20a246e /cctz/tzdata/America/Maceio
- generated/8435b750c0255a506ff0fd58bf646f00 /cctz/tzdata/America/Managua
- generated/bbb3263234960c35b55fffa1327cc48c /cctz/tzdata/America/Manaus
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Marigot
- generated/450d5ffb8f5928afc0981b5a1a8ba4fa /cctz/tzdata/America/Martinique
- generated/8c2eca6f9c563a5a2c5f6293d3ee3bc5 /cctz/tzdata/America/Matamoros
- generated/2b72d499c62e0523c21b73a12d147157 /cctz/tzdata/America/Mazatlan
- generated/839eacc63921f196e4ecfded7245a67b /cctz/tzdata/America/Mendoza
- generated/b6fc5775917cac51306de9bf93d87827 /cctz/tzdata/America/Menominee
- generated/5fcda9efe6faeae5a8097716a64a127b /cctz/tzdata/America/Merida
- generated/4f4baa18e0219b85f02103bca46dfdca /cctz/tzdata/America/Metlakatla
- generated/82169289ef8c8f15473bc1fcb55123d0 /cctz/tzdata/America/Mexico_City
- generated/6f57cdc08cc6814bf12c58919a3aacff /cctz/tzdata/America/Miquelon
- generated/8dd0d7115ebd05b3cf88b8a11dc97026 /cctz/tzdata/America/Moncton
- generated/bc1bca66f089c87648f0e54b0d0559a6 /cctz/tzdata/America/Monterrey
- generated/64e0eb5df848bbc06156c58b35959680 /cctz/tzdata/America/Montevideo
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/America/Montreal
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Montserrat
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/America/Nassau
- generated/763d7a8374a42066d2b0bb81bd47218f /cctz/tzdata/America/New_York
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/America/Nipigon
- generated/97ed2cb6ee44823ce8fabdc0beeae2b9 /cctz/tzdata/America/Nome
- generated/6c4f6742a67bbd289f89eb4fe7de8e57 /cctz/tzdata/America/Noronha
- generated/b72620d427a1898ea97232aeba51c2dc /cctz/tzdata/America/North_Dakota/Beulah
- generated/511edb5c79692d730d309f4424bbaa0e /cctz/tzdata/America/North_Dakota/Center
- generated/6e5fd4a73872524a21354303cdfff0f8 /cctz/tzdata/America/North_Dakota/New_Salem
- generated/2d1f992b4b2db0d5b93386a2df8579fe /cctz/tzdata/America/Nuuk
- generated/3cf55b0a9c6feadd90e0fb7f8f990178 /cctz/tzdata/America/Ojinaga
- generated/595e67b4c97fda031a90e5ef80813e7d /cctz/tzdata/America/Panama
- generated/b8248a79b8e4c6de4f23c59e360d333e /cctz/tzdata/America/Pangnirtung
- generated/7dacf7ad9037fa33db4536edf63da220 /cctz/tzdata/America/Paramaribo
- generated/db536e94d95836d7c5725c3b3c086586 /cctz/tzdata/America/Phoenix
- generated/f07474008b0495a1830bf6ec76104684 /cctz/tzdata/America/Port-au-Prince
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Port_of_Spain
- generated/0b427173cd7de48179954c1706df9f0f /cctz/tzdata/America/Porto_Acre
- generated/d3dbc4b002cc7a0e5761a3097651309a /cctz/tzdata/America/Porto_Velho
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Puerto_Rico
- generated/a06adc807729db23da9fdb54dc714f8b /cctz/tzdata/America/Punta_Arenas
- generated/1ee6e72e10673d4a16b6e24671f793ec /cctz/tzdata/America/Rainy_River
- generated/ea521f9e43ebb66928bb2f9462a509d2 /cctz/tzdata/America/Rankin_Inlet
- generated/cc7e35a2df60f44003b96877116f4d93 /cctz/tzdata/America/Recife
- generated/c87b8b428cfdf54309e9503177e0ca5f /cctz/tzdata/America/Regina
- generated/6c82012b52156392f0cd7178ebcfa900 /cctz/tzdata/America/Resolute
- generated/0b427173cd7de48179954c1706df9f0f /cctz/tzdata/America/Rio_Branco
- generated/5c57dc3d11f5a64fac22a08ea0c64d25 /cctz/tzdata/America/Rosario
- generated/e693fd65c9bc0b6bf05257d8ff5c4e81 /cctz/tzdata/America/Santa_Isabel
- generated/79b1d15365011739a45fe1de0258ae52 /cctz/tzdata/America/Santarem
- generated/c3b66836f89ba29559e1b438d7454e0b /cctz/tzdata/America/Santiago
- generated/3f4c05321e52971f2213bfb9e45b7a35 /cctz/tzdata/America/Santo_Domingo
- generated/94e0437e48ebbef69b3fb7fe2af5e0f2 /cctz/tzdata/America/Sao_Paulo
- generated/bf0c84231fd8e23714fc440747e56f0b /cctz/tzdata/America/Scoresbysund
- generated/c1b9655d5b1ce7fbc9ac213e921acc88 /cctz/tzdata/America/Shiprock
- generated/4b710acfb88ea85eda7b5f75df122214 /cctz/tzdata/America/Sitka
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/St_Barthelemy
- generated/b5fb2c880a7c41fe2fa96a4792d83269 /cctz/tzdata/America/St_Johns
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/St_Kitts
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/St_Lucia
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/St_Thomas
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/St_Vincent
- generated/4a956902cb69a4cba608798e1da71a58 /cctz/tzdata/America/Swift_Current
- generated/b3c87245083e0474ed4ce3d23abb7f4f /cctz/tzdata/America/Tegucigalpa
- generated/b8c39bf52aaa707c58a301ce115ee576 /cctz/tzdata/America/Thule
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/America/Thunder_Bay
- generated/e693fd65c9bc0b6bf05257d8ff5c4e81 /cctz/tzdata/America/Tijuana
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/America/Toronto
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Tortola
- generated/bc58930f92342790d3ee214524808faa /cctz/tzdata/America/Vancouver
- generated/92d3b867243120ea811c24c038e5b053 /cctz/tzdata/America/Virgin
- generated/5fa937049e86ffbf52d4348c6c43b0ad /cctz/tzdata/America/Whitehorse
- generated/1ee6e72e10673d4a16b6e24671f793ec /cctz/tzdata/America/Winnipeg
- generated/3ee52913271777c67f23d5a918bb0f7c /cctz/tzdata/America/Yakutat
- generated/beb91df50b24718aed963a509c0c2958 /cctz/tzdata/America/Yellowknife
- generated/957f11834b112fc8d4098a9a695e119e /cctz/tzdata/Antarctica/Casey
- generated/b61230343294608431fbbd939bb6971d /cctz/tzdata/Antarctica/Davis
- generated/bcf8aa818432d7ae244087c7306bcb23 /cctz/tzdata/Antarctica/DumontDUrville
- generated/11ad3359d7c0da89994eaa90a9743841 /cctz/tzdata/Antarctica/Macquarie
- generated/63f5d146aa8a66720b2c4db9e87ec1f4 /cctz/tzdata/Antarctica/Mawson
- generated/655680c9ae07d4896919210710185038 /cctz/tzdata/Antarctica/McMurdo
- generated/3a420ea50d496f0c159a0d18af06b211 /cctz/tzdata/Antarctica/Palmer
- generated/0fb4aa6fed3f28bc7a3dae35a993171a /cctz/tzdata/Antarctica/Rothera
- generated/655680c9ae07d4896919210710185038 /cctz/tzdata/Antarctica/South_Pole
- generated/165baa2c51758e236a98a6a1c4cf09a0 /cctz/tzdata/Antarctica/Syowa
- generated/5be25880a5bfb0b41e680f0cfbd222bc /cctz/tzdata/Antarctica/Troll
- generated/4b9d7c5b5f9ba7faf5bd875c5dd43707 /cctz/tzdata/Antarctica/Vostok
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Arctic/Longyearbyen
- generated/165baa2c51758e236a98a6a1c4cf09a0 /cctz/tzdata/Asia/Aden
- generated/279d4250978d0c0149da78aeecd030bc /cctz/tzdata/Asia/Almaty
- generated/0abd3c37bec0c4c7f1a2284c3457adb3 /cctz/tzdata/Asia/Amman
- generated/f627017649ea589681b7b0dd45c03118 /cctz/tzdata/Asia/Anadyr
- generated/af82eec1529bf616942df14b2ffb4403 /cctz/tzdata/Asia/Aqtau
- generated/34dc35c8aa0f4e3a0064a92e5aa5d762 /cctz/tzdata/Asia/Aqtobe
- generated/c68faf20645ecd953e8eb2fb70469f59 /cctz/tzdata/Asia/Ashgabat
- generated/c68faf20645ecd953e8eb2fb70469f59 /cctz/tzdata/Asia/Ashkhabad
- generated/dc74e10d17659800407d742d3a5db22b /cctz/tzdata/Asia/Atyrau
- generated/9aa23335da47827d5ce36afc1523bbd3 /cctz/tzdata/Asia/Baghdad
- generated/ec12549279e64ebeb926579888cf89d9 /cctz/tzdata/Asia/Bahrain
- generated/bde0fe003b2df5121f0d31d3954095a6 /cctz/tzdata/Asia/Baku
- generated/ff94f36118acae9ef3e19438688e266b /cctz/tzdata/Asia/Bangkok
- generated/8a8ef367f59b0e3880bd1cff6651b357 /cctz/tzdata/Asia/Barnaul
- generated/5e8c48c7a60c434f1e2f1e535172cbb9 /cctz/tzdata/Asia/Beirut
- generated/56a77f4891fb3e9506aa233f5fbac27e /cctz/tzdata/Asia/Bishkek
- generated/bf388a0a1da2be989c25dbfb587076d8 /cctz/tzdata/Asia/Brunei
- generated/16a0b637c31e7e480cfccfc46dd75d67 /cctz/tzdata/Asia/Calcutta
- generated/2d0a65ce6c15961ab95c917d9f23e882 /cctz/tzdata/Asia/Chita
- generated/36687b86e799dc46c4ad4c49e3222ea5 /cctz/tzdata/Asia/Choibalsan
- generated/dff9cd919f10d25842d1381cdff9f7f7 /cctz/tzdata/Asia/Chongqing
- generated/dff9cd919f10d25842d1381cdff9f7f7 /cctz/tzdata/Asia/Chungking
- generated/d41b1974e5ec6b3bc790062a97894a37 /cctz/tzdata/Asia/Colombo
- generated/940f5a339a1f12a7153474fc3c92c624 /cctz/tzdata/Asia/Dacca
- generated/c8376c6c326f4e99e093b6bc6cb9cd6e /cctz/tzdata/Asia/Damascus
- generated/940f5a339a1f12a7153474fc3c92c624 /cctz/tzdata/Asia/Dhaka
- generated/8a60b6309c1443774d2f065bcf2bbc61 /cctz/tzdata/Asia/Dili
- generated/667e494c45d181f0706bd07b211c850b /cctz/tzdata/Asia/Dubai
- generated/7d4619fed11db15c54153613fcf23bda /cctz/tzdata/Asia/Dushanbe
- generated/4cd70a6fdc80b1b15c0b9f7c3b807107 /cctz/tzdata/Asia/Famagusta
- generated/c7ad5e1c33180b6d6195dad6f2e37562 /cctz/tzdata/Asia/Gaza
- generated/dff9cd919f10d25842d1381cdff9f7f7 /cctz/tzdata/Asia/Harbin
- generated/322414fc3b2cc4a59f372395a1f19977 /cctz/tzdata/Asia/Hebron
- generated/497c12986b7f72014497d11c00f54b0a /cctz/tzdata/Asia/Ho_Chi_Minh
- generated/f729c88451bacd2895fc1c8d29064c46 /cctz/tzdata/Asia/Hong_Kong
- generated/3c4a6f9840f3d89534c5f511329704e8 /cctz/tzdata/Asia/Hovd
- generated/4e36cb5f575bdcbdd38b144d5a9195c9 /cctz/tzdata/Asia/Irkutsk
- generated/48252c9a797f0f4bea97557a5094cf98 /cctz/tzdata/Asia/Istanbul
- generated/325a2d872e0c0e5339f2e134e921047a /cctz/tzdata/Asia/Jakarta
- generated/4709fe18f39068d2ca7de4c5396e1513 /cctz/tzdata/Asia/Jayapura
- generated/9360bb34802002d91d9bba174c25a8dc /cctz/tzdata/Asia/Jerusalem
- generated/17ca5b7fed86c92696b863cb6a78187f /cctz/tzdata/Asia/Kabul
- generated/959247e441092255286b22fef107172f /cctz/tzdata/Asia/Kamchatka
- generated/ef4485e168a60d91cc5347e5de9a3407 /cctz/tzdata/Asia/Karachi
- generated/67c981ccf51584922a1f72dd2d529730 /cctz/tzdata/Asia/Kashgar
- generated/90518d05c449fad639594f7f575407d6 /cctz/tzdata/Asia/Kathmandu
- generated/90518d05c449fad639594f7f575407d6 /cctz/tzdata/Asia/Katmandu
- generated/c46a3b3c120085251d04dd583a06b6a4 /cctz/tzdata/Asia/Khandyga
- generated/16a0b637c31e7e480cfccfc46dd75d67 /cctz/tzdata/Asia/Kolkata
- generated/702a65f05da90971b14686c21add1a90 /cctz/tzdata/Asia/Krasnoyarsk
- generated/8a2bb95893137bb40748ef4ecd8d7435 /cctz/tzdata/Asia/Kuala_Lumpur
- generated/bf388a0a1da2be989c25dbfb587076d8 /cctz/tzdata/Asia/Kuching
- generated/165baa2c51758e236a98a6a1c4cf09a0 /cctz/tzdata/Asia/Kuwait
- generated/d3dfd69107a4d78facbc67c4d8cea004 /cctz/tzdata/Asia/Macao
- generated/d3dfd69107a4d78facbc67c4d8cea004 /cctz/tzdata/Asia/Macau
- generated/656bd0f3d2def024f4d1e59fc668b538 /cctz/tzdata/Asia/Magadan
- generated/c8c41a468e356c6bb65e89c69e4406dc /cctz/tzdata/Asia/Makassar
- generated/52f31607db7a4a081c63dfb4cc578408 /cctz/tzdata/Asia/Manila
- generated/667e494c45d181f0706bd07b211c850b /cctz/tzdata/Asia/Muscat
- generated/0ec72f7b73a20e311e127abd87a9ec26 /cctz/tzdata/Asia/Nicosia
- generated/71705112182911b4327ac195ffae174b /cctz/tzdata/Asia/Novokuznetsk
- generated/8c3304792234093e5a3d5debcef24a32 /cctz/tzdata/Asia/Novosibirsk
- generated/2ee30998e941f8d603ad278135230cbd /cctz/tzdata/Asia/Omsk
- generated/c72131eaa200e2aa58e1c12fe94f1f67 /cctz/tzdata/Asia/Oral
- generated/ff94f36118acae9ef3e19438688e266b /cctz/tzdata/Asia/Phnom_Penh
- generated/28fe8388ff78123cfd04d67e32057886 /cctz/tzdata/Asia/Pontianak
- generated/772e6342aeba16851eed7dcda632c5be /cctz/tzdata/Asia/Pyongyang
- generated/ec12549279e64ebeb926579888cf89d9 /cctz/tzdata/Asia/Qatar
- generated/392cb3560b8232dee518c44c92295f10 /cctz/tzdata/Asia/Qostanay
- generated/4fff9a8801bd2b75474dde3870d24e89 /cctz/tzdata/Asia/Qyzylorda
- generated/37f26cf8b8fe9179833e366ca13b8916 /cctz/tzdata/Asia/Rangoon
- generated/165baa2c51758e236a98a6a1c4cf09a0 /cctz/tzdata/Asia/Riyadh
- generated/497c12986b7f72014497d11c00f54b0a /cctz/tzdata/Asia/Saigon
- generated/a1239114e71b76c885dbad8f2fa61de4 /cctz/tzdata/Asia/Sakhalin
- generated/9f39ae0771032afbfca86630bec12768 /cctz/tzdata/Asia/Samarkand
- generated/da5aae5f9a71de05b4625f74b007c461 /cctz/tzdata/Asia/Seoul
- generated/dff9cd919f10d25842d1381cdff9f7f7 /cctz/tzdata/Asia/Shanghai
- generated/8a2bb95893137bb40748ef4ecd8d7435 /cctz/tzdata/Asia/Singapore
- generated/d155718faacae2f6288b0c88e66f851c /cctz/tzdata/Asia/Srednekolymsk
- generated/eda5a4ce01efed633c50e04d09fe73b2 /cctz/tzdata/Asia/Taipei
- generated/310f6ba2360c27c334c6e17fccf2b9a5 /cctz/tzdata/Asia/Tashkent
- generated/d3ca7527ee42255559acf2d74d749d00 /cctz/tzdata/Asia/Tbilisi
- generated/f4825b22e2ad8fb3e0bf20daa84bd774 /cctz/tzdata/Asia/Tehran
- generated/9360bb34802002d91d9bba174c25a8dc /cctz/tzdata/Asia/Tel_Aviv
- generated/b4aa5f2b966a76ebc38d1aab44d86bce /cctz/tzdata/Asia/Thimbu
- generated/b4aa5f2b966a76ebc38d1aab44d86bce /cctz/tzdata/Asia/Thimphu
- generated/618a4a8f78720e26749b9c29ed4fd1b3 /cctz/tzdata/Asia/Tokyo
- generated/e770be0bb1b43b9bc7df85f9ac184a79 /cctz/tzdata/Asia/Tomsk
- generated/c8c41a468e356c6bb65e89c69e4406dc /cctz/tzdata/Asia/Ujung_Pandang
- generated/66a0ec5d00519d1826d055514861779d /cctz/tzdata/Asia/Ulaanbaatar
- generated/66a0ec5d00519d1826d055514861779d /cctz/tzdata/Asia/Ulan_Bator
- generated/67c981ccf51584922a1f72dd2d529730 /cctz/tzdata/Asia/Urumqi
- generated/04875c383508e7181ae595cec9856228 /cctz/tzdata/Asia/Ust-Nera
- generated/ff94f36118acae9ef3e19438688e266b /cctz/tzdata/Asia/Vientiane
- generated/4709139f1759e9693b8c02551b527f58 /cctz/tzdata/Asia/Vladivostok
- generated/b22b7be8696db5ca60fb0b7bba4c8718 /cctz/tzdata/Asia/Yakutsk
- generated/37f26cf8b8fe9179833e366ca13b8916 /cctz/tzdata/Asia/Yangon
- generated/bfd18d52a4546531e2f3112725f092d3 /cctz/tzdata/Asia/Yekaterinburg
- generated/d1c5195eed8efac077678d1c6d988f7f /cctz/tzdata/Asia/Yerevan
- generated/93bd1a44f9245279aa44a94d4c435e5c /cctz/tzdata/Atlantic/Azores
- generated/b85d659fabeeb1257ade1f6282a5ec7d /cctz/tzdata/Atlantic/Bermuda
- generated/1e571eef4b7112bb58a746099afd9f02 /cctz/tzdata/Atlantic/Canary
- generated/b7ad70caecef25e4a9ba1e5afd95fe25 /cctz/tzdata/Atlantic/Cape_Verde
- generated/253d5505eaf3a497f4fa107633bea235 /cctz/tzdata/Atlantic/Faeroe
- generated/253d5505eaf3a497f4fa107633bea235 /cctz/tzdata/Atlantic/Faroe
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Atlantic/Jan_Mayen
- generated/4f2a136a6f59628aeea0d09480d630d2 /cctz/tzdata/Atlantic/Madeira
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Atlantic/Reykjavik
- generated/2aa2dbd00a40fc7bdc1f1e3d461a2646 /cctz/tzdata/Atlantic/South_Georgia
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Atlantic/St_Helena
- generated/2a4c8fd0d241b11b207c41b0aedd6cf9 /cctz/tzdata/Atlantic/Stanley
- generated/a1085ba102822f56191705c405f2a8ad /cctz/tzdata/Australia/ACT
- generated/02d7a06f7ede604bdd6bf40932b670c6 /cctz/tzdata/Australia/Adelaide
- generated/d5464310b37a30d92f5b85d128dd4937 /cctz/tzdata/Australia/Brisbane
- generated/35eebba76b28756b47e8fff3157eafdb /cctz/tzdata/Australia/Broken_Hill
- generated/a1085ba102822f56191705c405f2a8ad /cctz/tzdata/Australia/Canberra
- generated/8371d9f10ef8a679be6eadedc6641d73 /cctz/tzdata/Australia/Currie
- generated/09e36f9135b9ddb666cbb9496fecdf89 /cctz/tzdata/Australia/Darwin
- generated/e0185725b852fe59ef8e5fef9f619990 /cctz/tzdata/Australia/Eucla
- generated/8371d9f10ef8a679be6eadedc6641d73 /cctz/tzdata/Australia/Hobart
- generated/e68c0f2ebe9dc247712393ab1bd168d2 /cctz/tzdata/Australia/LHI
- generated/1b6ec1c2e23ea5b37361d885e1db8450 /cctz/tzdata/Australia/Lindeman
- generated/e68c0f2ebe9dc247712393ab1bd168d2 /cctz/tzdata/Australia/Lord_Howe
- generated/e308055a9c06f33a854a9d579ed61249 /cctz/tzdata/Australia/Melbourne
- generated/a1085ba102822f56191705c405f2a8ad /cctz/tzdata/Australia/NSW
- generated/09e36f9135b9ddb666cbb9496fecdf89 /cctz/tzdata/Australia/North
- generated/543113396c7e34a7532457a1ce759c4e /cctz/tzdata/Australia/Perth
- generated/d5464310b37a30d92f5b85d128dd4937 /cctz/tzdata/Australia/Queensland
- generated/02d7a06f7ede604bdd6bf40932b670c6 /cctz/tzdata/Australia/South
- generated/a1085ba102822f56191705c405f2a8ad /cctz/tzdata/Australia/Sydney
- generated/8371d9f10ef8a679be6eadedc6641d73 /cctz/tzdata/Australia/Tasmania
- generated/e308055a9c06f33a854a9d579ed61249 /cctz/tzdata/Australia/Victoria
- generated/543113396c7e34a7532457a1ce759c4e /cctz/tzdata/Australia/West
- generated/35eebba76b28756b47e8fff3157eafdb /cctz/tzdata/Australia/Yancowinna
- generated/0b427173cd7de48179954c1706df9f0f /cctz/tzdata/Brazil/Acre
- generated/6c4f6742a67bbd289f89eb4fe7de8e57 /cctz/tzdata/Brazil/DeNoronha
- generated/94e0437e48ebbef69b3fb7fe2af5e0f2 /cctz/tzdata/Brazil/East
- generated/bbb3263234960c35b55fffa1327cc48c /cctz/tzdata/Brazil/West
- generated/9bc8fb09717950cb4149283c5aff15ac /cctz/tzdata/CET
- generated/43c7956d0835817f930236a5633cffa6 /cctz/tzdata/CST6CDT
- generated/ef31a488808a56cc6d3c9a3c5a53abeb /cctz/tzdata/Canada/Atlantic
- generated/1ee6e72e10673d4a16b6e24671f793ec /cctz/tzdata/Canada/Central
- generated/3fa8a9428d799763fa7ea205c02deb93 /cctz/tzdata/Canada/Eastern
- generated/beb91df50b24718aed963a509c0c2958 /cctz/tzdata/Canada/Mountain
- generated/b5fb2c880a7c41fe2fa96a4792d83269 /cctz/tzdata/Canada/Newfoundland
- generated/bc58930f92342790d3ee214524808faa /cctz/tzdata/Canada/Pacific
- generated/c87b8b428cfdf54309e9503177e0ca5f /cctz/tzdata/Canada/Saskatchewan
- generated/5fa937049e86ffbf52d4348c6c43b0ad /cctz/tzdata/Canada/Yukon
- generated/c3b66836f89ba29559e1b438d7454e0b /cctz/tzdata/Chile/Continental
- generated/57aca34c4b3ca88d9c94b88990c62c79 /cctz/tzdata/Chile/EasterIsland
- generated/14af0ba77d76b97e0e666c070c2172cf /cctz/tzdata/Cuba
- generated/19ef27aa43febb679c0795f8c5dedc0f /cctz/tzdata/EET
- generated/b33eb6506380f950ad798d4d788d136a /cctz/tzdata/EST
- generated/5fbedfd64bddc3ec7790a4eb0f22b66c /cctz/tzdata/EST5EDT
- generated/8dcab26c06fc82939d77511b0c7c24b2 /cctz/tzdata/Egypt
- generated/1917c051a13995cc4c32d2ce05bc3e7b /cctz/tzdata/Eire
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Etc/GMT
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Etc/GMT+0
- generated/d8af0cadc03a3813b866bbfeb041e167 /cctz/tzdata/Etc/GMT+1
- generated/9766867907fd0631d6357abfcb71fde5 /cctz/tzdata/Etc/GMT+10
- generated/d40107fc4f4515f2f2eed25a1ca88fb8 /cctz/tzdata/Etc/GMT+11
- generated/52569f1fcc560faffd0ed78e0e9eb69f /cctz/tzdata/Etc/GMT+12
- generated/29c0187634c10fc717832169fc449715 /cctz/tzdata/Etc/GMT+2
- generated/0d49585e3c48010af348561943e319a2 /cctz/tzdata/Etc/GMT+3
- generated/88546761589cb98c5209ff92ac71be7d /cctz/tzdata/Etc/GMT+4
- generated/9c4035bc2046d3be368e14a46fc8685d /cctz/tzdata/Etc/GMT+5
- generated/a79c9f48310a80244f2065d08f09f91a /cctz/tzdata/Etc/GMT+6
- generated/7956f01b2e6933717e9ba4adfd327ccc /cctz/tzdata/Etc/GMT+7
- generated/9eaedd2c3574882c46ddbbfeabc5c444 /cctz/tzdata/Etc/GMT+8
- generated/0d81f8cc7c4066b8f84371ebbbb3e00c /cctz/tzdata/Etc/GMT+9
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Etc/GMT-0
- generated/721967abda97296c7f361100d8b868e4 /cctz/tzdata/Etc/GMT-1
- generated/42fcd2bd28f14995f4fec31b081d88b0 /cctz/tzdata/Etc/GMT-10
- generated/ba0134eab8c956f482f642c6a5440ee0 /cctz/tzdata/Etc/GMT-11
- generated/f669833977d5968e30ce9d8288dccd22 /cctz/tzdata/Etc/GMT-12
- generated/7176177837995c39668c29a4a459cb55 /cctz/tzdata/Etc/GMT-13
- generated/39ffa0df7491f260ed87949d60aa34da /cctz/tzdata/Etc/GMT-14
- generated/f72cea14be81564422856a5e3633b0f0 /cctz/tzdata/Etc/GMT-2
- generated/6af1f235706f2c48a99cabb1efcd0e53 /cctz/tzdata/Etc/GMT-3
- generated/dced2b01cc7c29f0b1adf9c62f8603fd /cctz/tzdata/Etc/GMT-4
- generated/167b215e24978122218b1a0eec97ea7a /cctz/tzdata/Etc/GMT-5
- generated/43d37a94ef2f6ee11c55e0a14c2898cb /cctz/tzdata/Etc/GMT-6
- generated/ade2a36e23a06174c36b6fd5d795e865 /cctz/tzdata/Etc/GMT-7
- generated/8e7f6cfc11d44c8e29f7f4a59df5fcae /cctz/tzdata/Etc/GMT-8
- generated/ccc5a76bcf9b46bc41f3ffb232850bbb /cctz/tzdata/Etc/GMT-9
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Etc/GMT0
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Etc/Greenwich
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Etc/UCT
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Etc/UTC
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Etc/Universal
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Etc/Zulu
- generated/7a350885dea1ebe1bf630eb4254e9abc /cctz/tzdata/Europe/Amsterdam
- generated/89cb42bccb29740b74d74dad225a7f70 /cctz/tzdata/Europe/Andorra
- generated/29067b92c3481871788d16e05841ce78 /cctz/tzdata/Europe/Astrakhan
- generated/9006b968810f68ce90473c809b252776 /cctz/tzdata/Europe/Athens
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/Europe/Belfast
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Belgrade
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Europe/Berlin
- generated/9ac4de9fb3bcae616f7de40984ccb6b2 /cctz/tzdata/Europe/Bratislava
- generated/7a350885dea1ebe1bf630eb4254e9abc /cctz/tzdata/Europe/Brussels
- generated/c6c2b3eb822cbc1acd02af84c3f9b702 /cctz/tzdata/Europe/Bucharest
- generated/0b00b9da0d4f68857bdebb750ea28c4d /cctz/tzdata/Europe/Budapest
- generated/07b0081174b26fd15187b9d6a019e322 /cctz/tzdata/Europe/Busingen
- generated/bdcf406109db9b568f585ccd3b82b045 /cctz/tzdata/Europe/Chisinau
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Europe/Copenhagen
- generated/1917c051a13995cc4c32d2ce05bc3e7b /cctz/tzdata/Europe/Dublin
- generated/8629c4ecded1abb6072c099aa6781c47 /cctz/tzdata/Europe/Gibraltar
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/Europe/Guernsey
- generated/aecc05607e312ffdbdf3a8f07ac64a6b /cctz/tzdata/Europe/Helsinki
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/Europe/Isle_of_Man
- generated/48252c9a797f0f4bea97557a5094cf98 /cctz/tzdata/Europe/Istanbul
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/Europe/Jersey
- generated/e019dabd72a8783f7d4b4c1fe3dd5c11 /cctz/tzdata/Europe/Kaliningrad
- generated/f2dfc019c4f320ae616a51ab406e8c70 /cctz/tzdata/Europe/Kiev
- generated/dd8da7d587e8614c215c9654fa7fe566 /cctz/tzdata/Europe/Kirov
- generated/f2dfc019c4f320ae616a51ab406e8c70 /cctz/tzdata/Europe/Kyiv
- generated/41bc7cd4fe8c4fc8f59de742ebb69012 /cctz/tzdata/Europe/Lisbon
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Ljubljana
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/Europe/London
- generated/7a350885dea1ebe1bf630eb4254e9abc /cctz/tzdata/Europe/Luxembourg
- generated/1377f55949e2a3c4cf3ccc96bb5a91a5 /cctz/tzdata/Europe/Madrid
- generated/1fd961b54d21dd2ad91b05c7c71435a8 /cctz/tzdata/Europe/Malta
- generated/aecc05607e312ffdbdf3a8f07ac64a6b /cctz/tzdata/Europe/Mariehamn
- generated/aed64fc971bc7aa23cab042415d57d53 /cctz/tzdata/Europe/Minsk
- generated/506e99f9c797d9798e7a411495691504 /cctz/tzdata/Europe/Monaco
- generated/39b47bf37a27f7bcd5d3f7c51343c7fc /cctz/tzdata/Europe/Moscow
- generated/0ec72f7b73a20e311e127abd87a9ec26 /cctz/tzdata/Europe/Nicosia
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Europe/Oslo
- generated/506e99f9c797d9798e7a411495691504 /cctz/tzdata/Europe/Paris
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Podgorica
- generated/9ac4de9fb3bcae616f7de40984ccb6b2 /cctz/tzdata/Europe/Prague
- generated/5462443637d5f64dec33b537afb06863 /cctz/tzdata/Europe/Riga
- generated/c57843caa48aa4715344a26830df1f13 /cctz/tzdata/Europe/Rome
- generated/8baab5c53cf4270f860fb2de701ded9d /cctz/tzdata/Europe/Samara
- generated/c57843caa48aa4715344a26830df1f13 /cctz/tzdata/Europe/San_Marino
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Sarajevo
- generated/c4aa97ffb42eeeb70479979e2050d866 /cctz/tzdata/Europe/Saratov
- generated/3465e5d0858d49481e9bcfea787d1be7 /cctz/tzdata/Europe/Simferopol
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Skopje
- generated/1fa22f3b099ee00c828b0902991ed179 /cctz/tzdata/Europe/Sofia
- generated/2577d6d2ba90616ca47c8ee8d9fbca20 /cctz/tzdata/Europe/Stockholm
- generated/73c8ea0a371b9e73efd5a269509580c5 /cctz/tzdata/Europe/Tallinn
- generated/e9faa2fda4c9671e5002bf470313be76 /cctz/tzdata/Europe/Tirane
- generated/bdcf406109db9b568f585ccd3b82b045 /cctz/tzdata/Europe/Tiraspol
- generated/0dfaf73a64a7c3cfcd10756a6d545e08 /cctz/tzdata/Europe/Ulyanovsk
- generated/f2dfc019c4f320ae616a51ab406e8c70 /cctz/tzdata/Europe/Uzhgorod
- generated/07b0081174b26fd15187b9d6a019e322 /cctz/tzdata/Europe/Vaduz
- generated/c57843caa48aa4715344a26830df1f13 /cctz/tzdata/Europe/Vatican
- generated/fe03dcb43031a0d45d0039e33f1e4c42 /cctz/tzdata/Europe/Vienna
- generated/01293608aae8489ba88d54dea661c996 /cctz/tzdata/Europe/Vilnius
- generated/741c357f646af80fcc1cc2953af0e991 /cctz/tzdata/Europe/Volgograd
- generated/d44a4791346a5defc84c6bec9e52645d /cctz/tzdata/Europe/Warsaw
- generated/a4ac1780d547f4e4c41cab4c6cf1d76d /cctz/tzdata/Europe/Zagreb
- generated/f2dfc019c4f320ae616a51ab406e8c70 /cctz/tzdata/Europe/Zaporozhye
- generated/07b0081174b26fd15187b9d6a019e322 /cctz/tzdata/Europe/Zurich
- generated/e369eb23db7f75930ece7bf91b6b86a7 /cctz/tzdata/Factory
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/GB
- generated/d111147703d04769072d1b824d0ddc0c /cctz/tzdata/GB-Eire
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/GMT
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/GMT+0
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/GMT-0
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/GMT0
- generated/e7577ad74319a942781e7153a97d7690 /cctz/tzdata/Greenwich
- generated/a813cd94645ca8774632d328080f8d97 /cctz/tzdata/HST
- generated/f729c88451bacd2895fc1c8d29064c46 /cctz/tzdata/Hongkong
- generated/796a57137d718e4fa3db8ef611f18e61 /cctz/tzdata/Iceland
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Indian/Antananarivo
- generated/f3ac587344d641763d27895afbe16345 /cctz/tzdata/Indian/Chagos
- generated/ff94f36118acae9ef3e19438688e266b /cctz/tzdata/Indian/Christmas
- generated/37f26cf8b8fe9179833e366ca13b8916 /cctz/tzdata/Indian/Cocos
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Indian/Comoro
- generated/5d62b2758da6d68cb971d8f2cf64d432 /cctz/tzdata/Indian/Kerguelen
- generated/667e494c45d181f0706bd07b211c850b /cctz/tzdata/Indian/Mahe
- generated/5d62b2758da6d68cb971d8f2cf64d432 /cctz/tzdata/Indian/Maldives
- generated/cea8767711bc79a4ec192e25706de5a5 /cctz/tzdata/Indian/Mauritius
- generated/fe54394a3dcf951bad3c293980109dd2 /cctz/tzdata/Indian/Mayotte
- generated/667e494c45d181f0706bd07b211c850b /cctz/tzdata/Indian/Reunion
- generated/f4825b22e2ad8fb3e0bf20daa84bd774 /cctz/tzdata/Iran
- generated/9360bb34802002d91d9bba174c25a8dc /cctz/tzdata/Israel
- generated/6ddb543268cbeb4a7fffad436081b019 /cctz/tzdata/Jamaica
- generated/618a4a8f78720e26749b9c29ed4fd1b3 /cctz/tzdata/Japan
- generated/475a8ae9a30287527356f20d4456abd4 /cctz/tzdata/Kwajalein
- generated/a6b8c0b7319f5fdca0ed634760ff6e3b /cctz/tzdata/Libya
- generated/0727fa9015cd130fba15b7e7163ff139 /cctz/tzdata/MET
- generated/ef8eca09259416ea4e1d5b4bb865a645 /cctz/tzdata/MST
- generated/56dbf10674ff9ef08ef9088d7e7ab639 /cctz/tzdata/MST7MDT
- generated/e693fd65c9bc0b6bf05257d8ff5c4e81 /cctz/tzdata/Mexico/BajaNorte
- generated/2b72d499c62e0523c21b73a12d147157 /cctz/tzdata/Mexico/BajaSur
- generated/82169289ef8c8f15473bc1fcb55123d0 /cctz/tzdata/Mexico/General
- generated/655680c9ae07d4896919210710185038 /cctz/tzdata/NZ
- generated/41dd4c2678c8776c4abdcc809932bbe7 /cctz/tzdata/NZ-CHAT
- generated/c1b9655d5b1ce7fbc9ac213e921acc88 /cctz/tzdata/Navajo
- generated/dff9cd919f10d25842d1381cdff9f7f7 /cctz/tzdata/PRC
- generated/74b8879270f5bd60554e01c6610b1efb /cctz/tzdata/PST8PDT
- generated/fa334faf4eac0c30d0a20353b78f1685 /cctz/tzdata/Pacific/Apia
- generated/655680c9ae07d4896919210710185038 /cctz/tzdata/Pacific/Auckland
- generated/d8977a620cda17fb8da4421e6c474f0c /cctz/tzdata/Pacific/Bougainville
- generated/41dd4c2678c8776c4abdcc809932bbe7 /cctz/tzdata/Pacific/Chatham
- generated/bcf8aa818432d7ae244087c7306bcb23 /cctz/tzdata/Pacific/Chuuk
- generated/57aca34c4b3ca88d9c94b88990c62c79 /cctz/tzdata/Pacific/Easter
- generated/4cddbf0831a9bbaa79369d3b91961a8f /cctz/tzdata/Pacific/Efate
- generated/99cc3c716bf45f1ae5bb572baa4ad256 /cctz/tzdata/Pacific/Enderbury
- generated/afaa4c77a1e912306f4ca578c933d4a6 /cctz/tzdata/Pacific/Fakaofo
- generated/a92ef316c0c20b37f585aa00209c65cf /cctz/tzdata/Pacific/Fiji
- generated/ba8d62a6ed66f462087e00ad76f7354d /cctz/tzdata/Pacific/Funafuti
- generated/055c3628d78f3c9a01a7732c442f78f9 /cctz/tzdata/Pacific/Galapagos
- generated/f4cf94e44810f7c25b2529ffe37ab772 /cctz/tzdata/Pacific/Gambier
- generated/44355d47052f97ac7388446bce23e3ab /cctz/tzdata/Pacific/Guadalcanal
- generated/ec185892bb2764a8280ee41ff8f2b032 /cctz/tzdata/Pacific/Guam
- generated/5ed332a521639d91536739cfb9e4dde6 /cctz/tzdata/Pacific/Honolulu
- generated/5ed332a521639d91536739cfb9e4dde6 /cctz/tzdata/Pacific/Johnston
- generated/99cc3c716bf45f1ae5bb572baa4ad256 /cctz/tzdata/Pacific/Kanton
- generated/1530b1e45e83ed3f4e61d1a6f2f4f706 /cctz/tzdata/Pacific/Kiritimati
- generated/fb8a999658da8686edc727548949fd88 /cctz/tzdata/Pacific/Kosrae
- generated/475a8ae9a30287527356f20d4456abd4 /cctz/tzdata/Pacific/Kwajalein
- generated/ba8d62a6ed66f462087e00ad76f7354d /cctz/tzdata/Pacific/Majuro
- generated/82b091bd4358c77e600c08893560419b /cctz/tzdata/Pacific/Marquesas
- generated/f789c65f289caa627ea1f690836c48f6 /cctz/tzdata/Pacific/Midway
- generated/fa85e90a2dcd44ced6128397a99b2668 /cctz/tzdata/Pacific/Nauru
- generated/92ab841a2a7aa104cb62a09be6f1a232 /cctz/tzdata/Pacific/Niue
- generated/85ee119f6640a16fe650874106f53792 /cctz/tzdata/Pacific/Norfolk
- generated/7f89369fd9501f16ae77919d4c0e5658 /cctz/tzdata/Pacific/Noumea
- generated/f789c65f289caa627ea1f690836c48f6 /cctz/tzdata/Pacific/Pago_Pago
- generated/8d2aeb9646f427ba69fab8ad34c51552 /cctz/tzdata/Pacific/Palau
- generated/acf014221290656a061fff7e9fa818ee /cctz/tzdata/Pacific/Pitcairn
- generated/44355d47052f97ac7388446bce23e3ab /cctz/tzdata/Pacific/Pohnpei
- generated/44355d47052f97ac7388446bce23e3ab /cctz/tzdata/Pacific/Ponape
- generated/bcf8aa818432d7ae244087c7306bcb23 /cctz/tzdata/Pacific/Port_Moresby
- generated/5b3b7bd518d8afe48e97f141617c0531 /cctz/tzdata/Pacific/Rarotonga
- generated/ec185892bb2764a8280ee41ff8f2b032 /cctz/tzdata/Pacific/Saipan
- generated/f789c65f289caa627ea1f690836c48f6 /cctz/tzdata/Pacific/Samoa
- generated/0672593cd4756dbfb8bba02b4555c91d /cctz/tzdata/Pacific/Tahiti
- generated/ba8d62a6ed66f462087e00ad76f7354d /cctz/tzdata/Pacific/Tarawa
- generated/460900dfed7410df3acffe5b811d0f02 /cctz/tzdata/Pacific/Tongatapu
- generated/bcf8aa818432d7ae244087c7306bcb23 /cctz/tzdata/Pacific/Truk
- generated/ba8d62a6ed66f462087e00ad76f7354d /cctz/tzdata/Pacific/Wake
- generated/ba8d62a6ed66f462087e00ad76f7354d /cctz/tzdata/Pacific/Wallis
- generated/bcf8aa818432d7ae244087c7306bcb23 /cctz/tzdata/Pacific/Yap
- generated/d44a4791346a5defc84c6bec9e52645d /cctz/tzdata/Poland
- generated/41bc7cd4fe8c4fc8f59de742ebb69012 /cctz/tzdata/Portugal
- generated/eda5a4ce01efed633c50e04d09fe73b2 /cctz/tzdata/ROC
- generated/da5aae5f9a71de05b4625f74b007c461 /cctz/tzdata/ROK
- generated/8a2bb95893137bb40748ef4ecd8d7435 /cctz/tzdata/Singapore
- generated/48252c9a797f0f4bea97557a5094cf98 /cctz/tzdata/Turkey
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/UCT
- generated/77ea6e8a582f87d7a397a9e7b2111be0 /cctz/tzdata/US/Alaska
- generated/1df7e605c33529940c76c1c145c52fc5 /cctz/tzdata/US/Aleutian
- generated/db536e94d95836d7c5725c3b3c086586 /cctz/tzdata/US/Arizona
- generated/85435a33486747b319872947c68317f3 /cctz/tzdata/US/Central
- generated/9208172103191bf0d660e0023b358ea1 /cctz/tzdata/US/East-Indiana
- generated/763d7a8374a42066d2b0bb81bd47218f /cctz/tzdata/US/Eastern
- generated/5ed332a521639d91536739cfb9e4dde6 /cctz/tzdata/US/Hawaii
- generated/964fb4bc6d047b2a8826a0734633ab0b /cctz/tzdata/US/Indiana-Starke
- generated/48c96bff46ef373ce5d759dc4a4d2de2 /cctz/tzdata/US/Michigan
- generated/c1b9655d5b1ce7fbc9ac213e921acc88 /cctz/tzdata/US/Mountain
- generated/641e03b9a1178df8c823447ea6563f25 /cctz/tzdata/US/Pacific
- generated/f789c65f289caa627ea1f690836c48f6 /cctz/tzdata/US/Samoa
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/UTC
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Universal
- generated/39b47bf37a27f7bcd5d3f7c51343c7fc /cctz/tzdata/W-SU
- generated/0124cd65b22dfd92129cb0a43719c717 /cctz/tzdata/WET
- generated/51d8a0e68892ebf0854a1b4250ffb26b /cctz/tzdata/Zulu
-)
+ generated/Africa/Abidjan /cctz/tzdata/Africa/Abidjan
+ generated/Africa/Accra /cctz/tzdata/Africa/Accra
+ generated/Africa/Addis_Ababa /cctz/tzdata/Africa/Addis_Ababa
+ generated/Africa/Algiers /cctz/tzdata/Africa/Algiers
+ generated/Africa/Asmara /cctz/tzdata/Africa/Asmara
+ generated/Africa/Asmera /cctz/tzdata/Africa/Asmera
+ generated/Africa/Bamako /cctz/tzdata/Africa/Bamako
+ generated/Africa/Bangui /cctz/tzdata/Africa/Bangui
+ generated/Africa/Banjul /cctz/tzdata/Africa/Banjul
+ generated/Africa/Bissau /cctz/tzdata/Africa/Bissau
+ generated/Africa/Blantyre /cctz/tzdata/Africa/Blantyre
+ generated/Africa/Brazzaville /cctz/tzdata/Africa/Brazzaville
+ generated/Africa/Bujumbura /cctz/tzdata/Africa/Bujumbura
+ generated/Africa/Cairo /cctz/tzdata/Africa/Cairo
+ generated/Africa/Casablanca /cctz/tzdata/Africa/Casablanca
+ generated/Africa/Ceuta /cctz/tzdata/Africa/Ceuta
+ generated/Africa/Conakry /cctz/tzdata/Africa/Conakry
+ generated/Africa/Dakar /cctz/tzdata/Africa/Dakar
+ generated/Africa/Dar_es_Salaam /cctz/tzdata/Africa/Dar_es_Salaam
+ generated/Africa/Djibouti /cctz/tzdata/Africa/Djibouti
+ generated/Africa/Douala /cctz/tzdata/Africa/Douala
+ generated/Africa/El_Aaiun /cctz/tzdata/Africa/El_Aaiun
+ generated/Africa/Freetown /cctz/tzdata/Africa/Freetown
+ generated/Africa/Gaborone /cctz/tzdata/Africa/Gaborone
+ generated/Africa/Harare /cctz/tzdata/Africa/Harare
+ generated/Africa/Johannesburg /cctz/tzdata/Africa/Johannesburg
+ generated/Africa/Juba /cctz/tzdata/Africa/Juba
+ generated/Africa/Kampala /cctz/tzdata/Africa/Kampala
+ generated/Africa/Khartoum /cctz/tzdata/Africa/Khartoum
+ generated/Africa/Kigali /cctz/tzdata/Africa/Kigali
+ generated/Africa/Kinshasa /cctz/tzdata/Africa/Kinshasa
+ generated/Africa/Lagos /cctz/tzdata/Africa/Lagos
+ generated/Africa/Libreville /cctz/tzdata/Africa/Libreville
+ generated/Africa/Lome /cctz/tzdata/Africa/Lome
+ generated/Africa/Luanda /cctz/tzdata/Africa/Luanda
+ generated/Africa/Lubumbashi /cctz/tzdata/Africa/Lubumbashi
+ generated/Africa/Lusaka /cctz/tzdata/Africa/Lusaka
+ generated/Africa/Malabo /cctz/tzdata/Africa/Malabo
+ generated/Africa/Maputo /cctz/tzdata/Africa/Maputo
+ generated/Africa/Maseru /cctz/tzdata/Africa/Maseru
+ generated/Africa/Mbabane /cctz/tzdata/Africa/Mbabane
+ generated/Africa/Mogadishu /cctz/tzdata/Africa/Mogadishu
+ generated/Africa/Monrovia /cctz/tzdata/Africa/Monrovia
+ generated/Africa/Nairobi /cctz/tzdata/Africa/Nairobi
+ generated/Africa/Ndjamena /cctz/tzdata/Africa/Ndjamena
+ generated/Africa/Niamey /cctz/tzdata/Africa/Niamey
+ generated/Africa/Nouakchott /cctz/tzdata/Africa/Nouakchott
+ generated/Africa/Ouagadougou /cctz/tzdata/Africa/Ouagadougou
+ generated/Africa/Porto-Novo /cctz/tzdata/Africa/Porto-Novo
+ generated/Africa/Sao_Tome /cctz/tzdata/Africa/Sao_Tome
+ generated/Africa/Timbuktu /cctz/tzdata/Africa/Timbuktu
+ generated/Africa/Tripoli /cctz/tzdata/Africa/Tripoli
+ generated/Africa/Tunis /cctz/tzdata/Africa/Tunis
+ generated/Africa/Windhoek /cctz/tzdata/Africa/Windhoek
+ generated/America/Adak /cctz/tzdata/America/Adak
+ generated/America/Anchorage /cctz/tzdata/America/Anchorage
+ generated/America/Anguilla /cctz/tzdata/America/Anguilla
+ generated/America/Antigua /cctz/tzdata/America/Antigua
+ generated/America/Araguaina /cctz/tzdata/America/Araguaina
+ generated/America/Argentina/Buenos_Aires /cctz/tzdata/America/Argentina/Buenos_Aires
+ generated/America/Argentina/Catamarca /cctz/tzdata/America/Argentina/Catamarca
+ generated/America/Argentina/ComodRivadavia /cctz/tzdata/America/Argentina/ComodRivadavia
+ generated/America/Argentina/Cordoba /cctz/tzdata/America/Argentina/Cordoba
+ generated/America/Argentina/Jujuy /cctz/tzdata/America/Argentina/Jujuy
+ generated/America/Argentina/La_Rioja /cctz/tzdata/America/Argentina/La_Rioja
+ generated/America/Argentina/Mendoza /cctz/tzdata/America/Argentina/Mendoza
+ generated/America/Argentina/Rio_Gallegos /cctz/tzdata/America/Argentina/Rio_Gallegos
+ generated/America/Argentina/Salta /cctz/tzdata/America/Argentina/Salta
+ generated/America/Argentina/San_Juan /cctz/tzdata/America/Argentina/San_Juan
+ generated/America/Argentina/San_Luis /cctz/tzdata/America/Argentina/San_Luis
+ generated/America/Argentina/Tucuman /cctz/tzdata/America/Argentina/Tucuman
+ generated/America/Argentina/Ushuaia /cctz/tzdata/America/Argentina/Ushuaia
+ generated/America/Aruba /cctz/tzdata/America/Aruba
+ generated/America/Asuncion /cctz/tzdata/America/Asuncion
+ generated/America/Atikokan /cctz/tzdata/America/Atikokan
+ generated/America/Atka /cctz/tzdata/America/Atka
+ generated/America/Bahia /cctz/tzdata/America/Bahia
+ generated/America/Bahia_Banderas /cctz/tzdata/America/Bahia_Banderas
+ generated/America/Barbados /cctz/tzdata/America/Barbados
+ generated/America/Belem /cctz/tzdata/America/Belem
+ generated/America/Belize /cctz/tzdata/America/Belize
+ generated/America/Blanc-Sablon /cctz/tzdata/America/Blanc-Sablon
+ generated/America/Boa_Vista /cctz/tzdata/America/Boa_Vista
+ generated/America/Bogota /cctz/tzdata/America/Bogota
+ generated/America/Boise /cctz/tzdata/America/Boise
+ generated/America/Buenos_Aires /cctz/tzdata/America/Buenos_Aires
+ generated/America/Cambridge_Bay /cctz/tzdata/America/Cambridge_Bay
+ generated/America/Campo_Grande /cctz/tzdata/America/Campo_Grande
+ generated/America/Cancun /cctz/tzdata/America/Cancun
+ generated/America/Caracas /cctz/tzdata/America/Caracas
+ generated/America/Catamarca /cctz/tzdata/America/Catamarca
+ generated/America/Cayenne /cctz/tzdata/America/Cayenne
+ generated/America/Cayman /cctz/tzdata/America/Cayman
+ generated/America/Chicago /cctz/tzdata/America/Chicago
+ generated/America/Chihuahua /cctz/tzdata/America/Chihuahua
+ generated/America/Ciudad_Juarez /cctz/tzdata/America/Ciudad_Juarez
+ generated/America/Coral_Harbour /cctz/tzdata/America/Coral_Harbour
+ generated/America/Cordoba /cctz/tzdata/America/Cordoba
+ generated/America/Costa_Rica /cctz/tzdata/America/Costa_Rica
+ generated/America/Coyhaique /cctz/tzdata/America/Coyhaique
+ generated/America/Creston /cctz/tzdata/America/Creston
+ generated/America/Cuiaba /cctz/tzdata/America/Cuiaba
+ generated/America/Curacao /cctz/tzdata/America/Curacao
+ generated/America/Danmarkshavn /cctz/tzdata/America/Danmarkshavn
+ generated/America/Dawson /cctz/tzdata/America/Dawson
+ generated/America/Dawson_Creek /cctz/tzdata/America/Dawson_Creek
+ generated/America/Denver /cctz/tzdata/America/Denver
+ generated/America/Detroit /cctz/tzdata/America/Detroit
+ generated/America/Dominica /cctz/tzdata/America/Dominica
+ generated/America/Edmonton /cctz/tzdata/America/Edmonton
+ generated/America/Eirunepe /cctz/tzdata/America/Eirunepe
+ generated/America/El_Salvador /cctz/tzdata/America/El_Salvador
+ generated/America/Ensenada /cctz/tzdata/America/Ensenada
+ generated/America/Fort_Nelson /cctz/tzdata/America/Fort_Nelson
+ generated/America/Fort_Wayne /cctz/tzdata/America/Fort_Wayne
+ generated/America/Fortaleza /cctz/tzdata/America/Fortaleza
+ generated/America/Glace_Bay /cctz/tzdata/America/Glace_Bay
+ generated/America/Godthab /cctz/tzdata/America/Godthab
+ generated/America/Goose_Bay /cctz/tzdata/America/Goose_Bay
+ generated/America/Grand_Turk /cctz/tzdata/America/Grand_Turk
+ generated/America/Grenada /cctz/tzdata/America/Grenada
+ generated/America/Guadeloupe /cctz/tzdata/America/Guadeloupe
+ generated/America/Guatemala /cctz/tzdata/America/Guatemala
+ generated/America/Guayaquil /cctz/tzdata/America/Guayaquil
+ generated/America/Guyana /cctz/tzdata/America/Guyana
+ generated/America/Halifax /cctz/tzdata/America/Halifax
+ generated/America/Havana /cctz/tzdata/America/Havana
+ generated/America/Hermosillo /cctz/tzdata/America/Hermosillo
+ generated/America/Indiana/Indianapolis /cctz/tzdata/America/Indiana/Indianapolis
+ generated/America/Indiana/Knox /cctz/tzdata/America/Indiana/Knox
+ generated/America/Indiana/Marengo /cctz/tzdata/America/Indiana/Marengo
+ generated/America/Indiana/Petersburg /cctz/tzdata/America/Indiana/Petersburg
+ generated/America/Indiana/Tell_City /cctz/tzdata/America/Indiana/Tell_City
+ generated/America/Indiana/Vevay /cctz/tzdata/America/Indiana/Vevay
+ generated/America/Indiana/Vincennes /cctz/tzdata/America/Indiana/Vincennes
+ generated/America/Indiana/Winamac /cctz/tzdata/America/Indiana/Winamac
+ generated/America/Indianapolis /cctz/tzdata/America/Indianapolis
+ generated/America/Inuvik /cctz/tzdata/America/Inuvik
+ generated/America/Iqaluit /cctz/tzdata/America/Iqaluit
+ generated/America/Jamaica /cctz/tzdata/America/Jamaica
+ generated/America/Jujuy /cctz/tzdata/America/Jujuy
+ generated/America/Juneau /cctz/tzdata/America/Juneau
+ generated/America/Kentucky/Louisville /cctz/tzdata/America/Kentucky/Louisville
+ generated/America/Kentucky/Monticello /cctz/tzdata/America/Kentucky/Monticello
+ generated/America/Knox_IN /cctz/tzdata/America/Knox_IN
+ generated/America/Kralendijk /cctz/tzdata/America/Kralendijk
+ generated/America/La_Paz /cctz/tzdata/America/La_Paz
+ generated/America/Lima /cctz/tzdata/America/Lima
+ generated/America/Los_Angeles /cctz/tzdata/America/Los_Angeles
+ generated/America/Louisville /cctz/tzdata/America/Louisville
+ generated/America/Lower_Princes /cctz/tzdata/America/Lower_Princes
+ generated/America/Maceio /cctz/tzdata/America/Maceio
+ generated/America/Managua /cctz/tzdata/America/Managua
+ generated/America/Manaus /cctz/tzdata/America/Manaus
+ generated/America/Marigot /cctz/tzdata/America/Marigot
+ generated/America/Martinique /cctz/tzdata/America/Martinique
+ generated/America/Matamoros /cctz/tzdata/America/Matamoros
+ generated/America/Mazatlan /cctz/tzdata/America/Mazatlan
+ generated/America/Mendoza /cctz/tzdata/America/Mendoza
+ generated/America/Menominee /cctz/tzdata/America/Menominee
+ generated/America/Merida /cctz/tzdata/America/Merida
+ generated/America/Metlakatla /cctz/tzdata/America/Metlakatla
+ generated/America/Mexico_City /cctz/tzdata/America/Mexico_City
+ generated/America/Miquelon /cctz/tzdata/America/Miquelon
+ generated/America/Moncton /cctz/tzdata/America/Moncton
+ generated/America/Monterrey /cctz/tzdata/America/Monterrey
+ generated/America/Montevideo /cctz/tzdata/America/Montevideo
+ generated/America/Montreal /cctz/tzdata/America/Montreal
+ generated/America/Montserrat /cctz/tzdata/America/Montserrat
+ generated/America/Nassau /cctz/tzdata/America/Nassau
+ generated/America/New_York /cctz/tzdata/America/New_York
+ generated/America/Nipigon /cctz/tzdata/America/Nipigon
+ generated/America/Nome /cctz/tzdata/America/Nome
+ generated/America/Noronha /cctz/tzdata/America/Noronha
+ generated/America/North_Dakota/Beulah /cctz/tzdata/America/North_Dakota/Beulah
+ generated/America/North_Dakota/Center /cctz/tzdata/America/North_Dakota/Center
+ generated/America/North_Dakota/New_Salem /cctz/tzdata/America/North_Dakota/New_Salem
+ generated/America/Nuuk /cctz/tzdata/America/Nuuk
+ generated/America/Ojinaga /cctz/tzdata/America/Ojinaga
+ generated/America/Panama /cctz/tzdata/America/Panama
+ generated/America/Pangnirtung /cctz/tzdata/America/Pangnirtung
+ generated/America/Paramaribo /cctz/tzdata/America/Paramaribo
+ generated/America/Phoenix /cctz/tzdata/America/Phoenix
+ generated/America/Port-au-Prince /cctz/tzdata/America/Port-au-Prince
+ generated/America/Port_of_Spain /cctz/tzdata/America/Port_of_Spain
+ generated/America/Porto_Acre /cctz/tzdata/America/Porto_Acre
+ generated/America/Porto_Velho /cctz/tzdata/America/Porto_Velho
+ generated/America/Puerto_Rico /cctz/tzdata/America/Puerto_Rico
+ generated/America/Punta_Arenas /cctz/tzdata/America/Punta_Arenas
+ generated/America/Rainy_River /cctz/tzdata/America/Rainy_River
+ generated/America/Rankin_Inlet /cctz/tzdata/America/Rankin_Inlet
+ generated/America/Recife /cctz/tzdata/America/Recife
+ generated/America/Regina /cctz/tzdata/America/Regina
+ generated/America/Resolute /cctz/tzdata/America/Resolute
+ generated/America/Rio_Branco /cctz/tzdata/America/Rio_Branco
+ generated/America/Rosario /cctz/tzdata/America/Rosario
+ generated/America/Santa_Isabel /cctz/tzdata/America/Santa_Isabel
+ generated/America/Santarem /cctz/tzdata/America/Santarem
+ generated/America/Santiago /cctz/tzdata/America/Santiago
+ generated/America/Santo_Domingo /cctz/tzdata/America/Santo_Domingo
+ generated/America/Sao_Paulo /cctz/tzdata/America/Sao_Paulo
+ generated/America/Scoresbysund /cctz/tzdata/America/Scoresbysund
+ generated/America/Shiprock /cctz/tzdata/America/Shiprock
+ generated/America/Sitka /cctz/tzdata/America/Sitka
+ generated/America/St_Barthelemy /cctz/tzdata/America/St_Barthelemy
+ generated/America/St_Johns /cctz/tzdata/America/St_Johns
+ generated/America/St_Kitts /cctz/tzdata/America/St_Kitts
+ generated/America/St_Lucia /cctz/tzdata/America/St_Lucia
+ generated/America/St_Thomas /cctz/tzdata/America/St_Thomas
+ generated/America/St_Vincent /cctz/tzdata/America/St_Vincent
+ generated/America/Swift_Current /cctz/tzdata/America/Swift_Current
+ generated/America/Tegucigalpa /cctz/tzdata/America/Tegucigalpa
+ generated/America/Thule /cctz/tzdata/America/Thule
+ generated/America/Thunder_Bay /cctz/tzdata/America/Thunder_Bay
+ generated/America/Tijuana /cctz/tzdata/America/Tijuana
+ generated/America/Toronto /cctz/tzdata/America/Toronto
+ generated/America/Tortola /cctz/tzdata/America/Tortola
+ generated/America/Vancouver /cctz/tzdata/America/Vancouver
+ generated/America/Virgin /cctz/tzdata/America/Virgin
+ generated/America/Whitehorse /cctz/tzdata/America/Whitehorse
+ generated/America/Winnipeg /cctz/tzdata/America/Winnipeg
+ generated/America/Yakutat /cctz/tzdata/America/Yakutat
+ generated/America/Yellowknife /cctz/tzdata/America/Yellowknife
+ generated/Antarctica/Casey /cctz/tzdata/Antarctica/Casey
+ generated/Antarctica/Davis /cctz/tzdata/Antarctica/Davis
+ generated/Antarctica/DumontDUrville /cctz/tzdata/Antarctica/DumontDUrville
+ generated/Antarctica/Macquarie /cctz/tzdata/Antarctica/Macquarie
+ generated/Antarctica/Mawson /cctz/tzdata/Antarctica/Mawson
+ generated/Antarctica/McMurdo /cctz/tzdata/Antarctica/McMurdo
+ generated/Antarctica/Palmer /cctz/tzdata/Antarctica/Palmer
+ generated/Antarctica/Rothera /cctz/tzdata/Antarctica/Rothera
+ generated/Antarctica/South_Pole /cctz/tzdata/Antarctica/South_Pole
+ generated/Antarctica/Syowa /cctz/tzdata/Antarctica/Syowa
+ generated/Antarctica/Troll /cctz/tzdata/Antarctica/Troll
+ generated/Antarctica/Vostok /cctz/tzdata/Antarctica/Vostok
+ generated/Arctic/Longyearbyen /cctz/tzdata/Arctic/Longyearbyen
+ generated/Asia/Aden /cctz/tzdata/Asia/Aden
+ generated/Asia/Almaty /cctz/tzdata/Asia/Almaty
+ generated/Asia/Amman /cctz/tzdata/Asia/Amman
+ generated/Asia/Anadyr /cctz/tzdata/Asia/Anadyr
+ generated/Asia/Aqtau /cctz/tzdata/Asia/Aqtau
+ generated/Asia/Aqtobe /cctz/tzdata/Asia/Aqtobe
+ generated/Asia/Ashgabat /cctz/tzdata/Asia/Ashgabat
+ generated/Asia/Ashkhabad /cctz/tzdata/Asia/Ashkhabad
+ generated/Asia/Atyrau /cctz/tzdata/Asia/Atyrau
+ generated/Asia/Baghdad /cctz/tzdata/Asia/Baghdad
+ generated/Asia/Bahrain /cctz/tzdata/Asia/Bahrain
+ generated/Asia/Baku /cctz/tzdata/Asia/Baku
+ generated/Asia/Bangkok /cctz/tzdata/Asia/Bangkok
+ generated/Asia/Barnaul /cctz/tzdata/Asia/Barnaul
+ generated/Asia/Beirut /cctz/tzdata/Asia/Beirut
+ generated/Asia/Bishkek /cctz/tzdata/Asia/Bishkek
+ generated/Asia/Brunei /cctz/tzdata/Asia/Brunei
+ generated/Asia/Calcutta /cctz/tzdata/Asia/Calcutta
+ generated/Asia/Chita /cctz/tzdata/Asia/Chita
+ generated/Asia/Choibalsan /cctz/tzdata/Asia/Choibalsan
+ generated/Asia/Chongqing /cctz/tzdata/Asia/Chongqing
+ generated/Asia/Chungking /cctz/tzdata/Asia/Chungking
+ generated/Asia/Colombo /cctz/tzdata/Asia/Colombo
+ generated/Asia/Dacca /cctz/tzdata/Asia/Dacca
+ generated/Asia/Damascus /cctz/tzdata/Asia/Damascus
+ generated/Asia/Dhaka /cctz/tzdata/Asia/Dhaka
+ generated/Asia/Dili /cctz/tzdata/Asia/Dili
+ generated/Asia/Dubai /cctz/tzdata/Asia/Dubai
+ generated/Asia/Dushanbe /cctz/tzdata/Asia/Dushanbe
+ generated/Asia/Famagusta /cctz/tzdata/Asia/Famagusta
+ generated/Asia/Gaza /cctz/tzdata/Asia/Gaza
+ generated/Asia/Harbin /cctz/tzdata/Asia/Harbin
+ generated/Asia/Hebron /cctz/tzdata/Asia/Hebron
+ generated/Asia/Ho_Chi_Minh /cctz/tzdata/Asia/Ho_Chi_Minh
+ generated/Asia/Hong_Kong /cctz/tzdata/Asia/Hong_Kong
+ generated/Asia/Hovd /cctz/tzdata/Asia/Hovd
+ generated/Asia/Irkutsk /cctz/tzdata/Asia/Irkutsk
+ generated/Asia/Istanbul /cctz/tzdata/Asia/Istanbul
+ generated/Asia/Jakarta /cctz/tzdata/Asia/Jakarta
+ generated/Asia/Jayapura /cctz/tzdata/Asia/Jayapura
+ generated/Asia/Jerusalem /cctz/tzdata/Asia/Jerusalem
+ generated/Asia/Kabul /cctz/tzdata/Asia/Kabul
+ generated/Asia/Kamchatka /cctz/tzdata/Asia/Kamchatka
+ generated/Asia/Karachi /cctz/tzdata/Asia/Karachi
+ generated/Asia/Kashgar /cctz/tzdata/Asia/Kashgar
+ generated/Asia/Kathmandu /cctz/tzdata/Asia/Kathmandu
+ generated/Asia/Katmandu /cctz/tzdata/Asia/Katmandu
+ generated/Asia/Khandyga /cctz/tzdata/Asia/Khandyga
+ generated/Asia/Kolkata /cctz/tzdata/Asia/Kolkata
+ generated/Asia/Krasnoyarsk /cctz/tzdata/Asia/Krasnoyarsk
+ generated/Asia/Kuala_Lumpur /cctz/tzdata/Asia/Kuala_Lumpur
+ generated/Asia/Kuching /cctz/tzdata/Asia/Kuching
+ generated/Asia/Kuwait /cctz/tzdata/Asia/Kuwait
+ generated/Asia/Macao /cctz/tzdata/Asia/Macao
+ generated/Asia/Macau /cctz/tzdata/Asia/Macau
+ generated/Asia/Magadan /cctz/tzdata/Asia/Magadan
+ generated/Asia/Makassar /cctz/tzdata/Asia/Makassar
+ generated/Asia/Manila /cctz/tzdata/Asia/Manila
+ generated/Asia/Muscat /cctz/tzdata/Asia/Muscat
+ generated/Asia/Nicosia /cctz/tzdata/Asia/Nicosia
+ generated/Asia/Novokuznetsk /cctz/tzdata/Asia/Novokuznetsk
+ generated/Asia/Novosibirsk /cctz/tzdata/Asia/Novosibirsk
+ generated/Asia/Omsk /cctz/tzdata/Asia/Omsk
+ generated/Asia/Oral /cctz/tzdata/Asia/Oral
+ generated/Asia/Phnom_Penh /cctz/tzdata/Asia/Phnom_Penh
+ generated/Asia/Pontianak /cctz/tzdata/Asia/Pontianak
+ generated/Asia/Pyongyang /cctz/tzdata/Asia/Pyongyang
+ generated/Asia/Qatar /cctz/tzdata/Asia/Qatar
+ generated/Asia/Qostanay /cctz/tzdata/Asia/Qostanay
+ generated/Asia/Qyzylorda /cctz/tzdata/Asia/Qyzylorda
+ generated/Asia/Rangoon /cctz/tzdata/Asia/Rangoon
+ generated/Asia/Riyadh /cctz/tzdata/Asia/Riyadh
+ generated/Asia/Saigon /cctz/tzdata/Asia/Saigon
+ generated/Asia/Sakhalin /cctz/tzdata/Asia/Sakhalin
+ generated/Asia/Samarkand /cctz/tzdata/Asia/Samarkand
+ generated/Asia/Seoul /cctz/tzdata/Asia/Seoul
+ generated/Asia/Shanghai /cctz/tzdata/Asia/Shanghai
+ generated/Asia/Singapore /cctz/tzdata/Asia/Singapore
+ generated/Asia/Srednekolymsk /cctz/tzdata/Asia/Srednekolymsk
+ generated/Asia/Taipei /cctz/tzdata/Asia/Taipei
+ generated/Asia/Tashkent /cctz/tzdata/Asia/Tashkent
+ generated/Asia/Tbilisi /cctz/tzdata/Asia/Tbilisi
+ generated/Asia/Tehran /cctz/tzdata/Asia/Tehran
+ generated/Asia/Tel_Aviv /cctz/tzdata/Asia/Tel_Aviv
+ generated/Asia/Thimbu /cctz/tzdata/Asia/Thimbu
+ generated/Asia/Thimphu /cctz/tzdata/Asia/Thimphu
+ generated/Asia/Tokyo /cctz/tzdata/Asia/Tokyo
+ generated/Asia/Tomsk /cctz/tzdata/Asia/Tomsk
+ generated/Asia/Ujung_Pandang /cctz/tzdata/Asia/Ujung_Pandang
+ generated/Asia/Ulaanbaatar /cctz/tzdata/Asia/Ulaanbaatar
+ generated/Asia/Ulan_Bator /cctz/tzdata/Asia/Ulan_Bator
+ generated/Asia/Urumqi /cctz/tzdata/Asia/Urumqi
+ generated/Asia/Ust-Nera /cctz/tzdata/Asia/Ust-Nera
+ generated/Asia/Vientiane /cctz/tzdata/Asia/Vientiane
+ generated/Asia/Vladivostok /cctz/tzdata/Asia/Vladivostok
+ generated/Asia/Yakutsk /cctz/tzdata/Asia/Yakutsk
+ generated/Asia/Yangon /cctz/tzdata/Asia/Yangon
+ generated/Asia/Yekaterinburg /cctz/tzdata/Asia/Yekaterinburg
+ generated/Asia/Yerevan /cctz/tzdata/Asia/Yerevan
+ generated/Atlantic/Azores /cctz/tzdata/Atlantic/Azores
+ generated/Atlantic/Bermuda /cctz/tzdata/Atlantic/Bermuda
+ generated/Atlantic/Canary /cctz/tzdata/Atlantic/Canary
+ generated/Atlantic/Cape_Verde /cctz/tzdata/Atlantic/Cape_Verde
+ generated/Atlantic/Faeroe /cctz/tzdata/Atlantic/Faeroe
+ generated/Atlantic/Faroe /cctz/tzdata/Atlantic/Faroe
+ generated/Atlantic/Jan_Mayen /cctz/tzdata/Atlantic/Jan_Mayen
+ generated/Atlantic/Madeira /cctz/tzdata/Atlantic/Madeira
+ generated/Atlantic/Reykjavik /cctz/tzdata/Atlantic/Reykjavik
+ generated/Atlantic/South_Georgia /cctz/tzdata/Atlantic/South_Georgia
+ generated/Atlantic/St_Helena /cctz/tzdata/Atlantic/St_Helena
+ generated/Atlantic/Stanley /cctz/tzdata/Atlantic/Stanley
+ generated/Australia/ACT /cctz/tzdata/Australia/ACT
+ generated/Australia/Adelaide /cctz/tzdata/Australia/Adelaide
+ generated/Australia/Brisbane /cctz/tzdata/Australia/Brisbane
+ generated/Australia/Broken_Hill /cctz/tzdata/Australia/Broken_Hill
+ generated/Australia/Canberra /cctz/tzdata/Australia/Canberra
+ generated/Australia/Currie /cctz/tzdata/Australia/Currie
+ generated/Australia/Darwin /cctz/tzdata/Australia/Darwin
+ generated/Australia/Eucla /cctz/tzdata/Australia/Eucla
+ generated/Australia/Hobart /cctz/tzdata/Australia/Hobart
+ generated/Australia/LHI /cctz/tzdata/Australia/LHI
+ generated/Australia/Lindeman /cctz/tzdata/Australia/Lindeman
+ generated/Australia/Lord_Howe /cctz/tzdata/Australia/Lord_Howe
+ generated/Australia/Melbourne /cctz/tzdata/Australia/Melbourne
+ generated/Australia/NSW /cctz/tzdata/Australia/NSW
+ generated/Australia/North /cctz/tzdata/Australia/North
+ generated/Australia/Perth /cctz/tzdata/Australia/Perth
+ generated/Australia/Queensland /cctz/tzdata/Australia/Queensland
+ generated/Australia/South /cctz/tzdata/Australia/South
+ generated/Australia/Sydney /cctz/tzdata/Australia/Sydney
+ generated/Australia/Tasmania /cctz/tzdata/Australia/Tasmania
+ generated/Australia/Victoria /cctz/tzdata/Australia/Victoria
+ generated/Australia/West /cctz/tzdata/Australia/West
+ generated/Australia/Yancowinna /cctz/tzdata/Australia/Yancowinna
+ generated/Brazil/Acre /cctz/tzdata/Brazil/Acre
+ generated/Brazil/DeNoronha /cctz/tzdata/Brazil/DeNoronha
+ generated/Brazil/East /cctz/tzdata/Brazil/East
+ generated/Brazil/West /cctz/tzdata/Brazil/West
+ generated/CET /cctz/tzdata/CET
+ generated/CST6CDT /cctz/tzdata/CST6CDT
+ generated/Canada/Atlantic /cctz/tzdata/Canada/Atlantic
+ generated/Canada/Central /cctz/tzdata/Canada/Central
+ generated/Canada/Eastern /cctz/tzdata/Canada/Eastern
+ generated/Canada/Mountain /cctz/tzdata/Canada/Mountain
+ generated/Canada/Newfoundland /cctz/tzdata/Canada/Newfoundland
+ generated/Canada/Pacific /cctz/tzdata/Canada/Pacific
+ generated/Canada/Saskatchewan /cctz/tzdata/Canada/Saskatchewan
+ generated/Canada/Yukon /cctz/tzdata/Canada/Yukon
+ generated/Chile/Continental /cctz/tzdata/Chile/Continental
+ generated/Chile/EasterIsland /cctz/tzdata/Chile/EasterIsland
+ generated/Cuba /cctz/tzdata/Cuba
+ generated/EET /cctz/tzdata/EET
+ generated/EST /cctz/tzdata/EST
+ generated/EST5EDT /cctz/tzdata/EST5EDT
+ generated/Egypt /cctz/tzdata/Egypt
+ generated/Eire /cctz/tzdata/Eire
+ generated/Etc/GMT /cctz/tzdata/Etc/GMT
+ generated/Etc/GMT+0 /cctz/tzdata/Etc/GMT+0
+ generated/Etc/GMT+1 /cctz/tzdata/Etc/GMT+1
+ generated/Etc/GMT+10 /cctz/tzdata/Etc/GMT+10
+ generated/Etc/GMT+11 /cctz/tzdata/Etc/GMT+11
+ generated/Etc/GMT+12 /cctz/tzdata/Etc/GMT+12
+ generated/Etc/GMT+2 /cctz/tzdata/Etc/GMT+2
+ generated/Etc/GMT+3 /cctz/tzdata/Etc/GMT+3
+ generated/Etc/GMT+4 /cctz/tzdata/Etc/GMT+4
+ generated/Etc/GMT+5 /cctz/tzdata/Etc/GMT+5
+ generated/Etc/GMT+6 /cctz/tzdata/Etc/GMT+6
+ generated/Etc/GMT+7 /cctz/tzdata/Etc/GMT+7
+ generated/Etc/GMT+8 /cctz/tzdata/Etc/GMT+8
+ generated/Etc/GMT+9 /cctz/tzdata/Etc/GMT+9
+ generated/Etc/GMT-0 /cctz/tzdata/Etc/GMT-0
+ generated/Etc/GMT-1 /cctz/tzdata/Etc/GMT-1
+ generated/Etc/GMT-10 /cctz/tzdata/Etc/GMT-10
+ generated/Etc/GMT-11 /cctz/tzdata/Etc/GMT-11
+ generated/Etc/GMT-12 /cctz/tzdata/Etc/GMT-12
+ generated/Etc/GMT-13 /cctz/tzdata/Etc/GMT-13
+ generated/Etc/GMT-14 /cctz/tzdata/Etc/GMT-14
+ generated/Etc/GMT-2 /cctz/tzdata/Etc/GMT-2
+ generated/Etc/GMT-3 /cctz/tzdata/Etc/GMT-3
+ generated/Etc/GMT-4 /cctz/tzdata/Etc/GMT-4
+ generated/Etc/GMT-5 /cctz/tzdata/Etc/GMT-5
+ generated/Etc/GMT-6 /cctz/tzdata/Etc/GMT-6
+ generated/Etc/GMT-7 /cctz/tzdata/Etc/GMT-7
+ generated/Etc/GMT-8 /cctz/tzdata/Etc/GMT-8
+ generated/Etc/GMT-9 /cctz/tzdata/Etc/GMT-9
+ generated/Etc/GMT0 /cctz/tzdata/Etc/GMT0
+ generated/Etc/Greenwich /cctz/tzdata/Etc/Greenwich
+ generated/Etc/UCT /cctz/tzdata/Etc/UCT
+ generated/Etc/UTC /cctz/tzdata/Etc/UTC
+ generated/Etc/Universal /cctz/tzdata/Etc/Universal
+ generated/Etc/Zulu /cctz/tzdata/Etc/Zulu
+ generated/Europe/Amsterdam /cctz/tzdata/Europe/Amsterdam
+ generated/Europe/Andorra /cctz/tzdata/Europe/Andorra
+ generated/Europe/Astrakhan /cctz/tzdata/Europe/Astrakhan
+ generated/Europe/Athens /cctz/tzdata/Europe/Athens
+ generated/Europe/Belfast /cctz/tzdata/Europe/Belfast
+ generated/Europe/Belgrade /cctz/tzdata/Europe/Belgrade
+ generated/Europe/Berlin /cctz/tzdata/Europe/Berlin
+ generated/Europe/Bratislava /cctz/tzdata/Europe/Bratislava
+ generated/Europe/Brussels /cctz/tzdata/Europe/Brussels
+ generated/Europe/Bucharest /cctz/tzdata/Europe/Bucharest
+ generated/Europe/Budapest /cctz/tzdata/Europe/Budapest
+ generated/Europe/Busingen /cctz/tzdata/Europe/Busingen
+ generated/Europe/Chisinau /cctz/tzdata/Europe/Chisinau
+ generated/Europe/Copenhagen /cctz/tzdata/Europe/Copenhagen
+ generated/Europe/Dublin /cctz/tzdata/Europe/Dublin
+ generated/Europe/Gibraltar /cctz/tzdata/Europe/Gibraltar
+ generated/Europe/Guernsey /cctz/tzdata/Europe/Guernsey
+ generated/Europe/Helsinki /cctz/tzdata/Europe/Helsinki
+ generated/Europe/Isle_of_Man /cctz/tzdata/Europe/Isle_of_Man
+ generated/Europe/Istanbul /cctz/tzdata/Europe/Istanbul
+ generated/Europe/Jersey /cctz/tzdata/Europe/Jersey
+ generated/Europe/Kaliningrad /cctz/tzdata/Europe/Kaliningrad
+ generated/Europe/Kiev /cctz/tzdata/Europe/Kiev
+ generated/Europe/Kirov /cctz/tzdata/Europe/Kirov
+ generated/Europe/Kyiv /cctz/tzdata/Europe/Kyiv
+ generated/Europe/Lisbon /cctz/tzdata/Europe/Lisbon
+ generated/Europe/Ljubljana /cctz/tzdata/Europe/Ljubljana
+ generated/Europe/London /cctz/tzdata/Europe/London
+ generated/Europe/Luxembourg /cctz/tzdata/Europe/Luxembourg
+ generated/Europe/Madrid /cctz/tzdata/Europe/Madrid
+ generated/Europe/Malta /cctz/tzdata/Europe/Malta
+ generated/Europe/Mariehamn /cctz/tzdata/Europe/Mariehamn
+ generated/Europe/Minsk /cctz/tzdata/Europe/Minsk
+ generated/Europe/Monaco /cctz/tzdata/Europe/Monaco
+ generated/Europe/Moscow /cctz/tzdata/Europe/Moscow
+ generated/Europe/Nicosia /cctz/tzdata/Europe/Nicosia
+ generated/Europe/Oslo /cctz/tzdata/Europe/Oslo
+ generated/Europe/Paris /cctz/tzdata/Europe/Paris
+ generated/Europe/Podgorica /cctz/tzdata/Europe/Podgorica
+ generated/Europe/Prague /cctz/tzdata/Europe/Prague
+ generated/Europe/Riga /cctz/tzdata/Europe/Riga
+ generated/Europe/Rome /cctz/tzdata/Europe/Rome
+ generated/Europe/Samara /cctz/tzdata/Europe/Samara
+ generated/Europe/San_Marino /cctz/tzdata/Europe/San_Marino
+ generated/Europe/Sarajevo /cctz/tzdata/Europe/Sarajevo
+ generated/Europe/Saratov /cctz/tzdata/Europe/Saratov
+ generated/Europe/Simferopol /cctz/tzdata/Europe/Simferopol
+ generated/Europe/Skopje /cctz/tzdata/Europe/Skopje
+ generated/Europe/Sofia /cctz/tzdata/Europe/Sofia
+ generated/Europe/Stockholm /cctz/tzdata/Europe/Stockholm
+ generated/Europe/Tallinn /cctz/tzdata/Europe/Tallinn
+ generated/Europe/Tirane /cctz/tzdata/Europe/Tirane
+ generated/Europe/Tiraspol /cctz/tzdata/Europe/Tiraspol
+ generated/Europe/Ulyanovsk /cctz/tzdata/Europe/Ulyanovsk
+ generated/Europe/Uzhgorod /cctz/tzdata/Europe/Uzhgorod
+ generated/Europe/Vaduz /cctz/tzdata/Europe/Vaduz
+ generated/Europe/Vatican /cctz/tzdata/Europe/Vatican
+ generated/Europe/Vienna /cctz/tzdata/Europe/Vienna
+ generated/Europe/Vilnius /cctz/tzdata/Europe/Vilnius
+ generated/Europe/Volgograd /cctz/tzdata/Europe/Volgograd
+ generated/Europe/Warsaw /cctz/tzdata/Europe/Warsaw
+ generated/Europe/Zagreb /cctz/tzdata/Europe/Zagreb
+ generated/Europe/Zaporozhye /cctz/tzdata/Europe/Zaporozhye
+ generated/Europe/Zurich /cctz/tzdata/Europe/Zurich
+ generated/Factory /cctz/tzdata/Factory
+ generated/GB /cctz/tzdata/GB
+ generated/GB-Eire /cctz/tzdata/GB-Eire
+ generated/GMT /cctz/tzdata/GMT
+ generated/GMT+0 /cctz/tzdata/GMT+0
+ generated/GMT-0 /cctz/tzdata/GMT-0
+ generated/GMT0 /cctz/tzdata/GMT0
+ generated/Greenwich /cctz/tzdata/Greenwich
+ generated/HST /cctz/tzdata/HST
+ generated/Hongkong /cctz/tzdata/Hongkong
+ generated/Iceland /cctz/tzdata/Iceland
+ generated/Indian/Antananarivo /cctz/tzdata/Indian/Antananarivo
+ generated/Indian/Chagos /cctz/tzdata/Indian/Chagos
+ generated/Indian/Christmas /cctz/tzdata/Indian/Christmas
+ generated/Indian/Cocos /cctz/tzdata/Indian/Cocos
+ generated/Indian/Comoro /cctz/tzdata/Indian/Comoro
+ generated/Indian/Kerguelen /cctz/tzdata/Indian/Kerguelen
+ generated/Indian/Mahe /cctz/tzdata/Indian/Mahe
+ generated/Indian/Maldives /cctz/tzdata/Indian/Maldives
+ generated/Indian/Mauritius /cctz/tzdata/Indian/Mauritius
+ generated/Indian/Mayotte /cctz/tzdata/Indian/Mayotte
+ generated/Indian/Reunion /cctz/tzdata/Indian/Reunion
+ generated/Iran /cctz/tzdata/Iran
+ generated/Israel /cctz/tzdata/Israel
+ generated/Jamaica /cctz/tzdata/Jamaica
+ generated/Japan /cctz/tzdata/Japan
+ generated/Kwajalein /cctz/tzdata/Kwajalein
+ generated/Libya /cctz/tzdata/Libya
+ generated/MET /cctz/tzdata/MET
+ generated/MST /cctz/tzdata/MST
+ generated/MST7MDT /cctz/tzdata/MST7MDT
+ generated/Mexico/BajaNorte /cctz/tzdata/Mexico/BajaNorte
+ generated/Mexico/BajaSur /cctz/tzdata/Mexico/BajaSur
+ generated/Mexico/General /cctz/tzdata/Mexico/General
+ generated/NZ /cctz/tzdata/NZ
+ generated/NZ-CHAT /cctz/tzdata/NZ-CHAT
+ generated/Navajo /cctz/tzdata/Navajo
+ generated/PRC /cctz/tzdata/PRC
+ generated/PST8PDT /cctz/tzdata/PST8PDT
+ generated/Pacific/Apia /cctz/tzdata/Pacific/Apia
+ generated/Pacific/Auckland /cctz/tzdata/Pacific/Auckland
+ generated/Pacific/Bougainville /cctz/tzdata/Pacific/Bougainville
+ generated/Pacific/Chatham /cctz/tzdata/Pacific/Chatham
+ generated/Pacific/Chuuk /cctz/tzdata/Pacific/Chuuk
+ generated/Pacific/Easter /cctz/tzdata/Pacific/Easter
+ generated/Pacific/Efate /cctz/tzdata/Pacific/Efate
+ generated/Pacific/Enderbury /cctz/tzdata/Pacific/Enderbury
+ generated/Pacific/Fakaofo /cctz/tzdata/Pacific/Fakaofo
+ generated/Pacific/Fiji /cctz/tzdata/Pacific/Fiji
+ generated/Pacific/Funafuti /cctz/tzdata/Pacific/Funafuti
+ generated/Pacific/Galapagos /cctz/tzdata/Pacific/Galapagos
+ generated/Pacific/Gambier /cctz/tzdata/Pacific/Gambier
+ generated/Pacific/Guadalcanal /cctz/tzdata/Pacific/Guadalcanal
+ generated/Pacific/Guam /cctz/tzdata/Pacific/Guam
+ generated/Pacific/Honolulu /cctz/tzdata/Pacific/Honolulu
+ generated/Pacific/Johnston /cctz/tzdata/Pacific/Johnston
+ generated/Pacific/Kanton /cctz/tzdata/Pacific/Kanton
+ generated/Pacific/Kiritimati /cctz/tzdata/Pacific/Kiritimati
+ generated/Pacific/Kosrae /cctz/tzdata/Pacific/Kosrae
+ generated/Pacific/Kwajalein /cctz/tzdata/Pacific/Kwajalein
+ generated/Pacific/Majuro /cctz/tzdata/Pacific/Majuro
+ generated/Pacific/Marquesas /cctz/tzdata/Pacific/Marquesas
+ generated/Pacific/Midway /cctz/tzdata/Pacific/Midway
+ generated/Pacific/Nauru /cctz/tzdata/Pacific/Nauru
+ generated/Pacific/Niue /cctz/tzdata/Pacific/Niue
+ generated/Pacific/Norfolk /cctz/tzdata/Pacific/Norfolk
+ generated/Pacific/Noumea /cctz/tzdata/Pacific/Noumea
+ generated/Pacific/Pago_Pago /cctz/tzdata/Pacific/Pago_Pago
+ generated/Pacific/Palau /cctz/tzdata/Pacific/Palau
+ generated/Pacific/Pitcairn /cctz/tzdata/Pacific/Pitcairn
+ generated/Pacific/Pohnpei /cctz/tzdata/Pacific/Pohnpei
+ generated/Pacific/Ponape /cctz/tzdata/Pacific/Ponape
+ generated/Pacific/Port_Moresby /cctz/tzdata/Pacific/Port_Moresby
+ generated/Pacific/Rarotonga /cctz/tzdata/Pacific/Rarotonga
+ generated/Pacific/Saipan /cctz/tzdata/Pacific/Saipan
+ generated/Pacific/Samoa /cctz/tzdata/Pacific/Samoa
+ generated/Pacific/Tahiti /cctz/tzdata/Pacific/Tahiti
+ generated/Pacific/Tarawa /cctz/tzdata/Pacific/Tarawa
+ generated/Pacific/Tongatapu /cctz/tzdata/Pacific/Tongatapu
+ generated/Pacific/Truk /cctz/tzdata/Pacific/Truk
+ generated/Pacific/Wake /cctz/tzdata/Pacific/Wake
+ generated/Pacific/Wallis /cctz/tzdata/Pacific/Wallis
+ generated/Pacific/Yap /cctz/tzdata/Pacific/Yap
+ generated/Poland /cctz/tzdata/Poland
+ generated/Portugal /cctz/tzdata/Portugal
+ generated/ROC /cctz/tzdata/ROC
+ generated/ROK /cctz/tzdata/ROK
+ generated/Singapore /cctz/tzdata/Singapore
+ generated/Turkey /cctz/tzdata/Turkey
+ generated/UCT /cctz/tzdata/UCT
+ generated/US/Alaska /cctz/tzdata/US/Alaska
+ generated/US/Aleutian /cctz/tzdata/US/Aleutian
+ generated/US/Arizona /cctz/tzdata/US/Arizona
+ generated/US/Central /cctz/tzdata/US/Central
+ generated/US/East-Indiana /cctz/tzdata/US/East-Indiana
+ generated/US/Eastern /cctz/tzdata/US/Eastern
+ generated/US/Hawaii /cctz/tzdata/US/Hawaii
+ generated/US/Indiana-Starke /cctz/tzdata/US/Indiana-Starke
+ generated/US/Michigan /cctz/tzdata/US/Michigan
+ generated/US/Mountain /cctz/tzdata/US/Mountain
+ generated/US/Pacific /cctz/tzdata/US/Pacific
+ generated/US/Samoa /cctz/tzdata/US/Samoa
+ generated/UTC /cctz/tzdata/UTC
+ generated/Universal /cctz/tzdata/Universal
+ generated/W-SU /cctz/tzdata/W-SU
+ generated/WET /cctz/tzdata/WET
+ generated/Zulu /cctz/tzdata/Zulu
+ generated/posixrules /cctz/tzdata/posixrules
+)
\ No newline at end of file
diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/__init__.py b/contrib/libs/cxxsupp/openmp/.yandex_meta/__init__.py
index 0fd8f88c8bb6..398338cb3da7 100644
--- a/contrib/libs/cxxsupp/openmp/.yandex_meta/__init__.py
+++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/__init__.py
@@ -55,7 +55,7 @@ def post_install(self):
arcdir="contrib/libs/cxxsupp/openmp",
nixattr="llvmPackages_13.openmp",
install_subdir="runtime/src",
- ignore_commands=["perl"],
+ ignore_commands=["python3.10"],
flags=[
"-DOPENMP_ENABLE_LIBOMPTARGET=OFF",
"-DOPENMP_ENABLE_LIBOMP_PROFILING=OFF",
@@ -73,8 +73,10 @@ def post_install(self):
"kmp_stats_timing.h",
"kmp_stub.h",
"legacy/ittnotify.h",
+ "libperfstat.h",
"llvm/Support/TimeProfiler.h",
"ompd-specific.h",
+ "procfs.h",
],
platform_dispatchers=["kmp_config.h"],
post_build=post_build,
diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report
index 756e43c41646..60c73f2edad0 100644
--- a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report
+++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report
@@ -128,6 +128,8 @@ BELONGS ya.make
kmp_barrier.cpp [7:8]
kmp_barrier.h [7:8]
kmp_cancel.cpp [4:5]
+ kmp_collapse.cpp [7:8]
+ kmp_collapse.h [7:8]
kmp_config-linux.h [6:7]
kmp_csupport.cpp [7:8]
kmp_debug.cpp [7:8]
@@ -167,6 +169,7 @@ BELONGS ya.make
kmp_tasking.cpp [7:8]
kmp_threadprivate.cpp [7:8]
kmp_utility.cpp [7:8]
+ kmp_utils.h [7:8]
kmp_version.cpp [7:8]
kmp_version.h [7:8]
kmp_wait_release.cpp [7:8]
@@ -196,6 +199,8 @@ BELONGS ya.make
kmp_barrier.cpp [7:8]
kmp_barrier.h [7:8]
kmp_cancel.cpp [4:5]
+ kmp_collapse.cpp [7:8]
+ kmp_collapse.h [7:8]
kmp_config-linux.h [6:7]
kmp_csupport.cpp [7:8]
kmp_debug.cpp [7:8]
@@ -235,6 +240,7 @@ BELONGS ya.make
kmp_tasking.cpp [7:8]
kmp_threadprivate.cpp [7:8]
kmp_utility.cpp [7:8]
+ kmp_utils.h [7:8]
kmp_version.cpp [7:8]
kmp_version.h [7:8]
kmp_wait_release.cpp [7:8]
@@ -330,6 +336,8 @@ BELONGS ya.make
kmp_barrier.cpp [9:9]
kmp_barrier.h [9:9]
kmp_cancel.cpp [6:6]
+ kmp_collapse.cpp [9:9]
+ kmp_collapse.h [9:9]
kmp_config-linux.h [8:8]
kmp_csupport.cpp [9:9]
kmp_debug.cpp [9:9]
@@ -369,6 +377,7 @@ BELONGS ya.make
kmp_tasking.cpp [9:9]
kmp_threadprivate.cpp [9:9]
kmp_utility.cpp [9:9]
+ kmp_utils.h [9:9]
kmp_version.cpp [9:9]
kmp_version.h [9:9]
kmp_wait_release.cpp [9:9]
@@ -398,6 +407,8 @@ BELONGS ya.make
kmp_barrier.cpp [9:9]
kmp_barrier.h [9:9]
kmp_cancel.cpp [6:6]
+ kmp_collapse.cpp [9:9]
+ kmp_collapse.h [9:9]
kmp_config-linux.h [8:8]
kmp_csupport.cpp [9:9]
kmp_debug.cpp [9:9]
@@ -437,6 +448,7 @@ BELONGS ya.make
kmp_tasking.cpp [9:9]
kmp_threadprivate.cpp [9:9]
kmp_utility.cpp [9:9]
+ kmp_utils.h [9:9]
kmp_version.cpp [9:9]
kmp_version.h [9:9]
kmp_wait_release.cpp [9:9]
diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix b/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix
index 64b4741ad4ab..071076d48b16 100644
--- a/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix
+++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix
@@ -1,18 +1,15 @@
pkgs: attrs: with pkgs; with attrs; rec {
pname = "openmp";
- version = "15.0.7";
+ version = "20.1.7";
src = fetchFromGitHub {
owner = "llvm";
repo = "llvm-project";
rev = "llvmorg-${version}";
- hash = "sha256-wjuZQyXQ/jsmvy6y1aksCcEDXGBjuhpgngF3XQJ/T4s=";
+ hash = "sha256-OSd26CLKziKo/eM/5rhtcWd0AxdtJk0ELA5YIxqINKs=";
};
- # This hack makes message-converter.pl script to not emit time on every build.
- preConfigure = ''
- substituteInPlace "runtime/tools/message-converter.pl" --replace "\" on \" . localtime() . " ""
- '';
+ buildInputs = [ pkgs.python3 ];
sourceRoot = "source/openmp";
}
diff --git a/contrib/libs/cxxsupp/openmp/README.rst b/contrib/libs/cxxsupp/openmp/README.rst
index ffa49e4d2a49..2dfc8630858b 100644
--- a/contrib/libs/cxxsupp/openmp/README.rst
+++ b/contrib/libs/cxxsupp/openmp/README.rst
@@ -119,6 +119,10 @@ Options for all Libraries
Compiler to use for testing. Defaults to the compiler that was also used for
building.
+**OPENMP_TEST_Fortran_COMPILER** = ``${CMAKE_Fortran_COMPILER}``
+ Compiler to use for testing. Defaults to the compiler that was also used for
+ building. Will default to flang if build is in-tree.
+
**OPENMP_LLVM_TOOLS_DIR** = ``/path/to/built/llvm/tools``
Additional path to search for LLVM tools needed by tests.
@@ -137,7 +141,7 @@ Options for all Libraries
Options for ``libomp``
----------------------
-**LIBOMP_ARCH** = ``aarch64|arm|i386|mic|mips|mips64|ppc64|ppc64le|x86_64|riscv64``
+**LIBOMP_ARCH** = ``aarch64|aarch64_32|arm|i386|loongarch64|mic|mips|mips64|ppc64|ppc64le|x86_64|riscv64|s390x``
The default value for this option is chosen based on probing the compiler for
architecture macros (e.g., is ``__x86_64__`` predefined by compiler?).
@@ -194,7 +198,7 @@ Optional Features
**LIBOMP_OMPT_SUPPORT** = ``ON|OFF``
Include support for the OpenMP Tools Interface (OMPT).
This option is supported and ``ON`` by default for x86, x86_64, AArch64,
- PPC64 and RISCV64 on Linux* and macOS*.
+ PPC64, RISCV64, LoongArch64, and s390x on Linux* and macOS*.
This option is ``OFF`` if this feature is not supported for the platform.
**LIBOMP_OMPT_OPTIONAL** = ``ON|OFF``
@@ -357,3 +361,35 @@ Advanced Builds with Various Options
**Footnotes**
.. [*] Other names and brands may be claimed as the property of others.
+
+How to Run Tests
+================
+
+There are following check-* make targets for tests.
+
+- ``check-ompt`` (ompt tests under runtime/test/ompt)
+- ``check-ompt-multiplex`` (ompt multiplex tests under tools/multiplex/tests)
+- ``check-libarcher`` (libarcher tests under tools/archer/tests)
+- ``check-libomp`` (libomp tests under runtime/test. This includes check-ompt tests too)
+- ``check-libomptarget-*`` (libomptarget tests for specific target under libomptarget/test)
+- ``check-libomptarget`` (all check-libomptarget-* tests)
+- ``check-openmp`` (combination of all above tests excluding duplicates)
+
+For example, to run all available tests, use ``make check-openmp``.
+
+Options for Tests
+------------------
+Tests use lit framework.
+See `lit documentation `_ for lit options.
+
+**CHECK_OPENMP_ENV** = ``""``
+ Default environment variables which test process uses for ``check-openmp``
+ separated by space. This can be used for individual targets (``check-ompt``,
+ ``check-ompt-multiplex``, ``check-libarcher``, ``check-libomp`` and
+ ``check-libomptarget-*``) too. Note that each test still overrides
+ environment variables if needed. For example, to change barrier pattern to be
+ used from default hyper barrier to hierarchical barrier, run:
+
+.. code-block:: console
+
+ $ CHECK_OPENMP_ENV="KMP_PLAIN_BARRIER_PATTERN=hier,hier KMP_FORKJOIN_BARRIER_PATTERN=hier,hier KMP_REDUCTION_BARRIER_PATTERN=hier,hier" make check-openmp
diff --git a/contrib/libs/cxxsupp/openmp/exports_so.txt b/contrib/libs/cxxsupp/openmp/exports_so.txt
index ac188af31055..124c80a1422b 100644
--- a/contrib/libs/cxxsupp/openmp/exports_so.txt
+++ b/contrib/libs/cxxsupp/openmp/exports_so.txt
@@ -26,6 +26,7 @@ VERSION {
# OMPT API
#
ompt_start_tool; # OMPT start interface
+ ompt_libomp_connect; # OMPT libomptarget interface
ompc_*; # omp.h renames some standard functions to ompc_*.
kmp_*; # Intel extensions.
@@ -71,10 +72,8 @@ VERSION {
__kmp_fork_call;
__kmp_invoke_microtask;
#if KMP_USE_MONITOR
- __kmp_launch_monitor;
__kmp_reap_monitor;
#endif
- __kmp_launch_worker;
__kmp_reap_worker;
__kmp_release_64;
__kmp_wait_64;
diff --git a/contrib/libs/cxxsupp/openmp/kmp.h b/contrib/libs/cxxsupp/openmp/kmp.h
index 8c84b83b1471..05a142a7b32e 100644
--- a/contrib/libs/cxxsupp/openmp/kmp.h
+++ b/contrib/libs/cxxsupp/openmp/kmp.h
@@ -27,6 +27,9 @@
#ifndef KMP_STATIC_STEAL_ENABLED
#define KMP_STATIC_STEAL_ENABLED 1
#endif
+#define KMP_WEIGHTED_ITERATIONS_SUPPORTED \
+ (KMP_AFFINITY_SUPPORTED && KMP_STATIC_STEAL_ENABLED && \
+ (KMP_ARCH_X86 || KMP_ARCH_X86_64))
#define TASK_CURRENT_NOT_QUEUED 0
#define TASK_CURRENT_QUEUED 1
@@ -60,7 +63,15 @@
#undef KMP_CANCEL_THREADS
#endif
+// Some WASI targets (e.g., wasm32-wasi-threads) do not support thread
+// cancellation.
+#if KMP_OS_WASI
+#undef KMP_CANCEL_THREADS
+#endif
+
+#if !KMP_OS_WASI
#include
+#endif
#include
#include
#include
@@ -92,7 +103,8 @@ class kmp_stats_list;
#define KMP_USE_HIER_SCHED KMP_AFFINITY_SUPPORTED
#endif
-#if KMP_USE_HWLOC && KMP_AFFINITY_SUPPORTED
+// OMPD_SKIP_HWLOC used in libompd/omp-icv.cpp to avoid OMPD depending on hwloc
+#if KMP_USE_HWLOC && KMP_AFFINITY_SUPPORTED && !defined(OMPD_SKIP_HWLOC)
#include "hwloc.h"
#ifndef HWLOC_OBJ_NUMANODE
#define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE
@@ -121,7 +133,7 @@ class kmp_stats_list;
#endif
#include "kmp_i18n.h"
-#define KMP_HANDLE_SIGNALS (KMP_OS_UNIX || KMP_OS_WINDOWS)
+#define KMP_HANDLE_SIGNALS ((KMP_OS_UNIX && !KMP_OS_WASI) || KMP_OS_WINDOWS)
#include "kmp_wrapper_malloc.h"
#if KMP_OS_UNIX
@@ -180,6 +192,7 @@ class kmp_stats_list;
#define KMP_NSEC_PER_SEC 1000000000L
#define KMP_USEC_PER_SEC 1000000L
+#define KMP_NSEC_PER_USEC 1000L
/*!
@ingroup BASIC_TYPES
@@ -519,6 +532,15 @@ enum clock_function_type {
enum mic_type { non_mic, mic1, mic2, mic3, dummy };
#endif
+// OpenMP 3.1 - Nested num threads array
+typedef struct kmp_nested_nthreads_t {
+ int *nth;
+ int size;
+ int used;
+} kmp_nested_nthreads_t;
+
+extern kmp_nested_nthreads_t __kmp_nested_nth;
+
/* -- fast reduction stuff ------------------------------------------------ */
#undef KMP_FAST_REDUCTION_BARRIER
@@ -597,7 +619,9 @@ typedef int PACKED_REDUCTION_METHOD_T;
#endif
#if KMP_OS_UNIX
+#if !KMP_OS_WASI
#include
+#endif
#include
#endif
@@ -675,7 +699,7 @@ typedef BOOL (*kmp_SetThreadGroupAffinity_t)(HANDLE, const GROUP_AFFINITY *,
extern kmp_SetThreadGroupAffinity_t __kmp_SetThreadGroupAffinity;
#endif /* KMP_OS_WINDOWS */
-#if KMP_USE_HWLOC
+#if KMP_USE_HWLOC && !defined(OMPD_SKIP_HWLOC)
extern hwloc_topology_t __kmp_hwloc_topology;
extern int __kmp_hwloc_error;
#endif
@@ -690,10 +714,12 @@ extern size_t __kmp_affin_mask_size;
#define KMP_CPU_ISSET(i, mask) (mask)->is_set(i)
#define KMP_CPU_CLR(i, mask) (mask)->clear(i)
#define KMP_CPU_ZERO(mask) (mask)->zero()
+#define KMP_CPU_ISEMPTY(mask) (mask)->empty()
#define KMP_CPU_COPY(dest, src) (dest)->copy(src)
#define KMP_CPU_AND(dest, src) (dest)->bitwise_and(src)
#define KMP_CPU_COMPLEMENT(max_bit_number, mask) (mask)->bitwise_not()
#define KMP_CPU_UNION(dest, src) (dest)->bitwise_or(src)
+#define KMP_CPU_EQUAL(dest, src) (dest)->is_equal(src)
#define KMP_CPU_ALLOC(ptr) (ptr = __kmp_affinity_dispatch->allocate_mask())
#define KMP_CPU_FREE(ptr) __kmp_affinity_dispatch->deallocate_mask(ptr)
#define KMP_CPU_ALLOC_ON_STACK(ptr) KMP_CPU_ALLOC(ptr)
@@ -730,6 +756,8 @@ class KMPAffinity {
virtual void clear(int i) {}
// Zero out entire mask
virtual void zero() {}
+ // Check whether mask is empty
+ virtual bool empty() const { return true; }
// Copy src into this mask
virtual void copy(const Mask *src) {}
// this &= rhs
@@ -738,6 +766,8 @@ class KMPAffinity {
virtual void bitwise_or(const Mask *rhs) {}
// this = ~this
virtual void bitwise_not() {}
+ // this == rhs
+ virtual bool is_equal(const Mask *rhs) const { return false; }
// API for iterating over an affinity mask
// for (int i = mask->begin(); i != mask->end(); i = mask->next(i))
virtual int begin() const { return 0; }
@@ -753,6 +783,15 @@ class KMPAffinity {
// Only 1 DWORD in the mask should have any procs set.
// Return the appropriate index, or -1 for an invalid mask.
virtual int get_proc_group() const { return -1; }
+ int get_max_cpu() const {
+ int cpu;
+ int max_cpu = -1;
+ KMP_CPU_SET_ITERATE(cpu, this) {
+ if (cpu > max_cpu)
+ max_cpu = cpu;
+ }
+ return max_cpu;
+ }
};
void *operator new(size_t n);
void operator delete(void *p);
@@ -789,6 +828,33 @@ class KMPAffinity {
typedef KMPAffinity::Mask kmp_affin_mask_t;
extern KMPAffinity *__kmp_affinity_dispatch;
+#ifndef KMP_OS_AIX
+class kmp_affinity_raii_t {
+ kmp_affin_mask_t *mask;
+ bool restored;
+
+public:
+ kmp_affinity_raii_t(const kmp_affin_mask_t *new_mask = nullptr)
+ : mask(nullptr), restored(false) {
+ if (KMP_AFFINITY_CAPABLE()) {
+ KMP_CPU_ALLOC(mask);
+ KMP_ASSERT(mask != NULL);
+ __kmp_get_system_affinity(mask, /*abort_on_error=*/true);
+ if (new_mask)
+ __kmp_set_system_affinity(new_mask, /*abort_on_error=*/true);
+ }
+ }
+ void restore() {
+ if (mask && KMP_AFFINITY_CAPABLE() && !restored) {
+ __kmp_set_system_affinity(mask, /*abort_on_error=*/true);
+ KMP_CPU_FREE(mask);
+ }
+ restored = true;
+ }
+ ~kmp_affinity_raii_t() { restore(); }
+};
+#endif // !KMP_OS_AIX
+
// Declare local char buffers with this size for printing debug and info
// messages, using __kmp_affinity_print_mask().
#define KMP_AFFIN_MASK_PRINT_LEN 1024
@@ -823,27 +889,77 @@ enum affinity_top_method {
affinity_top_method_default
};
-#define affinity_respect_mask_default (-1)
+#define affinity_respect_mask_default (2)
+
+typedef struct kmp_affinity_flags_t {
+ unsigned dups : 1;
+ unsigned verbose : 1;
+ unsigned warnings : 1;
+ unsigned respect : 2;
+ unsigned reset : 1;
+ unsigned initialized : 1;
+ unsigned core_types_gran : 1;
+ unsigned core_effs_gran : 1;
+ unsigned omp_places : 1;
+ unsigned reserved : 22;
+} kmp_affinity_flags_t;
+KMP_BUILD_ASSERT(sizeof(kmp_affinity_flags_t) == 4);
+
+typedef struct kmp_affinity_ids_t {
+ int os_id;
+ int ids[KMP_HW_LAST];
+} kmp_affinity_ids_t;
+
+typedef struct kmp_affinity_attrs_t {
+ int core_type : 8;
+ int core_eff : 8;
+ unsigned valid : 1;
+ unsigned reserved : 15;
+} kmp_affinity_attrs_t;
+#define KMP_AFFINITY_ATTRS_UNKNOWN \
+ { KMP_HW_CORE_TYPE_UNKNOWN, kmp_hw_attr_t::UNKNOWN_CORE_EFF, 0, 0 }
+
+typedef struct kmp_affinity_t {
+ char *proclist;
+ enum affinity_type type;
+ kmp_hw_t gran;
+ int gran_levels;
+ kmp_affinity_attrs_t core_attr_gran;
+ int compact;
+ int offset;
+ kmp_affinity_flags_t flags;
+ unsigned num_masks;
+ kmp_affin_mask_t *masks;
+ kmp_affinity_ids_t *ids;
+ kmp_affinity_attrs_t *attrs;
+ unsigned num_os_id_masks;
+ kmp_affin_mask_t *os_id_masks;
+ const char *env_var;
+} kmp_affinity_t;
+
+#define KMP_AFFINITY_INIT(env) \
+ { \
+ nullptr, affinity_default, KMP_HW_UNKNOWN, -1, KMP_AFFINITY_ATTRS_UNKNOWN, \
+ 0, 0, \
+ {TRUE, FALSE, TRUE, affinity_respect_mask_default, FALSE, FALSE, \
+ FALSE, FALSE, FALSE}, \
+ 0, nullptr, nullptr, nullptr, 0, nullptr, env \
+ }
-extern enum affinity_type __kmp_affinity_type; /* Affinity type */
-extern kmp_hw_t __kmp_affinity_gran; /* Affinity granularity */
-extern int __kmp_affinity_gran_levels; /* corresponding int value */
-extern int __kmp_affinity_dups; /* Affinity duplicate masks */
extern enum affinity_top_method __kmp_affinity_top_method;
-extern int __kmp_affinity_compact; /* Affinity 'compact' value */
-extern int __kmp_affinity_offset; /* Affinity offset value */
-extern int __kmp_affinity_verbose; /* Was verbose specified for KMP_AFFINITY? */
-extern int __kmp_affinity_warnings; /* KMP_AFFINITY warnings enabled ? */
-extern int __kmp_affinity_respect_mask; // Respect process' init affinity mask?
-extern char *__kmp_affinity_proclist; /* proc ID list */
-extern kmp_affin_mask_t *__kmp_affinity_masks;
-extern unsigned __kmp_affinity_num_masks;
+extern kmp_affinity_t __kmp_affinity;
+extern kmp_affinity_t __kmp_hh_affinity;
+extern kmp_affinity_t *__kmp_affinities[2];
+
extern void __kmp_affinity_bind_thread(int which);
extern kmp_affin_mask_t *__kmp_affin_fullMask;
extern kmp_affin_mask_t *__kmp_affin_origMask;
extern char *__kmp_cpuinfo_file;
-extern bool __kmp_affin_reset;
+
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+extern int __kmp_first_osid_with_ecore;
+#endif
#endif /* KMP_AFFINITY_SUPPORTED */
@@ -882,7 +998,7 @@ extern char *__kmp_tool_libraries;
#define KMP_AFFINITY_NON_PROC_BIND \
((__kmp_nested_proc_bind.bind_types[0] == proc_bind_false || \
__kmp_nested_proc_bind.bind_types[0] == proc_bind_intel) && \
- (__kmp_affinity_num_masks > 0 || __kmp_affinity_type == affinity_balanced))
+ (__kmp_affinity.num_masks > 0 || __kmp_affinity.type == affinity_balanced))
#endif /* KMP_AFFINITY_SUPPORTED */
extern int __kmp_affinity_num_places;
@@ -1009,6 +1125,7 @@ typedef struct kmp_allocator_t {
kmp_allocator_t *fb_data;
kmp_uint64 pool_size;
kmp_uint64 pool_used;
+ bool pinned;
} kmp_allocator_t;
extern omp_allocator_handle_t __kmpc_init_allocator(int gtid,
@@ -1044,6 +1161,12 @@ extern void __kmp_init_target_mem();
/* ------------------------------------------------------------------------ */
+#if ENABLE_LIBOMPTARGET
+extern void __kmp_init_target_task();
+#endif
+
+/* ------------------------------------------------------------------------ */
+
#define KMP_UINT64_MAX \
(~((kmp_uint64)1 << ((sizeof(kmp_uint64) * (1 << 3)) - 1)))
@@ -1053,23 +1176,41 @@ extern void __kmp_init_target_mem();
#if defined(PTHREAD_THREADS_MAX) && PTHREAD_THREADS_MAX < INT_MAX
#define KMP_MAX_NTH PTHREAD_THREADS_MAX
#else
+#ifdef __ve__
+// VE's pthread supports only up to 64 threads per a VE process.
+// Please check p. 14 of following documentation for more details.
+// https://sxauroratsubasa.sakura.ne.jp/documents/veos/en/VEOS_high_level_design.pdf
+#define KMP_MAX_NTH 64
+#else
#define KMP_MAX_NTH INT_MAX
#endif
+#endif
#endif /* KMP_MAX_NTH */
#ifdef PTHREAD_STACK_MIN
-#define KMP_MIN_STKSIZE PTHREAD_STACK_MIN
+#define KMP_MIN_STKSIZE ((size_t)PTHREAD_STACK_MIN)
#else
#define KMP_MIN_STKSIZE ((size_t)(32 * 1024))
#endif
+#if KMP_OS_AIX && KMP_ARCH_PPC
+#define KMP_MAX_STKSIZE 0x10000000 /* 256Mb max size on 32-bit AIX */
+#else
#define KMP_MAX_STKSIZE (~((size_t)1 << ((sizeof(size_t) * (1 << 3)) - 1)))
+#endif
#if KMP_ARCH_X86
#define KMP_DEFAULT_STKSIZE ((size_t)(2 * 1024 * 1024))
#elif KMP_ARCH_X86_64
#define KMP_DEFAULT_STKSIZE ((size_t)(4 * 1024 * 1024))
#define KMP_BACKUP_STKSIZE ((size_t)(2 * 1024 * 1024))
+#elif KMP_ARCH_VE
+// Minimum stack size for pthread for VE is 4MB.
+// https://www.hpc.nec/documents/veos/en/glibc/Difference_Points_glibc.htm
+#define KMP_DEFAULT_STKSIZE ((size_t)(4 * 1024 * 1024))
+#elif KMP_OS_AIX
+// The default stack size for worker threads on AIX is 4MB.
+#define KMP_DEFAULT_STKSIZE ((size_t)(4 * 1024 * 1024))
#else
#define KMP_DEFAULT_STKSIZE ((size_t)(1024 * 1024))
#endif
@@ -1091,13 +1232,13 @@ extern void __kmp_init_target_mem();
#define KMP_MAX_STKPADDING (2 * 1024 * 1024)
#define KMP_BLOCKTIME_MULTIPLIER \
- (1000) /* number of blocktime units per second */
+ (1000000) /* number of blocktime units per second */
#define KMP_MIN_BLOCKTIME (0)
#define KMP_MAX_BLOCKTIME \
(INT_MAX) /* Must be this for "infinite" setting the work */
-/* __kmp_blocktime is in milliseconds */
-#define KMP_DEFAULT_BLOCKTIME (__kmp_is_hybrid_cpu() ? (0) : (200))
+/* __kmp_blocktime is in microseconds */
+#define KMP_DEFAULT_BLOCKTIME (__kmp_is_hybrid_cpu() ? (0) : (200000))
#if KMP_USE_MONITOR
#define KMP_DEFAULT_MONITOR_STKSIZE ((size_t)(1024 * 1024))
@@ -1124,22 +1265,21 @@ extern void __kmp_init_target_mem();
#if KMP_OS_UNIX && (KMP_ARCH_X86 || KMP_ARCH_X86_64)
// HW TSC is used to reduce overhead (clock tick instead of nanosecond).
extern kmp_uint64 __kmp_ticks_per_msec;
+extern kmp_uint64 __kmp_ticks_per_usec;
#if KMP_COMPILER_ICC || KMP_COMPILER_ICX
#define KMP_NOW() ((kmp_uint64)_rdtsc())
#else
#define KMP_NOW() __kmp_hardware_timestamp()
#endif
-#define KMP_NOW_MSEC() (KMP_NOW() / __kmp_ticks_per_msec)
#define KMP_BLOCKTIME_INTERVAL(team, tid) \
- (KMP_BLOCKTIME(team, tid) * __kmp_ticks_per_msec)
+ ((kmp_uint64)KMP_BLOCKTIME(team, tid) * __kmp_ticks_per_usec)
#define KMP_BLOCKING(goal, count) ((goal) > KMP_NOW())
#else
// System time is retrieved sporadically while blocking.
extern kmp_uint64 __kmp_now_nsec();
#define KMP_NOW() __kmp_now_nsec()
-#define KMP_NOW_MSEC() (KMP_NOW() / KMP_USEC_PER_SEC)
#define KMP_BLOCKTIME_INTERVAL(team, tid) \
- (KMP_BLOCKTIME(team, tid) * KMP_USEC_PER_SEC)
+ ((kmp_uint64)KMP_BLOCKTIME(team, tid) * (kmp_uint64)KMP_NSEC_PER_USEC)
#define KMP_BLOCKING(goal, count) ((count) % 1000 != 0 || (goal) > KMP_NOW())
#endif
#endif // KMP_USE_MONITOR
@@ -1217,12 +1357,24 @@ extern kmp_uint64 __kmp_now_nsec();
/* TODO: tune for KMP_OS_NETBSD */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
+#elif KMP_OS_OPENBSD
+/* TODO: tune for KMP_OS_OPENBSD */
+#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
+#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
#elif KMP_OS_HURD
/* TODO: tune for KMP_OS_HURD */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
-#elif KMP_OS_OPENBSD
-/* TODO: tune for KMP_OS_OPENBSD */
+#elif KMP_OS_SOLARIS
+/* TODO: tune for KMP_OS_SOLARIS */
+#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
+#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
+#elif KMP_OS_WASI
+/* TODO: tune for KMP_OS_WASI */
+#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
+#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
+#elif KMP_OS_AIX
+/* TODO: tune for KMP_OS_AIX */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
#endif
@@ -1251,8 +1403,6 @@ typedef struct kmp_cpuinfo {
int stepping; // CPUID(1).EAX[3:0] ( Stepping )
kmp_cpuinfo_flags_t flags;
int apic_id;
- int physical_id;
- int logical_id;
kmp_uint64 frequency; // Nominal CPU frequency in Hz.
char name[3 * sizeof(kmp_cpuid_t)]; // CPUID(0x80000002,0x80000003,0x80000004)
} kmp_cpuinfo_t;
@@ -1472,6 +1622,7 @@ static inline void __kmp_x86_pause(void) { _mm_pause(); }
// requested. Uses a timed TPAUSE, and exponential backoff. If TPAUSE isn't
// available, fall back to the regular CPU pause and yield combination.
#if KMP_HAVE_UMWAIT
+#define KMP_TPAUSE_MAX_MASK ((kmp_uint64)0xFFFF)
#define KMP_YIELD_OVERSUB_ELSE_SPIN(count, time) \
{ \
if (__kmp_tpause_enabled) { \
@@ -1480,7 +1631,7 @@ static inline void __kmp_x86_pause(void) { _mm_pause(); }
} else { \
__kmp_tpause(__kmp_tpause_hint, (time)); \
} \
- (time) *= 2; \
+ (time) = (time << 1 | 1) & KMP_TPAUSE_MAX_MASK; \
} else { \
KMP_CPU_PAUSE(); \
if ((KMP_TRY_YIELD_OVERSUB)) { \
@@ -1734,12 +1885,9 @@ typedef struct kmp_sched_flags {
unsigned ordered : 1;
unsigned nomerge : 1;
unsigned contains_last : 1;
-#if KMP_USE_HIER_SCHED
- unsigned use_hier : 1;
- unsigned unused : 28;
-#else
- unsigned unused : 29;
-#endif
+ unsigned use_hier : 1; // Used in KMP_USE_HIER_SCHED code
+ unsigned use_hybrid : 1; // Used in KMP_WEIGHTED_ITERATIONS_SUPPORTED code
+ unsigned unused : 27;
} kmp_sched_flags_t;
KMP_BUILD_ASSERT(sizeof(kmp_sched_flags_t) == 4);
@@ -1753,26 +1901,37 @@ typedef struct KMP_ALIGN_CACHE dispatch_private_info32 {
kmp_int32 st;
kmp_int32 tc;
kmp_lock_t *steal_lock; // lock used for chunk stealing
+
+ kmp_uint32 ordered_lower;
+ kmp_uint32 ordered_upper;
+
// KMP_ALIGN(32) ensures (if the KMP_ALIGN macro is turned on)
// a) parm3 is properly aligned and
// b) all parm1-4 are on the same cache line.
// Because of parm1-4 are used together, performance seems to be better
// if they are on the same cache line (not measured though).
- struct KMP_ALIGN(32) { // AC: changed 16 to 32 in order to simplify template
- kmp_int32 parm1; // structures in kmp_dispatch.cpp. This should
- kmp_int32 parm2; // make no real change at least while padding is off.
+ struct KMP_ALIGN(32) {
+ kmp_int32 parm1;
+ kmp_int32 parm2;
kmp_int32 parm3;
kmp_int32 parm4;
};
- kmp_uint32 ordered_lower;
- kmp_uint32 ordered_upper;
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ kmp_uint32 pchunks;
+ kmp_uint32 num_procs_with_pcore;
+ kmp_int32 first_thread_with_ecore;
+#endif
#if KMP_OS_WINDOWS
kmp_int32 last_upper;
#endif /* KMP_OS_WINDOWS */
} dispatch_private_info32_t;
+#if CACHE_LINE <= 128
+KMP_BUILD_ASSERT(sizeof(dispatch_private_info32_t) <= 128);
+#endif
+
typedef struct KMP_ALIGN_CACHE dispatch_private_info64 {
kmp_int64 count; // current chunk number for static & static-steal scheduling
kmp_int64 ub; /* upper-bound */
@@ -1781,14 +1940,16 @@ typedef struct KMP_ALIGN_CACHE dispatch_private_info64 {
kmp_int64 st; /* stride */
kmp_int64 tc; /* trip count (number of iterations) */
kmp_lock_t *steal_lock; // lock used for chunk stealing
+
+ kmp_uint64 ordered_lower;
+ kmp_uint64 ordered_upper;
/* parm[1-4] are used in different ways by different scheduling algorithms */
- // KMP_ALIGN( 32 ) ensures ( if the KMP_ALIGN macro is turned on )
+ // KMP_ALIGN(32) ensures ( if the KMP_ALIGN macro is turned on )
// a) parm3 is properly aligned and
// b) all parm1-4 are in the same cache line.
// Because of parm1-4 are used together, performance seems to be better
// if they are in the same line (not measured though).
-
struct KMP_ALIGN(32) {
kmp_int64 parm1;
kmp_int64 parm2;
@@ -1796,12 +1957,21 @@ typedef struct KMP_ALIGN_CACHE dispatch_private_info64 {
kmp_int64 parm4;
};
- kmp_uint64 ordered_lower;
- kmp_uint64 ordered_upper;
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ kmp_uint64 pchunks;
+ kmp_uint64 num_procs_with_pcore;
+ kmp_int64 first_thread_with_ecore;
+#endif
+
#if KMP_OS_WINDOWS
kmp_int64 last_upper;
#endif /* KMP_OS_WINDOWS */
} dispatch_private_info64_t;
+
+#if CACHE_LINE <= 128
+KMP_BUILD_ASSERT(sizeof(dispatch_private_info64_t) <= 128);
+#endif
+
#else /* KMP_STATIC_STEAL_ENABLED */
typedef struct KMP_ALIGN_CACHE dispatch_private_info32 {
kmp_int32 lb;
@@ -2011,6 +2181,7 @@ typedef struct kmp_internal_control {
int nproc; /* internal control for #threads for next parallel region (per
thread) */
int thread_limit; /* internal control for thread-limit-var */
+ int task_thread_limit; /* internal control for thread-limit-var of a task*/
int max_active_levels; /* internal control for max_active_levels */
kmp_r_sched_t
sched; /* internal control for runtime schedule {sched,chunk} pair */
@@ -2337,19 +2508,30 @@ typedef struct kmp_dephash_entry kmp_dephash_entry_t;
#define KMP_DEP_MTX 0x4
#define KMP_DEP_SET 0x8
#define KMP_DEP_ALL 0x80
-// Compiler sends us this info:
+// Compiler sends us this info. Note: some test cases contain an explicit copy
+// of this struct and should be in sync with any changes here.
typedef struct kmp_depend_info {
kmp_intptr_t base_addr;
size_t len;
union {
kmp_uint8 flag; // flag as an unsigned char
struct { // flag as a set of 8 bits
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ /* Same fields as in the #else branch, but in reverse order */
+ unsigned all : 1;
+ unsigned unused : 3;
+ unsigned set : 1;
+ unsigned mtx : 1;
+ unsigned out : 1;
+ unsigned in : 1;
+#else
unsigned in : 1;
unsigned out : 1;
unsigned mtx : 1;
unsigned set : 1;
unsigned unused : 3;
unsigned all : 1;
+#endif
} flags;
};
} kmp_depend_info_t;
@@ -2424,6 +2606,63 @@ typedef struct {
} ed;
} kmp_event_t;
+#if OMPX_TASKGRAPH
+// Initial number of allocated nodes while recording
+#define INIT_MAPSIZE 50
+
+typedef struct kmp_taskgraph_flags { /*This needs to be exactly 32 bits */
+ unsigned nowait : 1;
+ unsigned re_record : 1;
+ unsigned reserved : 30;
+} kmp_taskgraph_flags_t;
+
+/// Represents a TDG node
+typedef struct kmp_node_info {
+ kmp_task_t *task; // Pointer to the actual task
+ kmp_int32 *successors; // Array of the succesors ids
+ kmp_int32 nsuccessors; // Number of succesors of the node
+ std::atomic
+ npredecessors_counter; // Number of predessors on the fly
+ kmp_int32 npredecessors; // Total number of predecessors
+ kmp_int32 successors_size; // Number of allocated succesors ids
+ kmp_taskdata_t *parent_task; // Parent implicit task
+} kmp_node_info_t;
+
+/// Represent a TDG's current status
+typedef enum kmp_tdg_status {
+ KMP_TDG_NONE = 0,
+ KMP_TDG_RECORDING = 1,
+ KMP_TDG_READY = 2
+} kmp_tdg_status_t;
+
+/// Structure that contains a TDG
+typedef struct kmp_tdg_info {
+ kmp_int32 tdg_id; // Unique idenfifier of the TDG
+ kmp_taskgraph_flags_t tdg_flags; // Flags related to a TDG
+ kmp_int32 map_size; // Number of allocated TDG nodes
+ kmp_int32 num_roots; // Number of roots tasks int the TDG
+ kmp_int32 *root_tasks; // Array of tasks identifiers that are roots
+ kmp_node_info_t *record_map; // Array of TDG nodes
+ kmp_tdg_status_t tdg_status =
+ KMP_TDG_NONE; // Status of the TDG (recording, ready...)
+ std::atomic num_tasks; // Number of TDG nodes
+ kmp_bootstrap_lock_t
+ graph_lock; // Protect graph attributes when updated via taskloop_recur
+ // Taskloop reduction related
+ void *rec_taskred_data; // Data to pass to __kmpc_task_reduction_init or
+ // __kmpc_taskred_init
+ kmp_int32 rec_num_taskred;
+} kmp_tdg_info_t;
+
+extern int __kmp_tdg_dot;
+extern kmp_int32 __kmp_max_tdgs;
+extern kmp_tdg_info_t **__kmp_global_tdgs;
+extern kmp_int32 __kmp_curr_tdg_idx;
+extern kmp_int32 __kmp_successors_size;
+extern std::atomic __kmp_tdg_task_id;
+extern kmp_int32 __kmp_num_tdg;
+#endif
+
#ifdef BUILD_TIED_TASK_STACK
/* Tied Task stack definitions */
@@ -2442,6 +2681,34 @@ typedef struct kmp_task_stack {
#endif // BUILD_TIED_TASK_STACK
typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 bits */
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ /* Same fields as in the #else branch, but in reverse order */
+#if OMPX_TASKGRAPH
+ unsigned reserved31 : 5;
+ unsigned onced : 1;
+#else
+ unsigned reserved31 : 6;
+#endif
+ unsigned target : 1;
+ unsigned native : 1;
+ unsigned freed : 1;
+ unsigned complete : 1;
+ unsigned executing : 1;
+ unsigned started : 1;
+ unsigned team_serial : 1;
+ unsigned tasking_ser : 1;
+ unsigned task_serial : 1;
+ unsigned tasktype : 1;
+ unsigned reserved : 8;
+ unsigned hidden_helper : 1;
+ unsigned detachable : 1;
+ unsigned priority_specified : 1;
+ unsigned proxy : 1;
+ unsigned destructors_thunk : 1;
+ unsigned merged_if0 : 1;
+ unsigned final : 1;
+ unsigned tiedness : 1;
+#else
/* Compiler flags */ /* Total compiler flags must be 16 bits */
unsigned tiedness : 1; /* task is either tied (1) or untied (0) */
unsigned final : 1; /* task is final(1) so execute immediately */
@@ -2471,10 +2738,20 @@ typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 bits */
unsigned complete : 1; /* 1==complete, 0==not complete */
unsigned freed : 1; /* 1==freed, 0==allocated */
unsigned native : 1; /* 1==gcc-compiled task, 0==intel */
- unsigned reserved31 : 7; /* reserved for library use */
-
+ unsigned target : 1;
+#if OMPX_TASKGRAPH
+ unsigned onced : 1; /* 1==ran once already, 0==never ran, record & replay purposes */
+ unsigned reserved31 : 5; /* reserved for library use */
+#else
+ unsigned reserved31 : 6; /* reserved for library use */
+#endif
+#endif
} kmp_tasking_flags_t;
+typedef struct kmp_target_data {
+ void *async_handle; // libomptarget async handle for task completion query
+} kmp_target_data_t;
+
struct kmp_taskdata { /* aligned during dynamic allocation */
kmp_int32 td_task_id; /* id, assigned by debugger */
kmp_tasking_flags_t td_flags; /* task flags */
@@ -2517,6 +2794,11 @@ struct kmp_taskdata { /* aligned during dynamic allocation */
#if OMPT_SUPPORT
ompt_task_info_t ompt_task_info;
#endif
+#if OMPX_TASKGRAPH
+ bool is_taskgraph = 0; // whether the task is within a TDG
+ kmp_tdg_info_t *tdg; // used to associate task with a TDG
+#endif
+ kmp_target_data_t td_target_data;
}; // struct kmp_taskdata
// Make sure padding above worked
@@ -2600,6 +2882,11 @@ union KMP_ALIGN_CACHE kmp_task_team {
char tt_pad[KMP_PAD(kmp_base_task_team_t, CACHE_LINE)];
};
+typedef struct kmp_task_team_list_t {
+ kmp_task_team_t *task_team;
+ kmp_task_team_list_t *next;
+} kmp_task_team_list_t;
+
#if (USE_FAST_MEMORY == 3) || (USE_FAST_MEMORY == 5)
// Free lists keep same-size free memory slots for fast memory allocation
// routines
@@ -2680,11 +2967,19 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
#if KMP_AFFINITY_SUPPORTED
kmp_affin_mask_t *th_affin_mask; /* thread's current affinity mask */
+ kmp_affinity_ids_t th_topology_ids; /* thread's current topology ids */
+ kmp_affinity_attrs_t th_topology_attrs; /* thread's current topology attrs */
#endif
omp_allocator_handle_t th_def_allocator; /* default allocator */
/* The data set by the primary thread at reinit, then R/W by the worker */
KMP_ALIGN_CACHE int
th_set_nproc; /* if > 0, then only use this request for the next fork */
+ int *th_set_nested_nth;
+ bool th_nt_strict; // num_threads clause has strict modifier
+ ident_t *th_nt_loc; // loc for strict modifier
+ int th_nt_sev; // error severity for strict modifier
+ const char *th_nt_msg; // error message for strict modifier
+ int th_set_nested_nth_sz;
#if KMP_NESTED_HOT_TEAMS
kmp_hot_team_ptr_t *th_hot_teams; /* array of hot teams */
#endif
@@ -2735,10 +3030,6 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
kmp_task_team_t *th_task_team; // Task team struct
kmp_taskdata_t *th_current_task; // Innermost Task being executed
kmp_uint8 th_task_state; // alternating 0/1 for task team identification
- kmp_uint8 *th_task_state_memo_stack; // Stack holding memos of th_task_state
- // at nested levels
- kmp_uint32 th_task_state_top; // Top element of th_task_state_memo_stack
- kmp_uint32 th_task_state_stack_sz; // Size of th_task_state_memo_stack
kmp_uint32 th_reap_state; // Non-zero indicates thread is not
// tasking, thus safe to reap
@@ -2860,6 +3151,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
kmp_disp_t *t_dispatch; // thread's dispatch data
kmp_task_team_t *t_task_team[2]; // Task team struct; switch between 2
kmp_proc_bind_t t_proc_bind; // bind type for par region
+ int t_primary_task_state; // primary thread's task state saved
#if USE_ITT_BUILD
kmp_uint64 t_region_time; // region begin timestamp
#endif /* USE_ITT_BUILD */
@@ -2929,8 +3221,15 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
void *t_stack_id; // team specific stack stitching id (for ittnotify)
#endif /* USE_ITT_BUILD */
distributedBarrier *b; // Distributed barrier data associated with team
+ kmp_nested_nthreads_t *t_nested_nth;
} kmp_base_team_t;
+// Assert that the list structure fits and aligns within
+// the double task team pointer
+KMP_BUILD_ASSERT(sizeof(kmp_task_team_t *[2]) == sizeof(kmp_task_team_list_t));
+KMP_BUILD_ASSERT(alignof(kmp_task_team_t *[2]) ==
+ alignof(kmp_task_team_list_t));
+
union KMP_ALIGN_CACHE kmp_team {
kmp_base_team_t t;
double t_align; /* use worst case alignment */
@@ -3167,6 +3466,7 @@ extern int __kmp_sys_max_nth; /* system-imposed maximum number of threads */
extern int __kmp_max_nth;
// maximum total number of concurrently-existing threads in a contention group
extern int __kmp_cg_max_nth;
+extern int __kmp_task_max_nth; // max threads used in a task
extern int __kmp_teams_max_nth; // max threads used in a teams construct
extern int __kmp_threads_capacity; /* capacity of the arrays __kmp_threads and
__kmp_root */
@@ -3178,9 +3478,22 @@ extern int __kmp_tp_capacity; /* capacity of __kmp_threads if threadprivate is
used (fixed) */
extern int __kmp_tp_cached; /* whether threadprivate cache has been created
(__kmpc_threadprivate_cached()) */
-extern int __kmp_dflt_blocktime; /* number of milliseconds to wait before
+extern int __kmp_dflt_blocktime; /* number of microseconds to wait before
blocking (env setting) */
+extern char __kmp_blocktime_units; /* 'm' or 'u' to note units specified */
extern bool __kmp_wpolicy_passive; /* explicitly set passive wait policy */
+
+// Convert raw blocktime from ms to us if needed.
+static inline void __kmp_aux_convert_blocktime(int *bt) {
+ if (__kmp_blocktime_units == 'm') {
+ if (*bt > INT_MAX / 1000) {
+ *bt = INT_MAX / 1000;
+ KMP_INFORM(MaxValueUsing, "kmp_set_blocktime(ms)", bt);
+ }
+ *bt = *bt * 1000;
+ }
+}
+
#if KMP_USE_MONITOR
extern int
__kmp_monitor_wakeups; /* number of times monitor wakes up per second */
@@ -3245,15 +3558,6 @@ extern enum mic_type __kmp_mic_type;
extern double __kmp_load_balance_interval; // load balance algorithm interval
#endif /* USE_LOAD_BALANCE */
-// OpenMP 3.1 - Nested num threads array
-typedef struct kmp_nested_nthreads_t {
- int *nth;
- int size;
- int used;
-} kmp_nested_nthreads_t;
-
-extern kmp_nested_nthreads_t __kmp_nested_nth;
-
#if KMP_USE_ADAPTIVE_LOCKS
// Parameters for the speculative lock backoff system.
@@ -3428,6 +3732,9 @@ extern void __kmp_warn(char const *format, ...);
extern void __kmp_set_num_threads(int new_nth, int gtid);
+extern bool __kmp_detect_shm();
+extern bool __kmp_detect_tmp();
+
// Returns current thread (pointer to kmp_info_t). Current thread *must* be
// registered.
static inline kmp_info_t *__kmp_entry_thread() {
@@ -3485,6 +3792,11 @@ extern void ___kmp_thread_free(kmp_info_t *th, void *ptr KMP_SRC_LOC_DECL);
___kmp_thread_free((th), (ptr)KMP_SRC_LOC_CURR)
extern void __kmp_push_num_threads(ident_t *loc, int gtid, int num_threads);
+extern void __kmp_push_num_threads_list(ident_t *loc, int gtid,
+ kmp_uint32 list_length,
+ int *num_threads_list);
+extern void __kmp_set_strict_num_threads(ident_t *loc, int gtid, int sev,
+ const char *msg);
extern void __kmp_push_proc_bind(ident_t *loc, int gtid,
kmp_proc_bind_t proc_bind);
@@ -3528,6 +3840,8 @@ extern void __kmpc_dispatch_fini_8(ident_t *loc, kmp_int32 gtid);
extern void __kmpc_dispatch_fini_4u(ident_t *loc, kmp_int32 gtid);
extern void __kmpc_dispatch_fini_8u(ident_t *loc, kmp_int32 gtid);
+extern void __kmpc_dispatch_deinit(ident_t *loc, kmp_int32 gtid);
+
#ifdef KMP_GOMP_COMPAT
extern void __kmp_aux_dispatch_init_4(ident_t *loc, kmp_int32 gtid,
@@ -3591,7 +3905,7 @@ extern void __kmp_check_stack_overlap(kmp_info_t *thr);
extern void __kmp_expand_host_name(char *buffer, size_t size);
extern void __kmp_expand_file_name(char *result, size_t rlen, char *pattern);
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || (KMP_OS_WINDOWS && KMP_ARCH_AARCH64)
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || (KMP_OS_WINDOWS && (KMP_ARCH_AARCH64 || KMP_ARCH_ARM))
extern void
__kmp_initialize_system_tick(void); /* Initialize timer tick value */
#endif
@@ -3605,11 +3919,12 @@ extern char *__kmp_affinity_print_mask(char *buf, int buf_len,
kmp_affin_mask_t *mask);
extern kmp_str_buf_t *__kmp_affinity_str_buf_mask(kmp_str_buf_t *buf,
kmp_affin_mask_t *mask);
-extern void __kmp_affinity_initialize(void);
+extern void __kmp_affinity_initialize(kmp_affinity_t &affinity);
extern void __kmp_affinity_uninitialize(void);
extern void __kmp_affinity_set_init_mask(
int gtid, int isa_root); /* set affinity according to KMP_AFFINITY */
-extern void __kmp_affinity_set_place(int gtid);
+void __kmp_affinity_bind_init_mask(int gtid);
+extern void __kmp_affinity_bind_place(int gtid);
extern void __kmp_affinity_determine_capable(const char *env_var);
extern int __kmp_aux_set_affinity(void **mask);
extern int __kmp_aux_get_affinity(void **mask);
@@ -3618,18 +3933,25 @@ extern int __kmp_aux_set_affinity_mask_proc(int proc, void **mask);
extern int __kmp_aux_unset_affinity_mask_proc(int proc, void **mask);
extern int __kmp_aux_get_affinity_mask_proc(int proc, void **mask);
extern void __kmp_balanced_affinity(kmp_info_t *th, int team_size);
-#if KMP_OS_LINUX || KMP_OS_FREEBSD
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+extern int __kmp_get_first_osid_with_ecore(void);
+#endif
+#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_AIX
extern int kmp_set_thread_affinity_mask_initial(void);
#endif
static inline void __kmp_assign_root_init_mask() {
int gtid = __kmp_entry_gtid();
kmp_root_t *r = __kmp_threads[gtid]->th.th_root;
if (r->r.r_uber_thread == __kmp_threads[gtid] && !r->r.r_affinity_assigned) {
- __kmp_affinity_set_init_mask(gtid, TRUE);
+ __kmp_affinity_set_init_mask(gtid, /*isa_root=*/TRUE);
+ __kmp_affinity_bind_init_mask(gtid);
r->r.r_affinity_assigned = TRUE;
}
}
static inline void __kmp_reset_root_init_mask(int gtid) {
+ if (!KMP_AFFINITY_CAPABLE())
+ return;
kmp_info_t *th = __kmp_threads[gtid];
kmp_root_t *r = th->th.th_root;
if (r->r.r_uber_thread == th && r->r.r_affinity_assigned) {
@@ -3816,9 +4138,10 @@ extern void __kmp_fulfill_event(kmp_event_t *event);
extern void __kmp_free_task_team(kmp_info_t *thread,
kmp_task_team_t *task_team);
extern void __kmp_reap_task_teams(void);
+extern void __kmp_push_task_team_node(kmp_info_t *thread, kmp_team_t *team);
+extern void __kmp_pop_task_team_node(kmp_info_t *thread, kmp_team_t *team);
extern void __kmp_wait_to_unref_task_teams(void);
-extern void __kmp_task_team_setup(kmp_info_t *this_thr, kmp_team_t *team,
- int always);
+extern void __kmp_task_team_setup(kmp_info_t *this_thr, kmp_team_t *team);
extern void __kmp_task_team_sync(kmp_info_t *this_thr, kmp_team_t *team);
extern void __kmp_task_team_wait(kmp_info_t *this_thr, kmp_team_t *team
#if USE_ITT_BUILD
@@ -3829,6 +4152,14 @@ extern void __kmp_task_team_wait(kmp_info_t *this_thr, kmp_team_t *team
int wait = 1);
extern void __kmp_tasking_barrier(kmp_team_t *team, kmp_info_t *thread,
int gtid);
+#if KMP_DEBUG
+#define KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team, thr) \
+ KMP_DEBUG_ASSERT( \
+ __kmp_tasking_mode != tskm_task_teams || team->t.t_nproc == 1 || \
+ thr->th.th_task_team == team->t.t_task_team[thr->th.th_task_state])
+#else
+#define KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team, thr) /* Nothing */
+#endif
extern int __kmp_is_address_mapped(void *addr);
extern kmp_uint64 __kmp_hardware_timestamp(void);
@@ -3874,6 +4205,9 @@ KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *);
KMP_EXPORT kmp_int32 __kmpc_ok_to_fork(ident_t *);
KMP_EXPORT void __kmpc_fork_call(ident_t *, kmp_int32 nargs,
kmpc_micro microtask, ...);
+KMP_EXPORT void __kmpc_fork_call_if(ident_t *loc, kmp_int32 nargs,
+ kmpc_micro microtask, kmp_int32 cond,
+ void *args);
KMP_EXPORT void __kmpc_serialized_parallel(ident_t *, kmp_int32 global_tid);
KMP_EXPORT void __kmpc_end_serialized_parallel(ident_t *, kmp_int32 global_tid);
@@ -3946,7 +4280,6 @@ KMP_EXPORT void __kmpc_omp_task_complete_if0(ident_t *loc_ref, kmp_int32 gtid,
KMP_EXPORT kmp_int32 __kmpc_omp_task_parts(ident_t *loc_ref, kmp_int32 gtid,
kmp_task_t *new_task);
KMP_EXPORT kmp_int32 __kmpc_omp_taskwait(ident_t *loc_ref, kmp_int32 gtid);
-
KMP_EXPORT kmp_int32 __kmpc_omp_taskyield(ident_t *loc_ref, kmp_int32 gtid,
int end_part);
@@ -3965,11 +4298,25 @@ KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps(
ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 ndeps,
kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias,
kmp_depend_info_t *noalias_dep_list);
+
+KMP_EXPORT kmp_base_depnode_t *__kmpc_task_get_depnode(kmp_task_t *task);
+
+KMP_EXPORT kmp_depnode_list_t *__kmpc_task_get_successors(kmp_task_t *task);
+
KMP_EXPORT void __kmpc_omp_wait_deps(ident_t *loc_ref, kmp_int32 gtid,
kmp_int32 ndeps,
kmp_depend_info_t *dep_list,
kmp_int32 ndeps_noalias,
kmp_depend_info_t *noalias_dep_list);
+/* __kmpc_omp_taskwait_deps_51 : Function for OpenMP 5.1 nowait clause.
+ * Placeholder for taskwait with nowait clause.*/
+KMP_EXPORT void __kmpc_omp_taskwait_deps_51(ident_t *loc_ref, kmp_int32 gtid,
+ kmp_int32 ndeps,
+ kmp_depend_info_t *dep_list,
+ kmp_int32 ndeps_noalias,
+ kmp_depend_info_t *noalias_dep_list,
+ kmp_int32 has_no_wait);
+
extern kmp_int32 __kmp_omp_task(kmp_int32 gtid, kmp_task_t *new_task,
bool serialize_immediate);
@@ -4011,6 +4358,10 @@ KMP_EXPORT int __kmp_get_max_teams(void);
KMP_EXPORT void __kmp_set_teams_thread_limit(int limit);
KMP_EXPORT int __kmp_get_teams_thread_limit(void);
+/* Interface target task integration */
+KMP_EXPORT void **__kmpc_omp_get_target_async_handle_ptr(kmp_int32 gtid);
+KMP_EXPORT bool __kmpc_omp_has_task_team(kmp_int32 gtid);
+
/* Lock interface routines (fast versions with gtid passed in) */
KMP_EXPORT void __kmpc_init_lock(ident_t *loc, kmp_int32 gtid,
void **user_lock);
@@ -4037,6 +4388,20 @@ KMP_EXPORT void __kmpc_init_nest_lock_with_hint(ident_t *loc, kmp_int32 gtid,
void **user_lock,
uintptr_t hint);
+#if OMPX_TASKGRAPH
+// Taskgraph's Record & Replay mechanism
+// __kmp_tdg_is_recording: check whether a given TDG is recording
+// status: the tdg's current status
+static inline bool __kmp_tdg_is_recording(kmp_tdg_status_t status) {
+ return status == KMP_TDG_RECORDING;
+}
+
+KMP_EXPORT kmp_int32 __kmpc_start_record_task(ident_t *loc, kmp_int32 gtid,
+ kmp_int32 input_flags,
+ kmp_int32 tdg_id);
+KMP_EXPORT void __kmpc_end_record_task(ident_t *loc, kmp_int32 gtid,
+ kmp_int32 input_flags, kmp_int32 tdg_id);
+#endif
/* Interface to fast scalable reduce methods routines */
KMP_EXPORT kmp_int32 __kmpc_reduce_nowait(
@@ -4072,12 +4437,26 @@ KMP_EXPORT kmp_int32 __kmpc_in_parallel(ident_t *loc);
KMP_EXPORT void __kmpc_pop_num_threads(ident_t *loc, kmp_int32 global_tid);
KMP_EXPORT void __kmpc_push_num_threads(ident_t *loc, kmp_int32 global_tid,
kmp_int32 num_threads);
+KMP_EXPORT void __kmpc_push_num_threads_strict(ident_t *loc,
+ kmp_int32 global_tid,
+ kmp_int32 num_threads,
+ int severity,
+ const char *message);
+
+KMP_EXPORT void __kmpc_push_num_threads_list(ident_t *loc, kmp_int32 global_tid,
+ kmp_uint32 list_length,
+ kmp_int32 *num_threads_list);
+KMP_EXPORT void __kmpc_push_num_threads_list_strict(
+ ident_t *loc, kmp_int32 global_tid, kmp_uint32 list_length,
+ kmp_int32 *num_threads_list, int severity, const char *message);
KMP_EXPORT void __kmpc_push_proc_bind(ident_t *loc, kmp_int32 global_tid,
int proc_bind);
KMP_EXPORT void __kmpc_push_num_teams(ident_t *loc, kmp_int32 global_tid,
kmp_int32 num_teams,
kmp_int32 num_threads);
+KMP_EXPORT void __kmpc_set_thread_limit(ident_t *loc, kmp_int32 global_tid,
+ kmp_int32 thread_limit);
/* Function for OpenMP 5.1 num_teams clause */
KMP_EXPORT void __kmpc_push_num_teams_51(ident_t *loc, kmp_int32 global_tid,
kmp_int32 num_teams_lb,
@@ -4103,13 +4482,6 @@ KMP_EXPORT void *__kmpc_threadprivate_cached(ident_t *loc, kmp_int32 global_tid,
void *data, size_t size,
void ***cache);
-// Symbols for MS mutual detection.
-extern int _You_must_link_with_exactly_one_OpenMP_library;
-extern int _You_must_link_with_Intel_OpenMP_library;
-#if KMP_OS_WINDOWS && (KMP_VERSION_MAJOR > 4)
-extern int _You_must_link_with_Microsoft_OpenMP_library;
-#endif
-
// The routines below are not exported.
// Consider making them 'static' in corresponding source files.
void kmp_threadprivate_insert_private_data(int gtid, void *pc_addr,
@@ -4180,7 +4552,8 @@ extern int __kmpc_get_target_offload();
typedef enum kmp_pause_status_t {
kmp_not_paused = 0, // status is not paused, or, requesting resume
kmp_soft_paused = 1, // status is soft-paused, or, requesting soft pause
- kmp_hard_paused = 2 // status is hard-paused, or, requesting hard pause
+ kmp_hard_paused = 2, // status is hard-paused, or, requesting hard pause
+ kmp_stop_tool_paused = 3 // requesting stop_tool pause
} kmp_pause_status_t;
// This stores the pause state of the runtime
@@ -4234,6 +4607,9 @@ extern void __kmp_hidden_helper_main_thread_release();
#define KMP_HIDDEN_HELPER_WORKER_THREAD(gtid) \
((gtid) > 1 && (gtid) <= __kmp_hidden_helper_threads_num)
+#define KMP_HIDDEN_HELPER_MAIN_THREAD(gtid) \
+ ((gtid) == 1 && (gtid) <= __kmp_hidden_helper_threads_num)
+
#define KMP_HIDDEN_HELPER_TEAM(team) \
(team->t.t_threads[0] == __kmp_hidden_helper_main_thread)
@@ -4356,6 +4732,8 @@ class kmp_safe_raii_file_t {
: f(nullptr) {
open(filename, mode, env_var);
}
+ kmp_safe_raii_file_t(const kmp_safe_raii_file_t &other) = delete;
+ kmp_safe_raii_file_t &operator=(const kmp_safe_raii_file_t &other) = delete;
~kmp_safe_raii_file_t() { close(); }
/// Open filename using mode. This is automatically closed in the destructor.
diff --git a/contrib/libs/cxxsupp/openmp/kmp_affinity.cpp b/contrib/libs/cxxsupp/openmp/kmp_affinity.cpp
index b9a8d49d8da4..624fb3b07614 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_affinity.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_affinity.cpp
@@ -38,6 +38,43 @@ static hierarchy_info machine_hierarchy;
void __kmp_cleanup_hierarchy() { machine_hierarchy.fini(); }
+#if KMP_AFFINITY_SUPPORTED
+// Helper class to see if place lists further restrict the fullMask
+class kmp_full_mask_modifier_t {
+ kmp_affin_mask_t *mask;
+
+public:
+ kmp_full_mask_modifier_t() {
+ KMP_CPU_ALLOC(mask);
+ KMP_CPU_ZERO(mask);
+ }
+ ~kmp_full_mask_modifier_t() {
+ KMP_CPU_FREE(mask);
+ mask = nullptr;
+ }
+ void include(const kmp_affin_mask_t *other) { KMP_CPU_UNION(mask, other); }
+ // If the new full mask is different from the current full mask,
+ // then switch them. Returns true if full mask was affected, false otherwise.
+ bool restrict_to_mask() {
+ // See if the new mask further restricts or changes the full mask
+ if (KMP_CPU_EQUAL(__kmp_affin_fullMask, mask) || KMP_CPU_ISEMPTY(mask))
+ return false;
+ return __kmp_topology->restrict_to_mask(mask);
+ }
+};
+
+static inline const char *
+__kmp_get_affinity_env_var(const kmp_affinity_t &affinity,
+ bool for_binding = false) {
+ if (affinity.flags.omp_places) {
+ if (for_binding)
+ return "OMP_PROC_BIND";
+ return "OMP_PLACES";
+ }
+ return affinity.env_var;
+}
+#endif // KMP_AFFINITY_SUPPORTED
+
void __kmp_get_hierarchy(kmp_uint32 nproc, kmp_bstate_t *thr_bar) {
kmp_uint32 depth;
// The test below is true if affinity is available, but set to "none". Need to
@@ -90,8 +127,12 @@ const char *__kmp_hw_get_catalog_string(kmp_hw_t type, bool plural) {
return ((plural) ? KMP_I18N_STR(Threads) : KMP_I18N_STR(Thread));
case KMP_HW_PROC_GROUP:
return ((plural) ? KMP_I18N_STR(ProcGroups) : KMP_I18N_STR(ProcGroup));
+ case KMP_HW_UNKNOWN:
+ case KMP_HW_LAST:
+ return KMP_I18N_STR(Unknown);
}
- return KMP_I18N_STR(Unknown);
+ KMP_ASSERT2(false, "Unhandled kmp_hw_t enumeration");
+ KMP_BUILTIN_UNREACHABLE;
}
const char *__kmp_hw_get_keyword(kmp_hw_t type, bool plural) {
@@ -120,13 +161,18 @@ const char *__kmp_hw_get_keyword(kmp_hw_t type, bool plural) {
return ((plural) ? "threads" : "thread");
case KMP_HW_PROC_GROUP:
return ((plural) ? "proc_groups" : "proc_group");
+ case KMP_HW_UNKNOWN:
+ case KMP_HW_LAST:
+ return ((plural) ? "unknowns" : "unknown");
}
- return ((plural) ? "unknowns" : "unknown");
+ KMP_ASSERT2(false, "Unhandled kmp_hw_t enumeration");
+ KMP_BUILTIN_UNREACHABLE;
}
const char *__kmp_hw_get_core_type_string(kmp_hw_core_type_t type) {
switch (type) {
case KMP_HW_CORE_TYPE_UNKNOWN:
+ case KMP_HW_MAX_NUM_CORE_TYPES:
return "unknown";
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
case KMP_HW_CORE_TYPE_ATOM:
@@ -135,19 +181,19 @@ const char *__kmp_hw_get_core_type_string(kmp_hw_core_type_t type) {
return "Intel(R) Core(TM) processor";
#endif
}
- return "unknown";
+ KMP_ASSERT2(false, "Unhandled kmp_hw_core_type_t enumeration");
+ KMP_BUILTIN_UNREACHABLE;
}
#if KMP_AFFINITY_SUPPORTED
// If affinity is supported, check the affinity
// verbose and warning flags before printing warning
-#define KMP_AFF_WARNING(...) \
- if (__kmp_affinity_verbose || \
- (__kmp_affinity_warnings && (__kmp_affinity_type != affinity_none))) { \
+#define KMP_AFF_WARNING(s, ...) \
+ if (s.flags.verbose || (s.flags.warnings && (s.type != affinity_none))) { \
KMP_WARNING(__VA_ARGS__); \
}
#else
-#define KMP_AFF_WARNING KMP_WARNING
+#define KMP_AFF_WARNING(s, ...) KMP_WARNING(__VA_ARGS__)
#endif
////////////////////////////////////////////////////////////////////////////////
@@ -157,7 +203,26 @@ int kmp_hw_thread_t::compare_ids(const void *a, const void *b) {
const kmp_hw_thread_t *bhwthread = (const kmp_hw_thread_t *)b;
int depth = __kmp_topology->get_depth();
for (int level = 0; level < depth; ++level) {
- if (ahwthread->ids[level] < bhwthread->ids[level])
+ // Reverse sort (higher efficiencies earlier in list) cores by core
+ // efficiency if available.
+ if (__kmp_is_hybrid_cpu() &&
+ __kmp_topology->get_type(level) == KMP_HW_CORE &&
+ ahwthread->attrs.is_core_eff_valid() &&
+ bhwthread->attrs.is_core_eff_valid()) {
+ if (ahwthread->attrs.get_core_eff() < bhwthread->attrs.get_core_eff())
+ return 1;
+ if (ahwthread->attrs.get_core_eff() > bhwthread->attrs.get_core_eff())
+ return -1;
+ }
+ if (ahwthread->ids[level] == bhwthread->ids[level])
+ continue;
+ // If the hardware id is unknown for this level, then place hardware thread
+ // further down in the sorted list as it should take last priority
+ if (ahwthread->ids[level] == UNKNOWN_ID)
+ return 1;
+ else if (bhwthread->ids[level] == UNKNOWN_ID)
+ return -1;
+ else if (ahwthread->ids[level] < bhwthread->ids[level])
return -1;
else if (ahwthread->ids[level] > bhwthread->ids[level])
return 1;
@@ -175,9 +240,10 @@ int kmp_hw_thread_t::compare_compact(const void *a, const void *b) {
const kmp_hw_thread_t *aa = (const kmp_hw_thread_t *)a;
const kmp_hw_thread_t *bb = (const kmp_hw_thread_t *)b;
int depth = __kmp_topology->get_depth();
- KMP_DEBUG_ASSERT(__kmp_affinity_compact >= 0);
- KMP_DEBUG_ASSERT(__kmp_affinity_compact <= depth);
- for (i = 0; i < __kmp_affinity_compact; i++) {
+ int compact = __kmp_topology->compact;
+ KMP_DEBUG_ASSERT(compact >= 0);
+ KMP_DEBUG_ASSERT(compact <= depth);
+ for (i = 0; i < compact; i++) {
int j = depth - i - 1;
if (aa->sub_ids[j] < bb->sub_ids[j])
return -1;
@@ -185,7 +251,7 @@ int kmp_hw_thread_t::compare_compact(const void *a, const void *b) {
return 1;
}
for (; i < depth; i++) {
- int j = i - __kmp_affinity_compact;
+ int j = i - compact;
if (aa->sub_ids[j] < bb->sub_ids[j])
return -1;
if (aa->sub_ids[j] > bb->sub_ids[j])
@@ -199,7 +265,7 @@ void kmp_hw_thread_t::print() const {
int depth = __kmp_topology->get_depth();
printf("%4d ", os_id);
for (int i = 0; i < depth; ++i) {
- printf("%4d ", ids[i]);
+ printf("%4d (%d) ", ids[i], sub_ids[i]);
}
if (attrs) {
if (attrs.is_core_type_valid())
@@ -207,6 +273,8 @@ void kmp_hw_thread_t::print() const {
if (attrs.is_core_eff_valid())
printf(" (eff=%d)", attrs.get_core_eff());
}
+ if (leader)
+ printf(" (leader)");
printf("\n");
}
@@ -215,7 +283,7 @@ void kmp_hw_thread_t::print() const {
// Add a layer to the topology based on the ids. Assume the topology
// is perfectly nested (i.e., so no object has more than one parent)
-void kmp_topology_t::_insert_layer(kmp_hw_t type, const int *ids) {
+void kmp_topology_t::insert_layer(kmp_hw_t type, const int *ids) {
// Figure out where the layer should go by comparing the ids of the current
// layers with the new ids
int target_layer;
@@ -276,8 +344,11 @@ void kmp_topology_t::_insert_windows_proc_groups() {
ids[i] = __kmp_get_proc_group(mask);
}
KMP_CPU_FREE(mask);
- _insert_layer(KMP_HW_PROC_GROUP, ids);
+ insert_layer(KMP_HW_PROC_GROUP, ids);
__kmp_free(ids);
+
+ // sort topology after adding proc groups
+ __kmp_topology->sort_ids();
}
#endif
@@ -413,10 +484,13 @@ void kmp_topology_t::_gather_enumeration_information() {
int id = hw_thread.ids[layer];
if (id != previous_id[layer]) {
// Add an additional increment to each count
- for (int l = layer; l < depth; ++l)
- count[l]++;
+ for (int l = layer; l < depth; ++l) {
+ if (hw_thread.ids[l] != kmp_hw_thread_t::UNKNOWN_ID)
+ count[l]++;
+ }
// Keep track of topology layer ratio statistics
- max[layer]++;
+ if (hw_thread.ids[layer] != kmp_hw_thread_t::UNKNOWN_ID)
+ max[layer]++;
for (int l = layer + 1; l < depth; ++l) {
if (max[l] > ratio[l])
ratio[l] = max[l];
@@ -584,6 +658,7 @@ kmp_topology_t *kmp_topology_t::allocate(int nproc, int ndepth,
retval->count = arr + 2 * (size_t)KMP_HW_LAST;
retval->num_core_efficiencies = 0;
retval->num_core_types = 0;
+ retval->compact = 0;
for (int i = 0; i < KMP_HW_MAX_NUM_CORE_TYPES; ++i)
retval->core_types[i] = KMP_HW_CORE_TYPE_UNKNOWN;
KMP_FOREACH_HW_TYPE(type) { retval->equivalent[type] = KMP_HW_UNKNOWN; }
@@ -674,7 +749,11 @@ void kmp_topology_t::print(const char *env_var) const {
kmp_hw_t print_types[KMP_HW_LAST + 2];
// Num Available Threads
- KMP_INFORM(AvailableOSProc, env_var, num_hw_threads);
+ if (num_hw_threads) {
+ KMP_INFORM(AvailableOSProc, env_var, num_hw_threads);
+ } else {
+ KMP_INFORM(AvailableOSProc, env_var, __kmp_xproc);
+ }
// Uniform or not
if (is_uniform()) {
@@ -776,6 +855,8 @@ void kmp_topology_t::print(const char *env_var) const {
for (int i = 0; i < num_hw_threads; i++) {
__kmp_str_buf_clear(&buf);
for (int level = 0; level < depth; ++level) {
+ if (hw_threads[i].ids[level] == kmp_hw_thread_t::UNKNOWN_ID)
+ continue;
kmp_hw_t type = types[level];
__kmp_str_buf_print(&buf, "%s ", __kmp_hw_get_catalog_string(type));
__kmp_str_buf_print(&buf, "%d ", hw_threads[i].ids[level]);
@@ -790,41 +871,45 @@ void kmp_topology_t::print(const char *env_var) const {
__kmp_str_buf_free(&buf);
}
-void kmp_topology_t::canonicalize() {
-#if KMP_GROUP_AFFINITY
- _insert_windows_proc_groups();
-#endif
- _remove_radix1_layers();
- _gather_enumeration_information();
- _discover_uniformity();
- _set_sub_ids();
- _set_globals();
- _set_last_level_cache();
-
-#if KMP_MIC_SUPPORTED
- // Manually Add L2 = Tile equivalence
- if (__kmp_mic_type == mic3) {
- if (get_level(KMP_HW_L2) != -1)
- set_equivalent_type(KMP_HW_TILE, KMP_HW_L2);
- else if (get_level(KMP_HW_TILE) != -1)
- set_equivalent_type(KMP_HW_L2, KMP_HW_TILE);
- }
-#endif
-
- // Perform post canonicalization checking
- KMP_ASSERT(depth > 0);
- for (int level = 0; level < depth; ++level) {
- // All counts, ratios, and types must be valid
- KMP_ASSERT(count[level] > 0 && ratio[level] > 0);
- KMP_ASSERT_VALID_HW_TYPE(types[level]);
- // Detected types must point to themselves
- KMP_ASSERT(equivalent[types[level]] == types[level]);
- }
-
#if KMP_AFFINITY_SUPPORTED
+void kmp_topology_t::set_granularity(kmp_affinity_t &affinity) const {
+ const char *env_var = __kmp_get_affinity_env_var(affinity);
+ // If requested hybrid CPU attributes for granularity (either OMP_PLACES or
+ // KMP_AFFINITY), but none exist, then reset granularity and have below method
+ // select a granularity and warn user.
+ if (!__kmp_is_hybrid_cpu()) {
+ if (affinity.core_attr_gran.valid) {
+ // OMP_PLACES with cores: but non-hybrid arch, use cores
+ // instead
+ KMP_AFF_WARNING(
+ affinity, AffIgnoringNonHybrid, env_var,
+ __kmp_hw_get_catalog_string(KMP_HW_CORE, /*plural=*/true));
+ affinity.gran = KMP_HW_CORE;
+ affinity.gran_levels = -1;
+ affinity.core_attr_gran = KMP_AFFINITY_ATTRS_UNKNOWN;
+ affinity.flags.core_types_gran = affinity.flags.core_effs_gran = 0;
+ } else if (affinity.flags.core_types_gran ||
+ affinity.flags.core_effs_gran) {
+ // OMP_PLACES=core_types|core_effs but non-hybrid, use cores instead
+ if (affinity.flags.omp_places) {
+ KMP_AFF_WARNING(
+ affinity, AffIgnoringNonHybrid, env_var,
+ __kmp_hw_get_catalog_string(KMP_HW_CORE, /*plural=*/true));
+ } else {
+ // KMP_AFFINITY=granularity=core_type|core_eff,...
+ KMP_AFF_WARNING(affinity, AffGranularityBad, env_var,
+ "Intel(R) Hybrid Technology core attribute",
+ __kmp_hw_get_catalog_string(KMP_HW_CORE));
+ }
+ affinity.gran = KMP_HW_CORE;
+ affinity.gran_levels = -1;
+ affinity.core_attr_gran = KMP_AFFINITY_ATTRS_UNKNOWN;
+ affinity.flags.core_types_gran = affinity.flags.core_effs_gran = 0;
+ }
+ }
// Set the number of affinity granularity levels
- if (__kmp_affinity_gran_levels < 0) {
- kmp_hw_t gran_type = get_equivalent_type(__kmp_affinity_gran);
+ if (affinity.gran_levels < 0) {
+ kmp_hw_t gran_type = get_equivalent_type(affinity.gran);
// Check if user's granularity request is valid
if (gran_type == KMP_HW_UNKNOWN) {
// First try core, then thread, then package
@@ -837,10 +922,10 @@ void kmp_topology_t::canonicalize() {
}
KMP_ASSERT(gran_type != KMP_HW_UNKNOWN);
// Warn user what granularity setting will be used instead
- KMP_AFF_WARNING(AffGranularityBad, "KMP_AFFINITY",
- __kmp_hw_get_catalog_string(__kmp_affinity_gran),
+ KMP_AFF_WARNING(affinity, AffGranularityBad, env_var,
+ __kmp_hw_get_catalog_string(affinity.gran),
__kmp_hw_get_catalog_string(gran_type));
- __kmp_affinity_gran = gran_type;
+ affinity.gran = gran_type;
}
#if KMP_GROUP_AFFINITY
// If more than one processor group exists, and the level of
@@ -855,17 +940,49 @@ void kmp_topology_t::canonicalize() {
int proc_group_depth = get_level(KMP_HW_PROC_GROUP);
if (gran_depth >= 0 && proc_group_depth >= 0 &&
gran_depth < proc_group_depth) {
- KMP_AFF_WARNING(AffGranTooCoarseProcGroup, "KMP_AFFINITY",
- __kmp_hw_get_catalog_string(__kmp_affinity_gran));
- __kmp_affinity_gran = gran_type = KMP_HW_PROC_GROUP;
+ KMP_AFF_WARNING(affinity, AffGranTooCoarseProcGroup, env_var,
+ __kmp_hw_get_catalog_string(affinity.gran));
+ affinity.gran = gran_type = KMP_HW_PROC_GROUP;
}
}
#endif
- __kmp_affinity_gran_levels = 0;
+ affinity.gran_levels = 0;
for (int i = depth - 1; i >= 0 && get_type(i) != gran_type; --i)
- __kmp_affinity_gran_levels++;
+ affinity.gran_levels++;
+ }
+}
+#endif
+
+void kmp_topology_t::canonicalize() {
+#if KMP_GROUP_AFFINITY
+ _insert_windows_proc_groups();
+#endif
+ _remove_radix1_layers();
+ _gather_enumeration_information();
+ _discover_uniformity();
+ _set_sub_ids();
+ _set_globals();
+ _set_last_level_cache();
+
+#if KMP_MIC_SUPPORTED
+ // Manually Add L2 = Tile equivalence
+ if (__kmp_mic_type == mic3) {
+ if (get_level(KMP_HW_L2) != -1)
+ set_equivalent_type(KMP_HW_TILE, KMP_HW_L2);
+ else if (get_level(KMP_HW_TILE) != -1)
+ set_equivalent_type(KMP_HW_L2, KMP_HW_TILE);
+ }
+#endif
+
+ // Perform post canonicalization checking
+ KMP_ASSERT(depth > 0);
+ for (int level = 0; level < depth; ++level) {
+ // All counts, ratios, and types must be valid
+ KMP_ASSERT(count[level] > 0 && ratio[level] > 0);
+ KMP_ASSERT_VALID_HW_TYPE(types[level]);
+ // Detected types must point to themselves
+ KMP_ASSERT(equivalent[types[level]] == types[level]);
}
-#endif // KMP_AFFINITY_SUPPORTED
}
// Canonicalize an explicit packages X cores/pkg X threads/core topology
@@ -894,41 +1011,7 @@ void kmp_topology_t::canonicalize(int npackages, int ncores_per_pkg,
_discover_uniformity();
}
-// Represents running sub IDs for a single core attribute where
-// attribute values have SIZE possibilities.
-template struct kmp_sub_ids_t {
- int last_level; // last level in topology to consider for sub_ids
- int sub_id[SIZE]; // The sub ID for a given attribute value
- int prev_sub_id[KMP_HW_LAST];
- IndexFunc indexer;
-
-public:
- kmp_sub_ids_t(int last_level) : last_level(last_level) {
- KMP_ASSERT(last_level < KMP_HW_LAST);
- for (size_t i = 0; i < SIZE; ++i)
- sub_id[i] = -1;
- for (size_t i = 0; i < KMP_HW_LAST; ++i)
- prev_sub_id[i] = -1;
- }
- void update(const kmp_hw_thread_t &hw_thread) {
- int idx = indexer(hw_thread);
- KMP_ASSERT(idx < (int)SIZE);
- for (int level = 0; level <= last_level; ++level) {
- if (hw_thread.sub_ids[level] != prev_sub_id[level]) {
- if (level < last_level)
- sub_id[idx] = -1;
- sub_id[idx]++;
- break;
- }
- }
- for (int level = 0; level <= last_level; ++level)
- prev_sub_id[level] = hw_thread.sub_ids[level];
- }
- int get_sub_id(const kmp_hw_thread_t &hw_thread) const {
- return sub_id[indexer(hw_thread)];
- }
-};
-
+#if KMP_AFFINITY_SUPPORTED
static kmp_str_buf_t *
__kmp_hw_get_catalog_core_string(const kmp_hw_attr_t &attr, kmp_str_buf_t *buf,
bool plural) {
@@ -944,6 +1027,41 @@ __kmp_hw_get_catalog_core_string(const kmp_hw_attr_t &attr, kmp_str_buf_t *buf,
return buf;
}
+bool kmp_topology_t::restrict_to_mask(const kmp_affin_mask_t *mask) {
+ // Apply the filter
+ bool affected;
+ int new_index = 0;
+ for (int i = 0; i < num_hw_threads; ++i) {
+ int os_id = hw_threads[i].os_id;
+ if (KMP_CPU_ISSET(os_id, mask)) {
+ if (i != new_index)
+ hw_threads[new_index] = hw_threads[i];
+ new_index++;
+ } else {
+ KMP_CPU_CLR(os_id, __kmp_affin_fullMask);
+ __kmp_avail_proc--;
+ }
+ }
+
+ KMP_DEBUG_ASSERT(new_index <= num_hw_threads);
+ affected = (num_hw_threads != new_index);
+ num_hw_threads = new_index;
+
+ // Post hardware subset canonicalization
+ if (affected) {
+ _gather_enumeration_information();
+ _discover_uniformity();
+ _set_globals();
+ _set_last_level_cache();
+#if KMP_OS_WINDOWS
+ // Copy filtered full mask if topology has single processor group
+ if (__kmp_num_proc_groups <= 1)
+#endif
+ __kmp_affin_origMask->copy(__kmp_affin_fullMask);
+ }
+ return affected;
+}
+
// Apply the KMP_HW_SUBSET envirable to the topology
// Returns true if KMP_HW_SUBSET filtered any processors
// otherwise, returns false
@@ -955,9 +1073,12 @@ bool kmp_topology_t::filter_hw_subset() {
// First, sort the KMP_HW_SUBSET items by the machine topology
__kmp_hw_subset->sort();
+ __kmp_hw_subset->canonicalize(__kmp_topology);
+
// Check to see if KMP_HW_SUBSET is a valid subset of the detected topology
bool using_core_types = false;
bool using_core_effs = false;
+ bool is_absolute = __kmp_hw_subset->is_absolute();
int hw_subset_depth = __kmp_hw_subset->get_depth();
kmp_hw_t specified[KMP_HW_LAST];
int *topology_levels = (int *)KMP_ALLOCA(sizeof(int) * hw_subset_depth);
@@ -978,7 +1099,7 @@ bool kmp_topology_t::filter_hw_subset() {
if (equivalent_type != KMP_HW_UNKNOWN) {
__kmp_hw_subset->at(i).type = equivalent_type;
} else {
- KMP_AFF_WARNING(AffHWSubsetNotExistGeneric,
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetNotExistGeneric,
__kmp_hw_get_catalog_string(type));
return false;
}
@@ -986,7 +1107,8 @@ bool kmp_topology_t::filter_hw_subset() {
// Check to see if current layer has already been
// specified either directly or through an equivalent type
if (specified[equivalent_type] != KMP_HW_UNKNOWN) {
- KMP_AFF_WARNING(AffHWSubsetEqvLayers, __kmp_hw_get_catalog_string(type),
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetEqvLayers,
+ __kmp_hw_get_catalog_string(type),
__kmp_hw_get_catalog_string(specified[equivalent_type]));
return false;
}
@@ -994,12 +1116,14 @@ bool kmp_topology_t::filter_hw_subset() {
// Check to see if each layer's num & offset parameters are valid
max_count = get_ratio(level);
- if (max_count < 0 ||
- (num != kmp_hw_subset_t::USE_ALL && num + offset > max_count)) {
- bool plural = (num > 1);
- KMP_AFF_WARNING(AffHWSubsetManyGeneric,
- __kmp_hw_get_catalog_string(type, plural));
- return false;
+ if (!is_absolute) {
+ if (max_count < 0 ||
+ (num != kmp_hw_subset_t::USE_ALL && num + offset > max_count)) {
+ bool plural = (num > 1);
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetManyGeneric,
+ __kmp_hw_get_catalog_string(type, plural));
+ return false;
+ }
}
// Check to see if core attributes are consistent
@@ -1020,21 +1144,24 @@ bool kmp_topology_t::filter_hw_subset() {
if ((using_core_effs || using_core_types) && !__kmp_is_hybrid_cpu()) {
if (item.num_attrs == 1) {
if (using_core_effs) {
- KMP_AFF_WARNING(AffHWSubsetIgnoringAttr, "efficiency");
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetIgnoringAttr,
+ "efficiency");
} else {
- KMP_AFF_WARNING(AffHWSubsetIgnoringAttr, "core_type");
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetIgnoringAttr,
+ "core_type");
}
using_core_effs = false;
using_core_types = false;
} else {
- KMP_AFF_WARNING(AffHWSubsetAttrsNonHybrid);
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetAttrsNonHybrid);
return false;
}
}
// Check if using both core types and core efficiencies together
if (using_core_types && using_core_effs) {
- KMP_AFF_WARNING(AffHWSubsetIncompat, "core_type", "efficiency");
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetIncompat, "core_type",
+ "efficiency");
return false;
}
@@ -1059,7 +1186,7 @@ bool kmp_topology_t::filter_hw_subset() {
}
// Check that the number of requested cores with attributes is valid
- if (using_core_types || using_core_effs) {
+ if ((using_core_types || using_core_effs) && !is_absolute) {
for (int j = 0; j < item.num_attrs; ++j) {
int num = item.num[j];
int offset = item.offset[j];
@@ -1070,7 +1197,7 @@ bool kmp_topology_t::filter_hw_subset() {
(num != kmp_hw_subset_t::USE_ALL && num + offset > max_count)) {
kmp_str_buf_t buf;
__kmp_hw_get_catalog_core_string(item.attr[j], &buf, num > 0);
- KMP_AFF_WARNING(AffHWSubsetManyGeneric, buf.str);
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetManyGeneric, buf.str);
__kmp_str_buf_free(&buf);
return false;
}
@@ -1092,7 +1219,7 @@ bool kmp_topology_t::filter_hw_subset() {
}
kmp_str_buf_t buf;
__kmp_hw_get_catalog_core_string(other_attr, &buf, item.num[j] > 0);
- KMP_AFF_WARNING(AffHWSubsetIncompat,
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetIncompat,
__kmp_hw_get_catalog_string(KMP_HW_CORE), buf.str);
__kmp_str_buf_free(&buf);
return false;
@@ -1105,7 +1232,7 @@ bool kmp_topology_t::filter_hw_subset() {
kmp_str_buf_t buf;
__kmp_hw_get_catalog_core_string(item.attr[j], &buf,
item.num[j] > 0);
- KMP_AFF_WARNING(AffHWSubsetAttrRepeat, buf.str);
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetAttrRepeat, buf.str);
__kmp_str_buf_free(&buf);
return false;
}
@@ -1115,43 +1242,92 @@ bool kmp_topology_t::filter_hw_subset() {
}
}
- struct core_type_indexer {
- int operator()(const kmp_hw_thread_t &t) const {
- switch (t.attrs.get_core_type()) {
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- case KMP_HW_CORE_TYPE_ATOM:
- return 1;
- case KMP_HW_CORE_TYPE_CORE:
- return 2;
-#endif
- case KMP_HW_CORE_TYPE_UNKNOWN:
- return 0;
- }
- KMP_ASSERT(0);
- return 0;
+ // For keeping track of sub_ids for an absolute KMP_HW_SUBSET
+ // or core attributes (core type or efficiency)
+ int prev_sub_ids[KMP_HW_LAST];
+ int abs_sub_ids[KMP_HW_LAST];
+ int core_eff_sub_ids[KMP_HW_MAX_NUM_CORE_EFFS];
+ int core_type_sub_ids[KMP_HW_MAX_NUM_CORE_TYPES];
+ for (size_t i = 0; i < KMP_HW_LAST; ++i) {
+ abs_sub_ids[i] = -1;
+ prev_sub_ids[i] = -1;
+ }
+ for (size_t i = 0; i < KMP_HW_MAX_NUM_CORE_EFFS; ++i)
+ core_eff_sub_ids[i] = -1;
+ for (size_t i = 0; i < KMP_HW_MAX_NUM_CORE_TYPES; ++i)
+ core_type_sub_ids[i] = -1;
+
+ // Determine which hardware threads should be filtered.
+
+ // Helpful to determine if a topology layer is targeted by an absolute subset
+ auto is_targeted = [&](int level) {
+ if (is_absolute) {
+ for (int i = 0; i < hw_subset_depth; ++i)
+ if (topology_levels[i] == level)
+ return true;
+ return false;
}
+ // If not absolute KMP_HW_SUBSET, then every layer is seen as targeted
+ return true;
};
- struct core_eff_indexer {
- int operator()(const kmp_hw_thread_t &t) const {
- return t.attrs.get_core_eff();
+
+ // Helpful to index into core type sub Ids array
+ auto get_core_type_index = [](const kmp_hw_thread_t &t) {
+ switch (t.attrs.get_core_type()) {
+ case KMP_HW_CORE_TYPE_UNKNOWN:
+ case KMP_HW_MAX_NUM_CORE_TYPES:
+ return 0;
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+ case KMP_HW_CORE_TYPE_ATOM:
+ return 1;
+ case KMP_HW_CORE_TYPE_CORE:
+ return 2;
+#endif
}
+ KMP_ASSERT2(false, "Unhandled kmp_hw_thread_t enumeration");
+ KMP_BUILTIN_UNREACHABLE;
};
- kmp_sub_ids_t core_type_sub_ids(
- core_level);
- kmp_sub_ids_t core_eff_sub_ids(
- core_level);
+ // Helpful to index into core efficiencies sub Ids array
+ auto get_core_eff_index = [](const kmp_hw_thread_t &t) {
+ return t.attrs.get_core_eff();
+ };
- // Determine which hardware threads should be filtered.
int num_filtered = 0;
- bool *filtered = (bool *)__kmp_allocate(sizeof(bool) * num_hw_threads);
+ kmp_affin_mask_t *filtered_mask;
+ KMP_CPU_ALLOC(filtered_mask);
+ KMP_CPU_COPY(filtered_mask, __kmp_affin_fullMask);
for (int i = 0; i < num_hw_threads; ++i) {
kmp_hw_thread_t &hw_thread = hw_threads[i];
- // Update type_sub_id
- if (using_core_types)
- core_type_sub_ids.update(hw_thread);
- if (using_core_effs)
- core_eff_sub_ids.update(hw_thread);
+
+ // Figure out the absolute sub ids and core eff/type sub ids
+ if (is_absolute || using_core_effs || using_core_types) {
+ for (int level = 0; level < get_depth(); ++level) {
+ if (hw_thread.sub_ids[level] != prev_sub_ids[level]) {
+ bool found_targeted = false;
+ for (int j = level; j < get_depth(); ++j) {
+ bool targeted = is_targeted(j);
+ if (!found_targeted && targeted) {
+ found_targeted = true;
+ abs_sub_ids[j]++;
+ if (j == core_level && using_core_effs)
+ core_eff_sub_ids[get_core_eff_index(hw_thread)]++;
+ if (j == core_level && using_core_types)
+ core_type_sub_ids[get_core_type_index(hw_thread)]++;
+ } else if (targeted) {
+ abs_sub_ids[j] = 0;
+ if (j == core_level && using_core_effs)
+ core_eff_sub_ids[get_core_eff_index(hw_thread)] = 0;
+ if (j == core_level && using_core_types)
+ core_type_sub_ids[get_core_type_index(hw_thread)] = 0;
+ }
+ }
+ break;
+ }
+ }
+ for (int level = 0; level < get_depth(); ++level)
+ prev_sub_ids[level] = hw_thread.sub_ids[level];
+ }
// Check to see if this hardware thread should be filtered
bool should_be_filtered = false;
@@ -1186,71 +1362,60 @@ bool kmp_topology_t::filter_hw_subset() {
int num = hw_subset_item.num[attr_idx];
int offset = hw_subset_item.offset[attr_idx];
if (using_core_types)
- sub_id = core_type_sub_ids.get_sub_id(hw_thread);
+ sub_id = core_type_sub_ids[get_core_type_index(hw_thread)];
else
- sub_id = core_eff_sub_ids.get_sub_id(hw_thread);
+ sub_id = core_eff_sub_ids[get_core_eff_index(hw_thread)];
if (sub_id < offset ||
(num != kmp_hw_subset_t::USE_ALL && sub_id >= offset + num)) {
should_be_filtered = true;
break;
}
} else {
+ int sub_id;
int num = hw_subset_item.num[0];
int offset = hw_subset_item.offset[0];
- if (hw_thread.sub_ids[level] < offset ||
- (num != kmp_hw_subset_t::USE_ALL &&
- hw_thread.sub_ids[level] >= offset + num)) {
+ if (is_absolute)
+ sub_id = abs_sub_ids[level];
+ else
+ sub_id = hw_thread.sub_ids[level];
+ if (hw_thread.ids[level] == kmp_hw_thread_t::UNKNOWN_ID ||
+ sub_id < offset ||
+ (num != kmp_hw_subset_t::USE_ALL && sub_id >= offset + num)) {
should_be_filtered = true;
break;
}
}
}
// Collect filtering information
- filtered[i] = should_be_filtered;
- if (should_be_filtered)
+ if (should_be_filtered) {
+ KMP_CPU_CLR(hw_thread.os_id, filtered_mask);
num_filtered++;
+ }
}
// One last check that we shouldn't allow filtering entire machine
if (num_filtered == num_hw_threads) {
- KMP_AFF_WARNING(AffHWSubsetAllFiltered);
- __kmp_free(filtered);
+ KMP_AFF_WARNING(__kmp_affinity, AffHWSubsetAllFiltered);
return false;
}
// Apply the filter
- int new_index = 0;
- for (int i = 0; i < num_hw_threads; ++i) {
- if (!filtered[i]) {
- if (i != new_index)
- hw_threads[new_index] = hw_threads[i];
- new_index++;
- } else {
-#if KMP_AFFINITY_SUPPORTED
- KMP_CPU_CLR(hw_threads[i].os_id, __kmp_affin_fullMask);
-#endif
- __kmp_avail_proc--;
- }
- }
-
- KMP_DEBUG_ASSERT(new_index <= num_hw_threads);
- num_hw_threads = new_index;
-
- // Post hardware subset canonicalization
- _gather_enumeration_information();
- _discover_uniformity();
- _set_globals();
- _set_last_level_cache();
- __kmp_free(filtered);
+ restrict_to_mask(filtered_mask);
return true;
}
-bool kmp_topology_t::is_close(int hwt1, int hwt2, int hw_level) const {
+bool kmp_topology_t::is_close(int hwt1, int hwt2,
+ const kmp_affinity_t &stgs) const {
+ int hw_level = stgs.gran_levels;
if (hw_level >= depth)
return true;
bool retval = true;
const kmp_hw_thread_t &t1 = hw_threads[hwt1];
const kmp_hw_thread_t &t2 = hw_threads[hwt2];
+ if (stgs.flags.core_types_gran)
+ return t1.attrs.get_core_type() == t2.attrs.get_core_type();
+ if (stgs.flags.core_effs_gran)
+ return t1.attrs.get_core_eff() == t2.attrs.get_core_eff();
for (int i = 0; i < (depth - hw_level); ++i) {
if (t1.ids[i] != t2.ids[i])
return false;
@@ -1260,30 +1425,6 @@ bool kmp_topology_t::is_close(int hwt1, int hwt2, int hw_level) const {
////////////////////////////////////////////////////////////////////////////////
-#if KMP_AFFINITY_SUPPORTED
-class kmp_affinity_raii_t {
- kmp_affin_mask_t *mask;
- bool restored;
-
-public:
- kmp_affinity_raii_t() : restored(false) {
- KMP_CPU_ALLOC(mask);
- KMP_ASSERT(mask != NULL);
- __kmp_get_system_affinity(mask, TRUE);
- }
- void restore() {
- __kmp_set_system_affinity(mask, TRUE);
- KMP_CPU_FREE(mask);
- restored = true;
- }
- ~kmp_affinity_raii_t() {
- if (!restored) {
- __kmp_set_system_affinity(mask, TRUE);
- KMP_CPU_FREE(mask);
- }
- }
-};
-
bool KMPAffinity::picked_api = false;
void *KMPAffinity::Mask::operator new(size_t n) { return __kmp_allocate(n); }
@@ -1301,7 +1442,7 @@ void KMPAffinity::pick_api() {
// Only use Hwloc if affinity isn't explicitly disabled and
// user requests Hwloc topology method
if (__kmp_affinity_top_method == affinity_top_method_hwloc &&
- __kmp_affinity_type != affinity_disabled) {
+ __kmp_affinity.type != affinity_disabled) {
affinity_dispatch = new KMPHwlocAffinity();
} else
#endif
@@ -1448,15 +1589,13 @@ kmp_str_buf_t *__kmp_affinity_str_buf_mask(kmp_str_buf_t *buf,
return buf;
}
-// Return (possibly empty) affinity mask representing the offline CPUs
-// Caller must free the mask
-kmp_affin_mask_t *__kmp_affinity_get_offline_cpus() {
- kmp_affin_mask_t *offline;
- KMP_CPU_ALLOC(offline);
- KMP_CPU_ZERO(offline);
+static kmp_affin_mask_t *__kmp_parse_cpu_list(const char *path) {
+ kmp_affin_mask_t *mask;
+ KMP_CPU_ALLOC(mask);
+ KMP_CPU_ZERO(mask);
#if KMP_OS_LINUX
int n, begin_cpu, end_cpu;
- kmp_safe_raii_file_t offline_file;
+ kmp_safe_raii_file_t file;
auto skip_ws = [](FILE *f) {
int c;
do {
@@ -1465,29 +1604,29 @@ kmp_affin_mask_t *__kmp_affinity_get_offline_cpus() {
if (c != EOF)
ungetc(c, f);
};
- // File contains CSV of integer ranges representing the offline CPUs
+ // File contains CSV of integer ranges representing the CPUs
// e.g., 1,2,4-7,9,11-15
- int status = offline_file.try_open("/sys/devices/system/cpu/offline", "r");
+ int status = file.try_open(path, "r");
if (status != 0)
- return offline;
- while (!feof(offline_file)) {
- skip_ws(offline_file);
- n = fscanf(offline_file, "%d", &begin_cpu);
+ return mask;
+ while (!feof(file)) {
+ skip_ws(file);
+ n = fscanf(file, "%d", &begin_cpu);
if (n != 1)
break;
- skip_ws(offline_file);
- int c = fgetc(offline_file);
+ skip_ws(file);
+ int c = fgetc(file);
if (c == EOF || c == ',') {
// Just single CPU
end_cpu = begin_cpu;
} else if (c == '-') {
// Range of CPUs
- skip_ws(offline_file);
- n = fscanf(offline_file, "%d", &end_cpu);
+ skip_ws(file);
+ n = fscanf(file, "%d", &end_cpu);
if (n != 1)
break;
- skip_ws(offline_file);
- c = fgetc(offline_file); // skip ','
+ skip_ws(file);
+ c = fgetc(file); // skip ','
} else {
// Syntax problem
break;
@@ -1497,13 +1636,19 @@ kmp_affin_mask_t *__kmp_affinity_get_offline_cpus() {
end_cpu >= __kmp_xproc || begin_cpu > end_cpu) {
continue;
}
- // Insert [begin_cpu, end_cpu] into offline mask
+ // Insert [begin_cpu, end_cpu] into mask
for (int cpu = begin_cpu; cpu <= end_cpu; ++cpu) {
- KMP_CPU_SET(cpu, offline);
+ KMP_CPU_SET(cpu, mask);
}
}
#endif
- return offline;
+ return mask;
+}
+
+// Return (possibly empty) affinity mask representing the offline CPUs
+// Caller must free the mask
+kmp_affin_mask_t *__kmp_affinity_get_offline_cpus() {
+ return __kmp_parse_cpu_list("/sys/devices/system/cpu/offline");
}
// Return the number of available procs
@@ -1592,6 +1737,7 @@ static inline kmp_hw_t __kmp_hwloc_type_2_topology_type(hwloc_obj_t obj) {
case HWLOC_OBJ_PU:
return KMP_HW_THREAD;
case HWLOC_OBJ_GROUP:
+#if HWLOC_API_VERSION >= 0x00020000
if (obj->attr->group.kind == HWLOC_GROUP_KIND_INTEL_DIE)
return KMP_HW_DIE;
else if (obj->attr->group.kind == HWLOC_GROUP_KIND_INTEL_TILE)
@@ -1600,6 +1746,7 @@ static inline kmp_hw_t __kmp_hwloc_type_2_topology_type(hwloc_obj_t obj) {
return KMP_HW_MODULE;
else if (obj->attr->group.kind == HWLOC_GROUP_KIND_WINDOWS_PROCESSOR_GROUP)
return KMP_HW_PROC_GROUP;
+#endif
return KMP_HW_UNKNOWN;
#if HWLOC_API_VERSION >= 0x00020100
case HWLOC_OBJ_DIE:
@@ -1663,14 +1810,14 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hwloc_topology_t tp = __kmp_hwloc_topology;
*msg_id = kmp_i18n_null;
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(AffUsingHwloc, "KMP_AFFINITY");
}
if (!KMP_AFFINITY_CAPABLE()) {
// Hack to try and infer the machine topology using only the data
// available from hwloc on the current thread, and __kmp_xproc.
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
// hwloc only guarantees existance of PU object, so check PACKAGE and CORE
hwloc_obj_t o = hwloc_get_obj_by_type(tp, HWLOC_OBJ_PACKAGE, 0);
if (o != NULL)
@@ -1682,6 +1829,8 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
__kmp_nThreadsPerCore = __kmp_hwloc_get_nobjs_under_obj(o, HWLOC_OBJ_PU);
else
__kmp_nThreadsPerCore = 1; // no CORE found
+ if (__kmp_nThreadsPerCore == 0)
+ __kmp_nThreadsPerCore = 1;
__kmp_ncores = __kmp_xproc / __kmp_nThreadsPerCore;
if (nCoresPerPkg == 0)
nCoresPerPkg = 1; // to prevent possible division by 0
@@ -1689,6 +1838,7 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
return true;
}
+#if HWLOC_API_VERSION >= 0x00020400
// Handle multiple types of cores if they exist on the system
int nr_cpu_kinds = hwloc_cpukinds_get_nr(tp, 0);
@@ -1727,19 +1877,14 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
}
}
}
+#endif
root = hwloc_get_root_obj(tp);
// Figure out the depth and types in the topology
depth = 0;
- pu = hwloc_get_pu_obj_by_os_index(tp, __kmp_affin_fullMask->begin());
- KMP_ASSERT(pu);
- obj = pu;
- types[depth] = KMP_HW_THREAD;
- hwloc_types[depth] = obj->type;
- depth++;
- while (obj != root && obj != NULL) {
- obj = obj->parent;
+ obj = hwloc_get_pu_obj_by_os_index(tp, __kmp_affin_fullMask->begin());
+ while (obj && obj != root) {
#if HWLOC_API_VERSION >= 0x00020000
if (obj->memory_arity) {
hwloc_obj_t memory;
@@ -1761,6 +1906,7 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hwloc_types[depth] = obj->type;
depth++;
}
+ obj = obj->parent;
}
KMP_ASSERT(depth > 0);
@@ -1787,7 +1933,9 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hw_thread.clear();
hw_thread.ids[index] = pu->logical_index;
hw_thread.os_id = pu->os_index;
+ hw_thread.original_idx = hw_thread_index;
// If multiple core types, then set that attribute for the hardware thread
+#if HWLOC_API_VERSION >= 0x00020400
if (cpukinds) {
int cpukind_index = -1;
for (int i = 0; i < nr_cpu_kinds; ++i) {
@@ -1801,6 +1949,7 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hw_thread.attrs.set_core_eff(cpukinds[cpukind_index].efficiency);
}
}
+#endif
index--;
}
obj = pu;
@@ -1825,7 +1974,6 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hw_thread.ids[index + 1] = sub_id;
index--;
}
- prev = memory;
}
prev = obj;
}
@@ -1845,12 +1993,14 @@ static bool __kmp_affinity_create_hwloc_map(kmp_i18n_id_t *const msg_id) {
hw_thread_index++;
}
+#if HWLOC_API_VERSION >= 0x00020400
// Free the core types information
if (cpukinds) {
for (int idx = 0; idx < nr_cpu_kinds; ++idx)
hwloc_bitmap_free(cpukinds[idx].mask);
__kmp_free(cpukinds);
}
+#endif
__kmp_topology->sort_ids();
return true;
}
@@ -1864,15 +2014,15 @@ static bool __kmp_affinity_create_flat_map(kmp_i18n_id_t *const msg_id) {
int depth = 3;
kmp_hw_t types[] = {KMP_HW_SOCKET, KMP_HW_CORE, KMP_HW_THREAD};
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(UsingFlatOS, "KMP_AFFINITY");
}
- // Even if __kmp_affinity_type == affinity_none, this routine might still
- // called to set __kmp_ncores, as well as
+ // Even if __kmp_affinity.type == affinity_none, this routine might still
+ // be called to set __kmp_ncores, as well as
// __kmp_nThreadsPerCore, nCoresPerPkg, & nPackages.
if (!KMP_AFFINITY_CAPABLE()) {
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
__kmp_ncores = nPackages = __kmp_xproc;
__kmp_nThreadsPerCore = nCoresPerPkg = 1;
return true;
@@ -1897,12 +2047,13 @@ static bool __kmp_affinity_create_flat_map(kmp_i18n_id_t *const msg_id) {
kmp_hw_thread_t &hw_thread = __kmp_topology->at(avail_ct);
hw_thread.clear();
hw_thread.os_id = i;
+ hw_thread.original_idx = avail_ct;
hw_thread.ids[0] = i;
hw_thread.ids[1] = 0;
hw_thread.ids[2] = 0;
avail_ct++;
}
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(OSProcToPackage, "KMP_AFFINITY");
}
return true;
@@ -1919,13 +2070,13 @@ static bool __kmp_affinity_create_proc_group_map(kmp_i18n_id_t *const msg_id) {
kmp_hw_t types[] = {KMP_HW_PROC_GROUP, KMP_HW_CORE, KMP_HW_THREAD};
const static size_t BITS_PER_GROUP = CHAR_BIT * sizeof(DWORD_PTR);
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(AffWindowsProcGroupMap, "KMP_AFFINITY");
}
// If we aren't affinity capable, then use flat topology
if (!KMP_AFFINITY_CAPABLE()) {
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
nPackages = __kmp_num_proc_groups;
__kmp_nThreadsPerCore = 1;
__kmp_ncores = __kmp_xproc;
@@ -1942,11 +2093,13 @@ static bool __kmp_affinity_create_proc_group_map(kmp_i18n_id_t *const msg_id) {
if (!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) {
continue;
}
- kmp_hw_thread_t &hw_thread = __kmp_topology->at(avail_ct++);
+ kmp_hw_thread_t &hw_thread = __kmp_topology->at(avail_ct);
hw_thread.clear();
hw_thread.os_id = i;
+ hw_thread.original_idx = avail_ct;
hw_thread.ids[0] = i / BITS_PER_GROUP;
hw_thread.ids[1] = hw_thread.ids[2] = i % BITS_PER_GROUP;
+ avail_ct++;
}
return true;
}
@@ -2002,15 +2155,43 @@ static int __kmp_affinity_cmp_apicThreadInfo_phys_id(const void *a,
return 0;
}
-class kmp_cache_info_t {
+class cpuid_cache_info_t {
public:
struct info_t {
- unsigned level, mask;
+ unsigned level = 0;
+ unsigned mask = 0;
+ bool operator==(const info_t &rhs) const {
+ return level == rhs.level && mask == rhs.mask;
+ }
+ bool operator!=(const info_t &rhs) const { return !operator==(rhs); }
};
- kmp_cache_info_t() : depth(0) { get_leaf4_levels(); }
+ cpuid_cache_info_t() : depth(0) {
+ table[MAX_CACHE_LEVEL].level = 0;
+ table[MAX_CACHE_LEVEL].mask = 0;
+ }
size_t get_depth() const { return depth; }
info_t &operator[](size_t index) { return table[index]; }
const info_t &operator[](size_t index) const { return table[index]; }
+ bool operator==(const cpuid_cache_info_t &rhs) const {
+ if (rhs.depth != depth)
+ return false;
+ for (size_t i = 0; i < depth; ++i)
+ if (table[i] != rhs.table[i])
+ return false;
+ return true;
+ }
+ bool operator!=(const cpuid_cache_info_t &rhs) const {
+ return !operator==(rhs);
+ }
+ // Get cache information assocaited with L1, L2, L3 cache, etc.
+ // If level does not exist, then return the "NULL" level (level 0)
+ const info_t &get_level(unsigned level) const {
+ for (size_t i = 0; i < depth; ++i) {
+ if (table[i].level == level)
+ return table[i];
+ }
+ return table[MAX_CACHE_LEVEL];
+ }
static kmp_hw_t get_topology_type(unsigned level) {
KMP_DEBUG_ASSERT(level >= 1 && level <= MAX_CACHE_LEVEL);
@@ -2024,13 +2205,6 @@ class kmp_cache_info_t {
}
return KMP_HW_UNKNOWN;
}
-
-private:
- static const int MAX_CACHE_LEVEL = 3;
-
- size_t depth;
- info_t table[MAX_CACHE_LEVEL];
-
void get_leaf4_levels() {
unsigned level = 0;
while (depth < MAX_CACHE_LEVEL) {
@@ -2055,6 +2229,11 @@ class kmp_cache_info_t {
level++;
}
}
+ static const int MAX_CACHE_LEVEL = 3;
+
+private:
+ size_t depth;
+ info_t table[MAX_CACHE_LEVEL + 1];
};
// On IA-32 architecture and Intel(R) 64 architecture, we attempt to use
@@ -2065,7 +2244,7 @@ static bool __kmp_affinity_create_apicid_map(kmp_i18n_id_t *const msg_id) {
kmp_cpuid buf;
*msg_id = kmp_i18n_null;
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(AffInfoStr, "KMP_AFFINITY", KMP_I18N_STR(DecodingLegacyAPIC));
}
@@ -2084,7 +2263,7 @@ static bool __kmp_affinity_create_apicid_map(kmp_i18n_id_t *const msg_id) {
if (!KMP_AFFINITY_CAPABLE()) {
// Hack to try and infer the machine topology using only the data
// available from cpuid on the current thread, and __kmp_xproc.
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
// Get an upper bound on the number of threads per package using cpuid(1).
// On some OS/chps combinations where HT is supported by the chip but is
@@ -2136,7 +2315,7 @@ static bool __kmp_affinity_create_apicid_map(kmp_i18n_id_t *const msg_id) {
// From here on, we can assume that it is safe to call
// __kmp_get_system_affinity() and __kmp_set_system_affinity(), even if
- // __kmp_affinity_type = affinity_none.
+ // __kmp_affinity.type = affinity_none.
// Save the affinity mask for the current thread.
kmp_affinity_raii_t previous_affinity;
@@ -2362,6 +2541,7 @@ static bool __kmp_affinity_create_apicid_map(kmp_i18n_id_t *const msg_id) {
hw_thread.ids[idx++] = threadInfo[i].threadId;
}
hw_thread.os_id = os;
+ hw_thread.original_idx = i;
}
__kmp_free(threadInfo);
@@ -2417,15 +2597,13 @@ enum {
INTEL_LEVEL_TYPE_INVALID = 0, // Package level
INTEL_LEVEL_TYPE_SMT = 1,
INTEL_LEVEL_TYPE_CORE = 2,
- INTEL_LEVEL_TYPE_TILE = 3,
- INTEL_LEVEL_TYPE_MODULE = 4,
+ INTEL_LEVEL_TYPE_MODULE = 3,
+ INTEL_LEVEL_TYPE_TILE = 4,
INTEL_LEVEL_TYPE_DIE = 5,
INTEL_LEVEL_TYPE_LAST = 6,
};
-
-struct cpuid_level_info_t {
- unsigned level_type, mask, mask_width, nitems, cache_mask;
-};
+KMP_BUILD_ASSERT(INTEL_LEVEL_TYPE_LAST < sizeof(unsigned) * CHAR_BIT);
+#define KMP_LEAF_1F_KNOWN_LEVELS ((1u << INTEL_LEVEL_TYPE_LAST) - 1u)
static kmp_hw_t __kmp_intel_type_2_topology_type(int intel_type) {
switch (intel_type) {
@@ -2445,16 +2623,78 @@ static kmp_hw_t __kmp_intel_type_2_topology_type(int intel_type) {
return KMP_HW_UNKNOWN;
}
-// This function takes the topology leaf, a levels array to store the levels
-// detected and a bitmap of the known levels.
-// Returns the number of levels in the topology
-static unsigned
-__kmp_x2apicid_get_levels(int leaf,
- cpuid_level_info_t levels[INTEL_LEVEL_TYPE_LAST],
- kmp_uint64 known_levels) {
+static int __kmp_topology_type_2_intel_type(kmp_hw_t type) {
+ switch (type) {
+ case KMP_HW_SOCKET:
+ return INTEL_LEVEL_TYPE_INVALID;
+ case KMP_HW_THREAD:
+ return INTEL_LEVEL_TYPE_SMT;
+ case KMP_HW_CORE:
+ return INTEL_LEVEL_TYPE_CORE;
+ case KMP_HW_TILE:
+ return INTEL_LEVEL_TYPE_TILE;
+ case KMP_HW_MODULE:
+ return INTEL_LEVEL_TYPE_MODULE;
+ case KMP_HW_DIE:
+ return INTEL_LEVEL_TYPE_DIE;
+ default:
+ return INTEL_LEVEL_TYPE_INVALID;
+ }
+}
+
+struct cpuid_level_info_t {
+ unsigned level_type, mask, mask_width, nitems, cache_mask;
+};
+
+class cpuid_topo_desc_t {
+ unsigned desc = 0;
+
+public:
+ void clear() { desc = 0; }
+ bool contains(int intel_type) const {
+ KMP_DEBUG_ASSERT(intel_type >= 0 && intel_type < INTEL_LEVEL_TYPE_LAST);
+ if ((1u << intel_type) & desc)
+ return true;
+ return false;
+ }
+ bool contains_topology_type(kmp_hw_t type) const {
+ KMP_DEBUG_ASSERT(type >= 0 && type < KMP_HW_LAST);
+ int intel_type = __kmp_topology_type_2_intel_type(type);
+ return contains(intel_type);
+ }
+ bool contains(cpuid_topo_desc_t rhs) const {
+ return ((desc | rhs.desc) == desc);
+ }
+ void add(int intel_type) { desc |= (1u << intel_type); }
+ void add(cpuid_topo_desc_t rhs) { desc |= rhs.desc; }
+};
+
+struct cpuid_proc_info_t {
+ // Topology info
+ int os_id;
+ unsigned apic_id;
+ unsigned depth;
+ // Hybrid info
+ unsigned native_model_id;
+ int efficiency;
+ kmp_hw_core_type_t type;
+ cpuid_topo_desc_t description;
+
+ cpuid_level_info_t levels[INTEL_LEVEL_TYPE_LAST];
+};
+
+// This function takes the topology leaf, an info pointer to store the levels
+// detected, and writable descriptors for the total topology.
+// Returns whether total types, depth, or description were modified.
+static bool __kmp_x2apicid_get_levels(int leaf, cpuid_proc_info_t *info,
+ kmp_hw_t total_types[KMP_HW_LAST],
+ int *total_depth,
+ cpuid_topo_desc_t *total_description) {
unsigned level, levels_index;
unsigned level_type, mask_width, nitems;
kmp_cpuid buf;
+ cpuid_level_info_t(&levels)[INTEL_LEVEL_TYPE_LAST] = info->levels;
+ bool retval = false;
// New algorithm has known topology layers act as highest unknown topology
// layers when unknown topology layers exist.
@@ -2469,10 +2709,12 @@ __kmp_x2apicid_get_levels(int leaf,
level_type = __kmp_extract_bits<8, 15>(buf.ecx);
mask_width = __kmp_extract_bits<0, 4>(buf.eax);
nitems = __kmp_extract_bits<0, 15>(buf.ebx);
- if (level_type != INTEL_LEVEL_TYPE_INVALID && nitems == 0)
- return 0;
+ if (level_type != INTEL_LEVEL_TYPE_INVALID && nitems == 0) {
+ info->depth = 0;
+ return retval;
+ }
- if (known_levels & (1ull << level_type)) {
+ if (KMP_LEAF_1F_KNOWN_LEVELS & (1u << level_type)) {
// Add a new level to the topology
KMP_ASSERT(levels_index < INTEL_LEVEL_TYPE_LAST);
levels[levels_index].level_type = level_type;
@@ -2488,6 +2730,26 @@ __kmp_x2apicid_get_levels(int leaf,
}
level++;
} while (level_type != INTEL_LEVEL_TYPE_INVALID);
+ KMP_ASSERT(levels_index <= INTEL_LEVEL_TYPE_LAST);
+ info->description.clear();
+ info->depth = levels_index;
+
+ // If types, depth, and total_description are uninitialized,
+ // then initialize them now
+ if (*total_depth == 0) {
+ *total_depth = info->depth;
+ total_description->clear();
+ for (int i = *total_depth - 1, j = 0; i >= 0; --i, ++j) {
+ total_types[j] =
+ __kmp_intel_type_2_topology_type(info->levels[i].level_type);
+ total_description->add(info->levels[i].level_type);
+ }
+ retval = true;
+ }
+
+ // Ensure the INTEL_LEVEL_TYPE_INVALID (Socket) layer isn't first
+ if (levels_index == 0 || levels[0].level_type == INTEL_LEVEL_TYPE_INVALID)
+ return 0;
// Set the masks to & with apicid
for (unsigned i = 0; i < levels_index; ++i) {
@@ -2497,42 +2759,65 @@ __kmp_x2apicid_get_levels(int leaf,
for (unsigned j = 0; j < i; ++j)
levels[i].mask ^= levels[j].mask;
} else {
- KMP_DEBUG_ASSERT(levels_index > 0);
+ KMP_DEBUG_ASSERT(i > 0);
levels[i].mask = (-1) << levels[i - 1].mask_width;
levels[i].cache_mask = 0;
}
+ info->description.add(info->levels[i].level_type);
}
- return levels_index;
+
+ // If this processor has level type not on other processors, then make
+ // sure to include it in total types, depth, and description.
+ // One assumption here is that the first type, i.e. socket, is known.
+ // Another assumption is that types array is always large enough to fit any
+ // new layers since its length is KMP_HW_LAST.
+ if (!total_description->contains(info->description)) {
+ for (int i = info->depth - 1, j = 0; i >= 0; --i, ++j) {
+ // If this level is known already, then skip it.
+ if (total_description->contains(levels[i].level_type))
+ continue;
+ // Unknown level, insert before last known level
+ kmp_hw_t curr_type =
+ __kmp_intel_type_2_topology_type(levels[i].level_type);
+ KMP_ASSERT(j != 0 && "Bad APIC Id information");
+ // Move over all known levels to make room for new level
+ for (int k = info->depth - 1; k >= j; --k) {
+ KMP_DEBUG_ASSERT(k + 1 < KMP_HW_LAST);
+ total_types[k + 1] = total_types[k];
+ }
+ // Insert new level
+ total_types[j] = curr_type;
+ (*total_depth)++;
+ }
+ total_description->add(info->description);
+ retval = true;
+ }
+ return retval;
}
static bool __kmp_affinity_create_x2apicid_map(kmp_i18n_id_t *const msg_id) {
- cpuid_level_info_t levels[INTEL_LEVEL_TYPE_LAST];
kmp_hw_t types[INTEL_LEVEL_TYPE_LAST];
- unsigned levels_index;
kmp_cpuid buf;
- kmp_uint64 known_levels;
- int topology_leaf, highest_leaf, apic_id;
+ int topology_leaf, highest_leaf;
int num_leaves;
+ int depth = 0;
+ cpuid_topo_desc_t total_description;
static int leaves[] = {0, 0};
- kmp_i18n_id_t leaf_message_id;
+ // If affinity is disabled, __kmp_avail_proc may be zero
+ int ninfos = (__kmp_avail_proc > 0 ? __kmp_avail_proc : 1);
+ cpuid_proc_info_t *proc_info = (cpuid_proc_info_t *)__kmp_allocate(
+ (sizeof(cpuid_proc_info_t) + sizeof(cpuid_cache_info_t)) * ninfos);
+ cpuid_cache_info_t *cache_info = (cpuid_cache_info_t *)(proc_info + ninfos);
- KMP_BUILD_ASSERT(sizeof(known_levels) * CHAR_BIT > KMP_HW_LAST);
+ kmp_i18n_id_t leaf_message_id;
*msg_id = kmp_i18n_null;
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(AffInfoStr, "KMP_AFFINITY", KMP_I18N_STR(Decodingx2APIC));
}
- // Figure out the known topology levels
- known_levels = 0ull;
- for (int i = 0; i < INTEL_LEVEL_TYPE_LAST; ++i) {
- if (__kmp_intel_type_2_topology_type(i) != KMP_HW_UNKNOWN) {
- known_levels |= (1ull << i);
- }
- }
-
// Get the highest cpuid leaf supported
__kmp_x86_cpuid(0, 0, &buf);
highest_leaf = buf.eax;
@@ -2566,16 +2851,18 @@ static bool __kmp_affinity_create_x2apicid_map(kmp_i18n_id_t *const msg_id) {
if (buf.ebx == 0)
continue;
topology_leaf = leaf;
- levels_index = __kmp_x2apicid_get_levels(leaf, levels, known_levels);
- if (levels_index == 0)
+ __kmp_x2apicid_get_levels(leaf, &proc_info[0], types, &depth,
+ &total_description);
+ if (depth == 0)
continue;
break;
}
- if (topology_leaf == -1 || levels_index == 0) {
+ if (topology_leaf == -1 || depth == 0) {
*msg_id = leaf_message_id;
+ __kmp_free(proc_info);
return false;
}
- KMP_ASSERT(levels_index <= INTEL_LEVEL_TYPE_LAST);
+ KMP_ASSERT(depth <= INTEL_LEVEL_TYPE_LAST);
// The algorithm used starts by setting the affinity to each available thread
// and retrieving info from the cpuid instruction, so if we are not capable of
@@ -2585,46 +2872,23 @@ static bool __kmp_affinity_create_x2apicid_map(kmp_i18n_id_t *const msg_id) {
if (!KMP_AFFINITY_CAPABLE()) {
// Hack to try and infer the machine topology using only the data
// available from cpuid on the current thread, and __kmp_xproc.
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
- for (unsigned i = 0; i < levels_index; ++i) {
- if (levels[i].level_type == INTEL_LEVEL_TYPE_SMT) {
- __kmp_nThreadsPerCore = levels[i].nitems;
- } else if (levels[i].level_type == INTEL_LEVEL_TYPE_CORE) {
- nCoresPerPkg = levels[i].nitems;
- }
- }
- __kmp_ncores = __kmp_xproc / __kmp_nThreadsPerCore;
- nPackages = (__kmp_xproc + nCoresPerPkg - 1) / nCoresPerPkg;
- return true;
- }
-
- // Allocate the data structure to be returned.
- int depth = levels_index;
- for (int i = depth - 1, j = 0; i >= 0; --i, ++j)
- types[j] = __kmp_intel_type_2_topology_type(levels[i].level_type);
- __kmp_topology =
- kmp_topology_t::allocate(__kmp_avail_proc, levels_index, types);
-
- // Insert equivalent cache types if they exist
- kmp_cache_info_t cache_info;
- for (size_t i = 0; i < cache_info.get_depth(); ++i) {
- const kmp_cache_info_t::info_t &info = cache_info[i];
- unsigned cache_mask = info.mask;
- unsigned cache_level = info.level;
- for (unsigned j = 0; j < levels_index; ++j) {
- unsigned hw_cache_mask = levels[j].cache_mask;
- kmp_hw_t cache_type = kmp_cache_info_t::get_topology_type(cache_level);
- if (hw_cache_mask == cache_mask && j < levels_index - 1) {
- kmp_hw_t type =
- __kmp_intel_type_2_topology_type(levels[j + 1].level_type);
- __kmp_topology->set_equivalent_type(cache_type, type);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
+ for (int i = 0; i < depth; ++i) {
+ if (proc_info[0].levels[i].level_type == INTEL_LEVEL_TYPE_SMT) {
+ __kmp_nThreadsPerCore = proc_info[0].levels[i].nitems;
+ } else if (proc_info[0].levels[i].level_type == INTEL_LEVEL_TYPE_CORE) {
+ nCoresPerPkg = proc_info[0].levels[i].nitems;
}
}
+ __kmp_ncores = __kmp_xproc / __kmp_nThreadsPerCore;
+ nPackages = (__kmp_xproc + nCoresPerPkg - 1) / nCoresPerPkg;
+ __kmp_free(proc_info);
+ return true;
}
// From here on, we can assume that it is safe to call
// __kmp_get_system_affinity() and __kmp_set_system_affinity(), even if
- // __kmp_affinity_type = affinity_none.
+ // __kmp_affinity.type = affinity_none.
// Save the affinity mask for the current thread.
kmp_affinity_raii_t previous_affinity;
@@ -2633,56 +2897,167 @@ static bool __kmp_affinity_create_x2apicid_map(kmp_i18n_id_t *const msg_id) {
// to it, and obtaining the pertinent information using the cpuid instr.
unsigned int proc;
int hw_thread_index = 0;
- KMP_CPU_SET_ITERATE(proc, __kmp_affin_fullMask) {
- cpuid_level_info_t my_levels[INTEL_LEVEL_TYPE_LAST];
- unsigned my_levels_index;
+ bool uniform_caches = true;
+ KMP_CPU_SET_ITERATE(proc, __kmp_affin_fullMask) {
// Skip this proc if it is not included in the machine model.
if (!KMP_CPU_ISSET(proc, __kmp_affin_fullMask)) {
continue;
}
KMP_DEBUG_ASSERT(hw_thread_index < __kmp_avail_proc);
+ // Gather topology information
__kmp_affinity_dispatch->bind_thread(proc);
-
- // New algorithm
__kmp_x86_cpuid(topology_leaf, 0, &buf);
- apic_id = buf.edx;
- kmp_hw_thread_t &hw_thread = __kmp_topology->at(hw_thread_index);
- my_levels_index =
- __kmp_x2apicid_get_levels(topology_leaf, my_levels, known_levels);
- if (my_levels_index == 0 || my_levels_index != levels_index) {
+ proc_info[hw_thread_index].os_id = proc;
+ proc_info[hw_thread_index].apic_id = buf.edx;
+ __kmp_x2apicid_get_levels(topology_leaf, &proc_info[hw_thread_index], types,
+ &depth, &total_description);
+ if (proc_info[hw_thread_index].depth == 0) {
*msg_id = kmp_i18n_str_InvalidCpuidInfo;
+ __kmp_free(proc_info);
return false;
}
- hw_thread.clear();
- hw_thread.os_id = proc;
- // Put in topology information
- for (unsigned j = 0, idx = depth - 1; j < my_levels_index; ++j, --idx) {
- hw_thread.ids[idx] = apic_id & my_levels[j].mask;
- if (j > 0) {
- hw_thread.ids[idx] >>= my_levels[j - 1].mask_width;
- }
- }
+ // Gather cache information and insert afterwards
+ cache_info[hw_thread_index].get_leaf4_levels();
+ if (uniform_caches && hw_thread_index > 0)
+ if (cache_info[0] != cache_info[hw_thread_index])
+ uniform_caches = false;
// Hybrid information
if (__kmp_is_hybrid_cpu() && highest_leaf >= 0x1a) {
- kmp_hw_core_type_t type;
- unsigned native_model_id;
- int efficiency;
- __kmp_get_hybrid_info(&type, &efficiency, &native_model_id);
- hw_thread.attrs.set_core_type(type);
- hw_thread.attrs.set_core_eff(efficiency);
+ __kmp_get_hybrid_info(&proc_info[hw_thread_index].type,
+ &proc_info[hw_thread_index].efficiency,
+ &proc_info[hw_thread_index].native_model_id);
}
hw_thread_index++;
}
KMP_ASSERT(hw_thread_index > 0);
+ previous_affinity.restore();
+
+ // Allocate the data structure to be returned.
+ __kmp_topology = kmp_topology_t::allocate(__kmp_avail_proc, depth, types);
+
+ // Create topology Ids and hybrid types in __kmp_topology
+ for (int i = 0; i < __kmp_topology->get_num_hw_threads(); ++i) {
+ kmp_hw_thread_t &hw_thread = __kmp_topology->at(i);
+ hw_thread.clear();
+ hw_thread.os_id = proc_info[i].os_id;
+ hw_thread.original_idx = i;
+ unsigned apic_id = proc_info[i].apic_id;
+ // Put in topology information
+ for (int j = 0, idx = depth - 1; j < depth; ++j, --idx) {
+ if (!(proc_info[i].description.contains_topology_type(
+ __kmp_topology->get_type(j)))) {
+ hw_thread.ids[idx] = kmp_hw_thread_t::UNKNOWN_ID;
+ } else {
+ hw_thread.ids[idx] = apic_id & proc_info[i].levels[j].mask;
+ if (j > 0) {
+ hw_thread.ids[idx] >>= proc_info[i].levels[j - 1].mask_width;
+ }
+ }
+ }
+ hw_thread.attrs.set_core_type(proc_info[i].type);
+ hw_thread.attrs.set_core_eff(proc_info[i].efficiency);
+ }
+
__kmp_topology->sort_ids();
+
+ // Change Ids to logical Ids
+ for (int j = 0; j < depth - 1; ++j) {
+ int new_id = 0;
+ int prev_id = __kmp_topology->at(0).ids[j];
+ int curr_id = __kmp_topology->at(0).ids[j + 1];
+ __kmp_topology->at(0).ids[j + 1] = new_id;
+ for (int i = 1; i < __kmp_topology->get_num_hw_threads(); ++i) {
+ kmp_hw_thread_t &hw_thread = __kmp_topology->at(i);
+ if (hw_thread.ids[j] == prev_id && hw_thread.ids[j + 1] == curr_id) {
+ hw_thread.ids[j + 1] = new_id;
+ } else if (hw_thread.ids[j] == prev_id &&
+ hw_thread.ids[j + 1] != curr_id) {
+ curr_id = hw_thread.ids[j + 1];
+ hw_thread.ids[j + 1] = ++new_id;
+ } else {
+ prev_id = hw_thread.ids[j];
+ curr_id = hw_thread.ids[j + 1];
+ hw_thread.ids[j + 1] = ++new_id;
+ }
+ }
+ }
+
+ // First check for easy cache placement. This occurs when caches are
+ // equivalent to a layer in the CPUID leaf 0xb or 0x1f topology.
+ if (uniform_caches) {
+ for (size_t i = 0; i < cache_info[0].get_depth(); ++i) {
+ unsigned cache_mask = cache_info[0][i].mask;
+ unsigned cache_level = cache_info[0][i].level;
+ KMP_ASSERT(cache_level <= cpuid_cache_info_t::MAX_CACHE_LEVEL);
+ kmp_hw_t cache_type = cpuid_cache_info_t::get_topology_type(cache_level);
+ __kmp_topology->set_equivalent_type(cache_type, cache_type);
+ for (int j = 0; j < depth; ++j) {
+ unsigned hw_cache_mask = proc_info[0].levels[j].cache_mask;
+ if (hw_cache_mask == cache_mask && j < depth - 1) {
+ kmp_hw_t type = __kmp_intel_type_2_topology_type(
+ proc_info[0].levels[j + 1].level_type);
+ __kmp_topology->set_equivalent_type(cache_type, type);
+ }
+ }
+ }
+ } else {
+ // If caches are non-uniform, then record which caches exist.
+ for (int i = 0; i < __kmp_topology->get_num_hw_threads(); ++i) {
+ for (size_t j = 0; j < cache_info[i].get_depth(); ++j) {
+ unsigned cache_level = cache_info[i][j].level;
+ kmp_hw_t cache_type =
+ cpuid_cache_info_t::get_topology_type(cache_level);
+ if (__kmp_topology->get_equivalent_type(cache_type) == KMP_HW_UNKNOWN)
+ __kmp_topology->set_equivalent_type(cache_type, cache_type);
+ }
+ }
+ }
+
+ // See if any cache level needs to be added manually through cache Ids
+ bool unresolved_cache_levels = false;
+ for (unsigned level = 1; level <= cpuid_cache_info_t::MAX_CACHE_LEVEL;
+ ++level) {
+ kmp_hw_t cache_type = cpuid_cache_info_t::get_topology_type(level);
+ // This also filters out caches which may not be in the topology
+ // since the equivalent type might be KMP_HW_UNKNOWN.
+ if (__kmp_topology->get_equivalent_type(cache_type) == cache_type) {
+ unresolved_cache_levels = true;
+ break;
+ }
+ }
+
+ // Insert unresolved cache layers into machine topology using cache Ids
+ if (unresolved_cache_levels) {
+ int num_hw_threads = __kmp_topology->get_num_hw_threads();
+ int *ids = (int *)__kmp_allocate(sizeof(int) * num_hw_threads);
+ for (unsigned l = 1; l <= cpuid_cache_info_t::MAX_CACHE_LEVEL; ++l) {
+ kmp_hw_t cache_type = cpuid_cache_info_t::get_topology_type(l);
+ if (__kmp_topology->get_equivalent_type(cache_type) != cache_type)
+ continue;
+ for (int i = 0; i < num_hw_threads; ++i) {
+ int original_idx = __kmp_topology->at(i).original_idx;
+ ids[i] = kmp_hw_thread_t::UNKNOWN_ID;
+ const cpuid_cache_info_t::info_t &info =
+ cache_info[original_idx].get_level(l);
+ // if cache level not in topology for this processor, then skip
+ if (info.level == 0)
+ continue;
+ ids[i] = info.mask & proc_info[original_idx].apic_id;
+ }
+ __kmp_topology->insert_layer(cache_type, ids);
+ }
+ }
+
if (!__kmp_topology->check_ids()) {
kmp_topology_t::deallocate(__kmp_topology);
__kmp_topology = nullptr;
*msg_id = kmp_i18n_str_x2ApicIDsNotUnique;
+ __kmp_free(proc_info);
return false;
}
+ __kmp_free(proc_info);
return true;
}
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
@@ -2716,14 +3091,16 @@ static int __kmp_affinity_cmp_ProcCpuInfo_phys_id(const void *a,
// Set the array sizes for the hierarchy layers
static void __kmp_dispatch_set_hierarchy_values() {
// Set the maximum number of L1's to number of cores
- // Set the maximum number of L2's to to either number of cores / 2 for
+ // Set the maximum number of L2's to either number of cores / 2 for
// Intel(R) Xeon Phi(TM) coprocessor formally codenamed Knights Landing
// Or the number of cores for Intel(R) Xeon(R) processors
// Set the maximum number of NUMA nodes and L3's to number of packages
__kmp_hier_max_units[kmp_hier_layer_e::LAYER_THREAD + 1] =
nPackages * nCoresPerPkg * __kmp_nThreadsPerCore;
__kmp_hier_max_units[kmp_hier_layer_e::LAYER_L1 + 1] = __kmp_ncores;
-#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS) && \
+#if KMP_ARCH_X86_64 && \
+ (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_WINDOWS) && \
KMP_MIC_SUPPORTED
if (__kmp_mic_type >= mic3)
__kmp_hier_max_units[kmp_hier_layer_e::LAYER_L2 + 1] = __kmp_ncores / 2;
@@ -2738,7 +3115,9 @@ static void __kmp_dispatch_set_hierarchy_values() {
__kmp_hier_threads_per[kmp_hier_layer_e::LAYER_THREAD + 1] = 1;
__kmp_hier_threads_per[kmp_hier_layer_e::LAYER_L1 + 1] =
__kmp_nThreadsPerCore;
-#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS) && \
+#if KMP_ARCH_X86_64 && \
+ (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_WINDOWS) && \
KMP_MIC_SUPPORTED
if (__kmp_mic_type >= mic3)
__kmp_hier_threads_per[kmp_hier_layer_e::LAYER_L2 + 1] =
@@ -2800,15 +3179,51 @@ static inline const char *__kmp_cpuinfo_get_envvar() {
return envvar;
}
+static bool __kmp_package_id_from_core_siblings_list(unsigned **threadInfo,
+ unsigned num_avail,
+ unsigned idx) {
+ if (!KMP_AFFINITY_CAPABLE())
+ return false;
+
+ char path[256];
+ KMP_SNPRINTF(path, sizeof(path),
+ "/sys/devices/system/cpu/cpu%u/topology/core_siblings_list",
+ threadInfo[idx][osIdIndex]);
+ kmp_affin_mask_t *siblings = __kmp_parse_cpu_list(path);
+ for (unsigned i = 0; i < num_avail; ++i) {
+ unsigned cpu_id = threadInfo[i][osIdIndex];
+ KMP_ASSERT(cpu_id < __kmp_affin_mask_size * CHAR_BIT);
+ if (!KMP_CPU_ISSET(cpu_id, siblings))
+ continue;
+ if (threadInfo[i][pkgIdIndex] == UINT_MAX) {
+ // Arbitrarily pick the first index we encounter, it only matters that
+ // the value is the same for all siblings.
+ threadInfo[i][pkgIdIndex] = idx;
+ } else if (threadInfo[i][pkgIdIndex] != idx) {
+ // Contradictory sibling lists.
+ KMP_CPU_FREE(siblings);
+ return false;
+ }
+ }
+ KMP_ASSERT(threadInfo[idx][pkgIdIndex] != UINT_MAX);
+ KMP_CPU_FREE(siblings);
+ return true;
+}
+
// Parse /proc/cpuinfo (or an alternate file in the same format) to obtain the
-// affinity map.
+// affinity map. On AIX, the map is obtained through system SRAD (Scheduler
+// Resource Allocation Domain).
static bool __kmp_affinity_create_cpuinfo_map(int *line,
kmp_i18n_id_t *const msg_id) {
+ *msg_id = kmp_i18n_null;
+
+#if KMP_OS_AIX
+ unsigned num_records = __kmp_xproc;
+#else
const char *filename = __kmp_cpuinfo_get_filename();
const char *envvar = __kmp_cpuinfo_get_envvar();
- *msg_id = kmp_i18n_null;
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
KMP_INFORM(AffParseFilename, "KMP_AFFINITY", filename);
}
@@ -2865,6 +3280,7 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
*msg_id = kmp_i18n_str_CantRewindCpuinfo;
return false;
}
+#endif // KMP_OS_AIX
// Allocate the array of records to store the proc info in. The dummy
// element at the end makes the logic in filling them out easier to code.
@@ -2894,8 +3310,96 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
INIT_PROC_INFO(threadInfo[i]);
}
+#if KMP_OS_AIX
+ int smt_threads;
+ lpar_info_format1_t cpuinfo;
+ unsigned num_avail = __kmp_xproc;
+
+ if (__kmp_affinity.flags.verbose)
+ KMP_INFORM(AffParseFilename, "KMP_AFFINITY", "system info for topology");
+
+ // Get the number of SMT threads per core.
+ smt_threads = syssmt(GET_NUMBER_SMT_SETS, 0, 0, NULL);
+
+ // Allocate a resource set containing available system resourses.
+ rsethandle_t sys_rset = rs_alloc(RS_SYSTEM);
+ if (sys_rset == NULL) {
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_UnknownTopology;
+ return false;
+ }
+ // Allocate a resource set for the SRAD info.
+ rsethandle_t srad = rs_alloc(RS_EMPTY);
+ if (srad == NULL) {
+ rs_free(sys_rset);
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_UnknownTopology;
+ return false;
+ }
+
+ // Get the SRAD system detail level.
+ int sradsdl = rs_getinfo(NULL, R_SRADSDL, 0);
+ if (sradsdl < 0) {
+ rs_free(sys_rset);
+ rs_free(srad);
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_UnknownTopology;
+ return false;
+ }
+ // Get the number of RADs at that SRAD SDL.
+ int num_rads = rs_numrads(sys_rset, sradsdl, 0);
+ if (num_rads < 0) {
+ rs_free(sys_rset);
+ rs_free(srad);
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_UnknownTopology;
+ return false;
+ }
+
+ // Get the maximum number of procs that may be contained in a resource set.
+ int max_procs = rs_getinfo(NULL, R_MAXPROCS, 0);
+ if (max_procs < 0) {
+ rs_free(sys_rset);
+ rs_free(srad);
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_UnknownTopology;
+ return false;
+ }
+
+ int cur_rad = 0;
+ int num_set = 0;
+ for (int srad_idx = 0; cur_rad < num_rads && srad_idx < VMI_MAXRADS;
+ ++srad_idx) {
+ // Check if the SRAD is available in the RSET.
+ if (rs_getrad(sys_rset, srad, sradsdl, srad_idx, 0) < 0)
+ continue;
+
+ for (int cpu = 0; cpu < max_procs; cpu++) {
+ // Set the info for the cpu if it is in the SRAD.
+ if (rs_op(RS_TESTRESOURCE, srad, NULL, R_PROCS, cpu)) {
+ threadInfo[cpu][osIdIndex] = cpu;
+ threadInfo[cpu][pkgIdIndex] = cur_rad;
+ threadInfo[cpu][coreIdIndex] = cpu / smt_threads;
+ ++num_set;
+ if (num_set >= num_avail) {
+ // Done if all available CPUs have been set.
+ break;
+ }
+ }
+ }
+ ++cur_rad;
+ }
+ rs_free(sys_rset);
+ rs_free(srad);
+
+ // The topology is already sorted.
+
+#else // !KMP_OS_AIX
unsigned num_avail = 0;
*line = 0;
+#if KMP_ARCH_S390X
+ bool reading_s390x_sys_info = true;
+#endif
while (!feof(f)) {
// Create an inner scoping level, so that all the goto targets at the end of
// the loop appear in an outer scoping level. This avoids warnings about
@@ -2931,7 +3435,31 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
}
(*line)++;
+#if KMP_ARCH_LOONGARCH64
+ // The parsing logic of /proc/cpuinfo in this function highly depends on
+ // the blank lines between each processor info block. But on LoongArch a
+ // blank line exists before the first processor info block (i.e. after the
+ // "system type" line). This blank line was added because the "system
+ // type" line is unrelated to any of the CPUs. We must skip this line so
+ // that the original logic works on LoongArch.
+ if (*buf == '\n' && *line == 2)
+ continue;
+#endif
+#if KMP_ARCH_S390X
+ // s390x /proc/cpuinfo starts with a variable number of lines containing
+ // the overall system information. Skip them.
+ if (reading_s390x_sys_info) {
+ if (*buf == '\n')
+ reading_s390x_sys_info = false;
+ continue;
+ }
+#endif
+
+#if KMP_ARCH_S390X
+ char s1[] = "cpu number";
+#else
char s1[] = "processor";
+#endif
if (strncmp(buf, s1, sizeof(s1) - 1) == 0) {
CHECK_LINE;
char *p = strchr(buf + sizeof(s1) - 1, ':');
@@ -2957,6 +3485,23 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
threadInfo[num_avail][osIdIndex]);
__kmp_read_from_file(path, "%u", &threadInfo[num_avail][pkgIdIndex]);
+#if KMP_ARCH_S390X
+ // Disambiguate physical_package_id.
+ unsigned book_id;
+ KMP_SNPRINTF(path, sizeof(path),
+ "/sys/devices/system/cpu/cpu%u/topology/book_id",
+ threadInfo[num_avail][osIdIndex]);
+ __kmp_read_from_file(path, "%u", &book_id);
+ threadInfo[num_avail][pkgIdIndex] |= (book_id << 8);
+
+ unsigned drawer_id;
+ KMP_SNPRINTF(path, sizeof(path),
+ "/sys/devices/system/cpu/cpu%u/topology/drawer_id",
+ threadInfo[num_avail][osIdIndex]);
+ __kmp_read_from_file(path, "%u", &drawer_id);
+ threadInfo[num_avail][pkgIdIndex] |= (drawer_id << 16);
+#endif
+
KMP_SNPRINTF(path, sizeof(path),
"/sys/devices/system/cpu/cpu%u/topology/core_id",
threadInfo[num_avail][osIdIndex]);
@@ -3040,21 +3585,17 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
return false;
}
- // Check for missing fields. The osId field must be there, and we
- // currently require that the physical id field is specified, also.
+ // Check for missing fields. The osId field must be there. The physical
+ // id field will be checked later.
if (threadInfo[num_avail][osIdIndex] == UINT_MAX) {
CLEANUP_THREAD_INFO;
*msg_id = kmp_i18n_str_MissingProcField;
return false;
}
- if (threadInfo[0][pkgIdIndex] == UINT_MAX) {
- CLEANUP_THREAD_INFO;
- *msg_id = kmp_i18n_str_MissingPhysicalIDField;
- return false;
- }
// Skip this proc if it is not included in the machine model.
- if (!KMP_CPU_ISSET(threadInfo[num_avail][osIdIndex],
+ if (KMP_AFFINITY_CAPABLE() &&
+ !KMP_CPU_ISSET(threadInfo[num_avail][osIdIndex],
__kmp_affin_fullMask)) {
INIT_PROC_INFO(threadInfo[num_avail]);
continue;
@@ -3080,6 +3621,18 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
}
*line = 0;
+ // At least on powerpc, Linux may return -1 for physical_package_id. Try
+ // to reconstruct topology from core_siblings_list in that case.
+ for (i = 0; i < num_avail; ++i) {
+ if (threadInfo[i][pkgIdIndex] == UINT_MAX) {
+ if (!__kmp_package_id_from_core_siblings_list(threadInfo, num_avail, i)) {
+ CLEANUP_THREAD_INFO;
+ *msg_id = kmp_i18n_str_MissingPhysicalIDField;
+ return false;
+ }
+ }
+ }
+
#if KMP_MIC && REDUCE_TEAM_SIZE
unsigned teamSize = 0;
#endif // KMP_MIC && REDUCE_TEAM_SIZE
@@ -3096,6 +3649,8 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
qsort(threadInfo, num_avail, sizeof(*threadInfo),
__kmp_affinity_cmp_ProcCpuInfo_phys_id);
+#endif // KMP_OS_AIX
+
// The table is now sorted by pkgId / coreId / threadId, but we really don't
// know the radix of any of the fields. pkgId's may be sparsely assigned among
// the chips on a system. Although coreId's are usually assigned
@@ -3210,7 +3765,7 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
return false;
}
- // If the thread ids were not specified and we see entries entries that
+ // If the thread ids were not specified and we see entries that
// are duplicates, start the loop over and assign the thread ids manually.
assign_thread_ids = true;
goto restart_radix_check;
@@ -3239,7 +3794,7 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
// not enabled.
__kmp_ncores = totals[coreIdIndex];
if (!KMP_AFFINITY_CAPABLE()) {
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
+ KMP_ASSERT(__kmp_affinity.type == affinity_none);
return true;
}
@@ -3301,10 +3856,10 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
for (i = 0; i < num_avail; ++i) {
unsigned os = threadInfo[i][osIdIndex];
int src_index;
- int dst_index = 0;
kmp_hw_thread_t &hw_thread = __kmp_topology->at(i);
hw_thread.clear();
hw_thread.os_id = os;
+ hw_thread.original_idx = i;
idx = 0;
for (src_index = maxIndex; src_index >= threadIdIndex; src_index--) {
@@ -3318,7 +3873,6 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
} else if (src_index == threadIdIndex) {
hw_thread.ids[threadLevel] = threadInfo[i][src_index];
}
- dst_index++;
}
}
@@ -3329,6 +3883,32 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
__kmp_free(counts);
CLEANUP_THREAD_INFO;
__kmp_topology->sort_ids();
+
+ int tlevel = __kmp_topology->get_level(KMP_HW_THREAD);
+ if (tlevel > 0) {
+ // If the thread level does not have ids, then put them in.
+ if (__kmp_topology->at(0).ids[tlevel] == kmp_hw_thread_t::UNKNOWN_ID) {
+ __kmp_topology->at(0).ids[tlevel] = 0;
+ }
+ for (int i = 1; i < __kmp_topology->get_num_hw_threads(); ++i) {
+ kmp_hw_thread_t &hw_thread = __kmp_topology->at(i);
+ if (hw_thread.ids[tlevel] != kmp_hw_thread_t::UNKNOWN_ID)
+ continue;
+ kmp_hw_thread_t &prev_hw_thread = __kmp_topology->at(i - 1);
+ // Check if socket, core, anything above thread level changed.
+ // If the ids did change, then restart thread id at 0
+ // Otherwise, set thread id to prev thread's id + 1
+ for (int j = 0; j < tlevel; ++j) {
+ if (hw_thread.ids[j] != prev_hw_thread.ids[j]) {
+ hw_thread.ids[tlevel] = 0;
+ break;
+ }
+ }
+ if (hw_thread.ids[tlevel] == kmp_hw_thread_t::UNKNOWN_ID)
+ hw_thread.ids[tlevel] = prev_hw_thread.ids[tlevel] + 1;
+ }
+ }
+
if (!__kmp_topology->check_ids()) {
kmp_topology_t::deallocate(__kmp_topology);
__kmp_topology = nullptr;
@@ -3341,16 +3921,25 @@ static bool __kmp_affinity_create_cpuinfo_map(int *line,
// Create and return a table of affinity masks, indexed by OS thread ID.
// This routine handles OR'ing together all the affinity masks of threads
// that are sufficiently close, if granularity > fine.
-static kmp_affin_mask_t *__kmp_create_masks(unsigned *maxIndex,
- unsigned *numUnique) {
+template
+static void __kmp_create_os_id_masks(unsigned *numUnique,
+ kmp_affinity_t &affinity,
+ FindNextFunctionType find_next) {
// First form a table of affinity masks in order of OS thread id.
int maxOsId;
int i;
int numAddrs = __kmp_topology->get_num_hw_threads();
int depth = __kmp_topology->get_depth();
+ const char *env_var = __kmp_get_affinity_env_var(affinity);
KMP_ASSERT(numAddrs);
KMP_ASSERT(depth);
+ i = find_next(-1);
+ // If could not find HW thread location that satisfies find_next conditions,
+ // then return and fallback to increment find_next.
+ if (i >= numAddrs)
+ return;
+
maxOsId = 0;
for (i = numAddrs - 1;; --i) {
int osId = __kmp_topology->at(i).os_id;
@@ -3360,14 +3949,14 @@ static kmp_affin_mask_t *__kmp_create_masks(unsigned *maxIndex,
if (i == 0)
break;
}
- kmp_affin_mask_t *osId2Mask;
- KMP_CPU_ALLOC_ARRAY(osId2Mask, (maxOsId + 1));
- KMP_ASSERT(__kmp_affinity_gran_levels >= 0);
- if (__kmp_affinity_verbose && (__kmp_affinity_gran_levels > 0)) {
- KMP_INFORM(ThreadsMigrate, "KMP_AFFINITY", __kmp_affinity_gran_levels);
+ affinity.num_os_id_masks = maxOsId + 1;
+ KMP_CPU_ALLOC_ARRAY(affinity.os_id_masks, affinity.num_os_id_masks);
+ KMP_ASSERT(affinity.gran_levels >= 0);
+ if (affinity.flags.verbose && (affinity.gran_levels > 0)) {
+ KMP_INFORM(ThreadsMigrate, env_var, affinity.gran_levels);
}
- if (__kmp_affinity_gran_levels >= (int)depth) {
- KMP_AFF_WARNING(AffThreadsMayMigrate);
+ if (affinity.gran_levels >= (int)depth) {
+ KMP_AFF_WARNING(affinity, AffThreadsMayMigrate);
}
// Run through the table, forming the masks for all threads on each core.
@@ -3380,22 +3969,25 @@ static kmp_affin_mask_t *__kmp_create_masks(unsigned *maxIndex,
kmp_affin_mask_t *sum;
KMP_CPU_ALLOC_ON_STACK(sum);
KMP_CPU_ZERO(sum);
- KMP_CPU_SET(__kmp_topology->at(0).os_id, sum);
- for (i = 1; i < numAddrs; i++) {
+
+ i = j = leader = find_next(-1);
+ KMP_CPU_SET(__kmp_topology->at(i).os_id, sum);
+ kmp_full_mask_modifier_t full_mask;
+ for (i = find_next(i); i < numAddrs; i = find_next(i)) {
// If this thread is sufficiently close to the leader (within the
// granularity setting), then set the bit for this os thread in the
// affinity mask for this group, and go on to the next thread.
- if (__kmp_topology->is_close(leader, i, __kmp_affinity_gran_levels)) {
+ if (__kmp_topology->is_close(leader, i, affinity)) {
KMP_CPU_SET(__kmp_topology->at(i).os_id, sum);
continue;
}
// For every thread in this group, copy the mask to the thread's entry in
- // the osId2Mask table. Mark the first address as a leader.
- for (; j < i; j++) {
+ // the OS Id mask table. Mark the first address as a leader.
+ for (; j < i; j = find_next(j)) {
int osId = __kmp_topology->at(j).os_id;
KMP_DEBUG_ASSERT(osId <= maxOsId);
- kmp_affin_mask_t *mask = KMP_CPU_INDEX(osId2Mask, osId);
+ kmp_affin_mask_t *mask = KMP_CPU_INDEX(affinity.os_id_masks, osId);
KMP_CPU_COPY(mask, sum);
__kmp_topology->at(j).leader = (j == leader);
}
@@ -3403,25 +3995,30 @@ static kmp_affin_mask_t *__kmp_create_masks(unsigned *maxIndex,
// Start a new mask.
leader = i;
+ full_mask.include(sum);
KMP_CPU_ZERO(sum);
KMP_CPU_SET(__kmp_topology->at(i).os_id, sum);
}
// For every thread in last group, copy the mask to the thread's
- // entry in the osId2Mask table.
- for (; j < i; j++) {
+ // entry in the OS Id mask table.
+ for (; j < i; j = find_next(j)) {
int osId = __kmp_topology->at(j).os_id;
KMP_DEBUG_ASSERT(osId <= maxOsId);
- kmp_affin_mask_t *mask = KMP_CPU_INDEX(osId2Mask, osId);
+ kmp_affin_mask_t *mask = KMP_CPU_INDEX(affinity.os_id_masks, osId);
KMP_CPU_COPY(mask, sum);
__kmp_topology->at(j).leader = (j == leader);
}
+ full_mask.include(sum);
unique++;
KMP_CPU_FREE_FROM_STACK(sum);
- *maxIndex = maxOsId;
+ // See if the OS Id mask table further restricts or changes the full mask
+ if (full_mask.restrict_to_mask() && affinity.flags.verbose) {
+ __kmp_topology->print(env_var);
+ }
+
*numUnique = unique;
- return osId2Mask;
}
// Stuff for the affinity proclist parsers. It's easier to declare these vars
@@ -3454,7 +4051,7 @@ static int nextNewMask;
{ \
if (((_osId) > _maxOsId) || \
(!KMP_CPU_ISSET((_osId), KMP_CPU_INDEX((_osId2Mask), (_osId))))) { \
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, _osId); \
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, _osId); \
} else { \
ADD_MASK(KMP_CPU_INDEX(_osId2Mask, (_osId))); \
} \
@@ -3462,12 +4059,13 @@ static int nextNewMask;
// Re-parse the proclist (for the explicit affinity type), and form the list
// of affinity newMasks indexed by gtid.
-static void __kmp_affinity_process_proclist(kmp_affin_mask_t **out_masks,
- unsigned int *out_numMasks,
- const char *proclist,
- kmp_affin_mask_t *osId2Mask,
- int maxOsId) {
+static void __kmp_affinity_process_proclist(kmp_affinity_t &affinity) {
int i;
+ kmp_affin_mask_t **out_masks = &affinity.masks;
+ unsigned *out_numMasks = &affinity.num_masks;
+ const char *proclist = affinity.proclist;
+ kmp_affin_mask_t *osId2Mask = affinity.os_id_masks;
+ int maxOsId = affinity.num_os_id_masks - 1;
const char *scan = proclist;
const char *next = proclist;
@@ -3505,7 +4103,7 @@ static void __kmp_affinity_process_proclist(kmp_affin_mask_t **out_masks,
// Copy the mask for that osId to the sum (union) mask.
if ((num > maxOsId) ||
(!KMP_CPU_ISSET(num, KMP_CPU_INDEX(osId2Mask, num)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, num);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, num);
KMP_CPU_ZERO(sumMask);
} else {
KMP_CPU_COPY(sumMask, KMP_CPU_INDEX(osId2Mask, num));
@@ -3537,7 +4135,7 @@ static void __kmp_affinity_process_proclist(kmp_affin_mask_t **out_masks,
// Add the mask for that osId to the sum mask.
if ((num > maxOsId) ||
(!KMP_CPU_ISSET(num, KMP_CPU_INDEX(osId2Mask, num)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, num);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, num);
} else {
KMP_CPU_UNION(sumMask, KMP_CPU_INDEX(osId2Mask, num));
setSize++;
@@ -3672,10 +4270,11 @@ signed := + signed
signed := - signed
-----------------------------------------------------------------------------*/
static void __kmp_process_subplace_list(const char **scan,
- kmp_affin_mask_t *osId2Mask,
- int maxOsId, kmp_affin_mask_t *tempMask,
+ kmp_affinity_t &affinity, int maxOsId,
+ kmp_affin_mask_t *tempMask,
int *setSize) {
const char *next;
+ kmp_affin_mask_t *osId2Mask = affinity.os_id_masks;
for (;;) {
int start, count, stride, i;
@@ -3694,7 +4293,7 @@ static void __kmp_process_subplace_list(const char **scan,
if (**scan == '}' || **scan == ',') {
if ((start > maxOsId) ||
(!KMP_CPU_ISSET(start, KMP_CPU_INDEX(osId2Mask, start)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, start);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, start);
} else {
KMP_CPU_UNION(tempMask, KMP_CPU_INDEX(osId2Mask, start));
(*setSize)++;
@@ -3723,7 +4322,7 @@ static void __kmp_process_subplace_list(const char **scan,
for (i = 0; i < count; i++) {
if ((start > maxOsId) ||
(!KMP_CPU_ISSET(start, KMP_CPU_INDEX(osId2Mask, start)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, start);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, start);
break; // don't proliferate warnings for large count
} else {
KMP_CPU_UNION(tempMask, KMP_CPU_INDEX(osId2Mask, start));
@@ -3770,7 +4369,7 @@ static void __kmp_process_subplace_list(const char **scan,
for (i = 0; i < count; i++) {
if ((start > maxOsId) ||
(!KMP_CPU_ISSET(start, KMP_CPU_INDEX(osId2Mask, start)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, start);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, start);
break; // don't proliferate warnings for large count
} else {
KMP_CPU_UNION(tempMask, KMP_CPU_INDEX(osId2Mask, start));
@@ -3789,21 +4388,22 @@ static void __kmp_process_subplace_list(const char **scan,
}
}
-static void __kmp_process_place(const char **scan, kmp_affin_mask_t *osId2Mask,
+static void __kmp_process_place(const char **scan, kmp_affinity_t &affinity,
int maxOsId, kmp_affin_mask_t *tempMask,
int *setSize) {
const char *next;
+ kmp_affin_mask_t *osId2Mask = affinity.os_id_masks;
// valid follow sets are '{' '!' and num
SKIP_WS(*scan);
if (**scan == '{') {
(*scan)++; // skip '{'
- __kmp_process_subplace_list(scan, osId2Mask, maxOsId, tempMask, setSize);
+ __kmp_process_subplace_list(scan, affinity, maxOsId, tempMask, setSize);
KMP_ASSERT2(**scan == '}', "bad explicit places list");
(*scan)++; // skip '}'
} else if (**scan == '!') {
(*scan)++; // skip '!'
- __kmp_process_place(scan, osId2Mask, maxOsId, tempMask, setSize);
+ __kmp_process_place(scan, affinity, maxOsId, tempMask, setSize);
KMP_CPU_COMPLEMENT(maxOsId, tempMask);
} else if ((**scan >= '0') && (**scan <= '9')) {
next = *scan;
@@ -3812,7 +4412,7 @@ static void __kmp_process_place(const char **scan, kmp_affin_mask_t *osId2Mask,
KMP_ASSERT(num >= 0);
if ((num > maxOsId) ||
(!KMP_CPU_ISSET(num, KMP_CPU_INDEX(osId2Mask, num)))) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, num);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, num);
} else {
KMP_CPU_UNION(tempMask, KMP_CPU_INDEX(osId2Mask, num));
(*setSize)++;
@@ -3824,12 +4424,13 @@ static void __kmp_process_place(const char **scan, kmp_affin_mask_t *osId2Mask,
}
// static void
-void __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
- unsigned int *out_numMasks,
- const char *placelist,
- kmp_affin_mask_t *osId2Mask,
- int maxOsId) {
+void __kmp_affinity_process_placelist(kmp_affinity_t &affinity) {
int i, j, count, stride, sign;
+ kmp_affin_mask_t **out_masks = &affinity.masks;
+ unsigned *out_numMasks = &affinity.num_masks;
+ const char *placelist = affinity.proclist;
+ kmp_affin_mask_t *osId2Mask = affinity.os_id_masks;
+ int maxOsId = affinity.num_os_id_masks - 1;
const char *scan = placelist;
const char *next = placelist;
@@ -3849,7 +4450,7 @@ void __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
int setSize = 0;
for (;;) {
- __kmp_process_place(&scan, osId2Mask, maxOsId, tempMask, &setSize);
+ __kmp_process_place(&scan, affinity, maxOsId, tempMask, &setSize);
// valid follow sets are ',' ':' and EOL
SKIP_WS(scan);
@@ -3930,7 +4531,7 @@ void __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
(!KMP_CPU_ISSET(j + stride,
KMP_CPU_INDEX(osId2Mask, j + stride)))) {
if (i < count - 1) {
- KMP_AFF_WARNING(AffIgnoreInvalidProcID, j + stride);
+ KMP_AFF_WARNING(affinity, AffIgnoreInvalidProcID, j + stride);
}
continue;
}
@@ -4028,28 +4629,149 @@ static int __kmp_affinity_max_proc_per_core(int nprocs, int bottom_level,
static int *procarr = NULL;
static int __kmp_aff_depth = 0;
+static int *__kmp_osid_to_hwthread_map = NULL;
+
+static void __kmp_affinity_get_mask_topology_info(const kmp_affin_mask_t *mask,
+ kmp_affinity_ids_t &ids,
+ kmp_affinity_attrs_t &attrs) {
+ if (!KMP_AFFINITY_CAPABLE())
+ return;
+
+ // Initiailze ids and attrs thread data
+ for (int i = 0; i < KMP_HW_LAST; ++i)
+ ids.ids[i] = kmp_hw_thread_t::UNKNOWN_ID;
+ attrs = KMP_AFFINITY_ATTRS_UNKNOWN;
+
+ // Iterate through each os id within the mask and determine
+ // the topology id and attribute information
+ int cpu;
+ int depth = __kmp_topology->get_depth();
+ KMP_CPU_SET_ITERATE(cpu, mask) {
+ int osid_idx = __kmp_osid_to_hwthread_map[cpu];
+ ids.os_id = cpu;
+ const kmp_hw_thread_t &hw_thread = __kmp_topology->at(osid_idx);
+ for (int level = 0; level < depth; ++level) {
+ kmp_hw_t type = __kmp_topology->get_type(level);
+ int id = hw_thread.sub_ids[level];
+ if (ids.ids[type] == kmp_hw_thread_t::UNKNOWN_ID || ids.ids[type] == id) {
+ ids.ids[type] = id;
+ } else {
+ // This mask spans across multiple topology units, set it as such
+ // and mark every level below as such as well.
+ ids.ids[type] = kmp_hw_thread_t::MULTIPLE_ID;
+ for (; level < depth; ++level) {
+ kmp_hw_t type = __kmp_topology->get_type(level);
+ ids.ids[type] = kmp_hw_thread_t::MULTIPLE_ID;
+ }
+ }
+ }
+ if (!attrs.valid) {
+ attrs.core_type = hw_thread.attrs.get_core_type();
+ attrs.core_eff = hw_thread.attrs.get_core_eff();
+ attrs.valid = 1;
+ } else {
+ // This mask spans across multiple attributes, set it as such
+ if (attrs.core_type != hw_thread.attrs.get_core_type())
+ attrs.core_type = KMP_HW_CORE_TYPE_UNKNOWN;
+ if (attrs.core_eff != hw_thread.attrs.get_core_eff())
+ attrs.core_eff = kmp_hw_attr_t::UNKNOWN_CORE_EFF;
+ }
+ }
+}
+
+static void __kmp_affinity_get_thread_topology_info(kmp_info_t *th) {
+ if (!KMP_AFFINITY_CAPABLE())
+ return;
+ const kmp_affin_mask_t *mask = th->th.th_affin_mask;
+ kmp_affinity_ids_t &ids = th->th.th_topology_ids;
+ kmp_affinity_attrs_t &attrs = th->th.th_topology_attrs;
+ __kmp_affinity_get_mask_topology_info(mask, ids, attrs);
+}
+
+// Assign the topology information to each place in the place list
+// A thread can then grab not only its affinity mask, but the topology
+// information associated with that mask. e.g., Which socket is a thread on
+static void __kmp_affinity_get_topology_info(kmp_affinity_t &affinity) {
+ if (!KMP_AFFINITY_CAPABLE())
+ return;
+ if (affinity.type != affinity_none) {
+ KMP_ASSERT(affinity.num_os_id_masks);
+ KMP_ASSERT(affinity.os_id_masks);
+ }
+ KMP_ASSERT(affinity.num_masks);
+ KMP_ASSERT(affinity.masks);
+ KMP_ASSERT(__kmp_affin_fullMask);
+
+ int max_cpu = __kmp_affin_fullMask->get_max_cpu();
+ int num_hw_threads = __kmp_topology->get_num_hw_threads();
+
+ // Allocate thread topology information
+ if (!affinity.ids) {
+ affinity.ids = (kmp_affinity_ids_t *)__kmp_allocate(
+ sizeof(kmp_affinity_ids_t) * affinity.num_masks);
+ }
+ if (!affinity.attrs) {
+ affinity.attrs = (kmp_affinity_attrs_t *)__kmp_allocate(
+ sizeof(kmp_affinity_attrs_t) * affinity.num_masks);
+ }
+ if (!__kmp_osid_to_hwthread_map) {
+ // Want the +1 because max_cpu should be valid index into map
+ __kmp_osid_to_hwthread_map =
+ (int *)__kmp_allocate(sizeof(int) * (max_cpu + 1));
+ }
+
+ // Create the OS proc to hardware thread map
+ for (int hw_thread = 0; hw_thread < num_hw_threads; ++hw_thread) {
+ int os_id = __kmp_topology->at(hw_thread).os_id;
+ if (KMP_CPU_ISSET(os_id, __kmp_affin_fullMask))
+ __kmp_osid_to_hwthread_map[os_id] = hw_thread;
+ }
+
+ for (unsigned i = 0; i < affinity.num_masks; ++i) {
+ kmp_affinity_ids_t &ids = affinity.ids[i];
+ kmp_affinity_attrs_t &attrs = affinity.attrs[i];
+ kmp_affin_mask_t *mask = KMP_CPU_INDEX(affinity.masks, i);
+ __kmp_affinity_get_mask_topology_info(mask, ids, attrs);
+ }
+}
+
+// Called when __kmp_topology is ready
+static void __kmp_aux_affinity_initialize_other_data(kmp_affinity_t &affinity) {
+ // Initialize other data structures which depend on the topology
+ if (__kmp_topology && __kmp_topology->get_num_hw_threads()) {
+ machine_hierarchy.init(__kmp_topology->get_num_hw_threads());
+ __kmp_affinity_get_topology_info(affinity);
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ __kmp_first_osid_with_ecore = __kmp_get_first_osid_with_ecore();
+#endif
+ }
+}
// Create a one element mask array (set of places) which only contains the
// initial process's affinity mask
-static void __kmp_create_affinity_none_places() {
+static void __kmp_create_affinity_none_places(kmp_affinity_t &affinity) {
KMP_ASSERT(__kmp_affin_fullMask != NULL);
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
- __kmp_affinity_num_masks = 1;
- KMP_CPU_ALLOC_ARRAY(__kmp_affinity_masks, __kmp_affinity_num_masks);
- kmp_affin_mask_t *dest = KMP_CPU_INDEX(__kmp_affinity_masks, 0);
+ KMP_ASSERT(affinity.type == affinity_none);
+ KMP_ASSERT(__kmp_avail_proc == __kmp_topology->get_num_hw_threads());
+ affinity.num_masks = 1;
+ KMP_CPU_ALLOC_ARRAY(affinity.masks, affinity.num_masks);
+ kmp_affin_mask_t *dest = KMP_CPU_INDEX(affinity.masks, 0);
KMP_CPU_COPY(dest, __kmp_affin_fullMask);
+ __kmp_aux_affinity_initialize_other_data(affinity);
}
-static void __kmp_aux_affinity_initialize(void) {
- if (__kmp_affinity_masks != NULL) {
- KMP_ASSERT(__kmp_affin_fullMask != NULL);
- return;
- }
-
+static void __kmp_aux_affinity_initialize_masks(kmp_affinity_t &affinity) {
// Create the "full" mask - this defines all of the processors that we
// consider to be in the machine model. If respect is set, then it is the
// initialization thread's affinity mask. Otherwise, it is all processors that
// we know about on the machine.
+ int verbose = affinity.flags.verbose;
+ const char *env_var = affinity.env_var;
+
+ // Already initialized
+ if (__kmp_affin_fullMask && __kmp_affin_origMask)
+ return;
+
if (__kmp_affin_fullMask == NULL) {
KMP_CPU_ALLOC(__kmp_affin_fullMask);
}
@@ -4060,7 +4782,7 @@ static void __kmp_aux_affinity_initialize(void) {
__kmp_get_system_affinity(__kmp_affin_fullMask, TRUE);
// Make a copy before possible expanding to the entire machine mask
__kmp_affin_origMask->copy(__kmp_affin_fullMask);
- if (__kmp_affinity_respect_mask) {
+ if (affinity.flags.respect) {
// Count the number of available processors.
unsigned i;
__kmp_avail_proc = 0;
@@ -4071,24 +4793,24 @@ static void __kmp_aux_affinity_initialize(void) {
__kmp_avail_proc++;
}
if (__kmp_avail_proc > __kmp_xproc) {
- KMP_AFF_WARNING(ErrorInitializeAffinity);
- __kmp_affinity_type = affinity_none;
+ KMP_AFF_WARNING(affinity, ErrorInitializeAffinity);
+ affinity.type = affinity_none;
KMP_AFFINITY_DISABLE();
return;
}
- if (__kmp_affinity_verbose) {
+ if (verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
__kmp_affin_fullMask);
- KMP_INFORM(InitOSProcSetRespect, "KMP_AFFINITY", buf);
+ KMP_INFORM(InitOSProcSetRespect, env_var, buf);
}
} else {
- if (__kmp_affinity_verbose) {
+ if (verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
__kmp_affin_fullMask);
- KMP_INFORM(InitOSProcSetNotRespect, "KMP_AFFINITY", buf);
+ KMP_INFORM(InitOSProcSetNotRespect, env_var, buf);
}
__kmp_avail_proc =
__kmp_affinity_entire_machine_mask(__kmp_affin_fullMask);
@@ -4103,8 +4825,13 @@ static void __kmp_aux_affinity_initialize(void) {
#endif
}
}
+}
+static bool __kmp_aux_affinity_initialize_topology(kmp_affinity_t &affinity) {
+ bool success = false;
+ const char *env_var = affinity.env_var;
kmp_i18n_id_t msg_id = kmp_i18n_null;
+ int verbose = affinity.flags.verbose;
// For backward compatibility, setting KMP_CPUINFO_FILE =>
// KMP_TOPOLOGY_METHOD=cpuinfo
@@ -4113,7 +4840,6 @@ static void __kmp_aux_affinity_initialize(void) {
__kmp_affinity_top_method = affinity_top_method_cpuinfo;
}
- bool success = false;
if (__kmp_affinity_top_method == affinity_top_method_all) {
// In the default code path, errors are not fatal - we just try using
// another method. We only emit a warning message if affinity is on, or the
@@ -4123,11 +4849,11 @@ static void __kmp_aux_affinity_initialize(void) {
__kmp_affinity_dispatch->get_api_type() == KMPAffinity::HWLOC) {
if (!__kmp_hwloc_error) {
success = __kmp_affinity_create_hwloc_map(&msg_id);
- if (!success && __kmp_affinity_verbose) {
- KMP_INFORM(AffIgnoringHwloc, "KMP_AFFINITY");
+ if (!success && verbose) {
+ KMP_INFORM(AffIgnoringHwloc, env_var);
}
- } else if (__kmp_affinity_verbose) {
- KMP_INFORM(AffIgnoringHwloc, "KMP_AFFINITY");
+ } else if (verbose) {
+ KMP_INFORM(AffIgnoringHwloc, env_var);
}
}
#endif
@@ -4135,24 +4861,24 @@ static void __kmp_aux_affinity_initialize(void) {
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
if (!success) {
success = __kmp_affinity_create_x2apicid_map(&msg_id);
- if (!success && __kmp_affinity_verbose && msg_id != kmp_i18n_null) {
- KMP_INFORM(AffInfoStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id));
+ if (!success && verbose && msg_id != kmp_i18n_null) {
+ KMP_INFORM(AffInfoStr, env_var, __kmp_i18n_catgets(msg_id));
}
}
if (!success) {
success = __kmp_affinity_create_apicid_map(&msg_id);
- if (!success && __kmp_affinity_verbose && msg_id != kmp_i18n_null) {
- KMP_INFORM(AffInfoStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id));
+ if (!success && verbose && msg_id != kmp_i18n_null) {
+ KMP_INFORM(AffInfoStr, env_var, __kmp_i18n_catgets(msg_id));
}
}
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
-#if KMP_OS_LINUX
+#if KMP_OS_LINUX || KMP_OS_AIX
if (!success) {
int line = 0;
success = __kmp_affinity_create_cpuinfo_map(&line, &msg_id);
- if (!success && __kmp_affinity_verbose && msg_id != kmp_i18n_null) {
- KMP_INFORM(AffInfoStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id));
+ if (!success && verbose && msg_id != kmp_i18n_null) {
+ KMP_INFORM(AffInfoStr, env_var, __kmp_i18n_catgets(msg_id));
}
}
#endif /* KMP_OS_LINUX */
@@ -4160,16 +4886,16 @@ static void __kmp_aux_affinity_initialize(void) {
#if KMP_GROUP_AFFINITY
if (!success && (__kmp_num_proc_groups > 1)) {
success = __kmp_affinity_create_proc_group_map(&msg_id);
- if (!success && __kmp_affinity_verbose && msg_id != kmp_i18n_null) {
- KMP_INFORM(AffInfoStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id));
+ if (!success && verbose && msg_id != kmp_i18n_null) {
+ KMP_INFORM(AffInfoStr, env_var, __kmp_i18n_catgets(msg_id));
}
}
#endif /* KMP_GROUP_AFFINITY */
if (!success) {
success = __kmp_affinity_create_flat_map(&msg_id);
- if (!success && __kmp_affinity_verbose && msg_id != kmp_i18n_null) {
- KMP_INFORM(AffInfoStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id));
+ if (!success && verbose && msg_id != kmp_i18n_null) {
+ KMP_INFORM(AffInfoStr, env_var, __kmp_i18n_catgets(msg_id));
}
KMP_ASSERT(success);
}
@@ -4241,130 +4967,187 @@ static void __kmp_aux_affinity_initialize(void) {
// Early exit if topology could not be created
if (!__kmp_topology) {
if (KMP_AFFINITY_CAPABLE()) {
- KMP_AFF_WARNING(ErrorInitializeAffinity);
+ KMP_AFF_WARNING(affinity, ErrorInitializeAffinity);
}
if (nPackages > 0 && nCoresPerPkg > 0 && __kmp_nThreadsPerCore > 0 &&
__kmp_ncores > 0) {
__kmp_topology = kmp_topology_t::allocate(0, 0, NULL);
__kmp_topology->canonicalize(nPackages, nCoresPerPkg,
__kmp_nThreadsPerCore, __kmp_ncores);
- if (__kmp_affinity_verbose) {
- __kmp_topology->print("KMP_AFFINITY");
+ if (verbose) {
+ __kmp_topology->print(env_var);
}
}
- __kmp_affinity_type = affinity_none;
- __kmp_create_affinity_none_places();
-#if KMP_USE_HIER_SCHED
- __kmp_dispatch_set_hierarchy_values();
-#endif
- KMP_AFFINITY_DISABLE();
- return;
+ return false;
}
- // Canonicalize, print (if requested), apply KMP_HW_SUBSET, and
- // initialize other data structures which depend on the topology
+ // Canonicalize, print (if requested), apply KMP_HW_SUBSET
__kmp_topology->canonicalize();
- if (__kmp_affinity_verbose)
- __kmp_topology->print("KMP_AFFINITY");
+ if (verbose)
+ __kmp_topology->print(env_var);
bool filtered = __kmp_topology->filter_hw_subset();
- if (filtered) {
-#if KMP_OS_WINDOWS
- // Copy filtered full mask if topology has single processor group
- if (__kmp_num_proc_groups <= 1)
-#endif
- __kmp_affin_origMask->copy(__kmp_affin_fullMask);
- }
- if (filtered && __kmp_affinity_verbose)
+ if (filtered && verbose)
__kmp_topology->print("KMP_HW_SUBSET");
- machine_hierarchy.init(__kmp_topology->get_num_hw_threads());
- KMP_ASSERT(__kmp_avail_proc == __kmp_topology->get_num_hw_threads());
+ return success;
+}
+
+static void __kmp_aux_affinity_initialize(kmp_affinity_t &affinity) {
+ bool is_regular_affinity = (&affinity == &__kmp_affinity);
+ bool is_hidden_helper_affinity = (&affinity == &__kmp_hh_affinity);
+ const char *env_var = __kmp_get_affinity_env_var(affinity);
+
+ if (affinity.flags.initialized) {
+ KMP_ASSERT(__kmp_affin_fullMask != NULL);
+ return;
+ }
+
+ if (is_regular_affinity && (!__kmp_affin_fullMask || !__kmp_affin_origMask))
+ __kmp_aux_affinity_initialize_masks(affinity);
+
+ if (is_regular_affinity && !__kmp_topology) {
+ bool success = __kmp_aux_affinity_initialize_topology(affinity);
+ if (success) {
+ KMP_ASSERT(__kmp_avail_proc == __kmp_topology->get_num_hw_threads());
+ } else {
+ affinity.type = affinity_none;
+ KMP_AFFINITY_DISABLE();
+ }
+ }
+
// If KMP_AFFINITY=none, then only create the single "none" place
// which is the process's initial affinity mask or the number of
// hardware threads depending on respect,norespect
- if (__kmp_affinity_type == affinity_none) {
- __kmp_create_affinity_none_places();
+ if (affinity.type == affinity_none) {
+ __kmp_create_affinity_none_places(affinity);
#if KMP_USE_HIER_SCHED
__kmp_dispatch_set_hierarchy_values();
#endif
+ affinity.flags.initialized = TRUE;
return;
}
+
+ __kmp_topology->set_granularity(affinity);
int depth = __kmp_topology->get_depth();
// Create the table of masks, indexed by thread Id.
- unsigned maxIndex;
- unsigned numUnique;
- kmp_affin_mask_t *osId2Mask = __kmp_create_masks(&maxIndex, &numUnique);
- if (__kmp_affinity_gran_levels == 0) {
- KMP_DEBUG_ASSERT((int)numUnique == __kmp_avail_proc);
- }
-
- switch (__kmp_affinity_type) {
+ unsigned numUnique = 0;
+ int numAddrs = __kmp_topology->get_num_hw_threads();
+ // If OMP_PLACES=cores: specified, then attempt
+ // to make OS Id mask table using those attributes
+ if (affinity.core_attr_gran.valid) {
+ __kmp_create_os_id_masks(&numUnique, affinity, [&](int idx) {
+ KMP_ASSERT(idx >= -1);
+ for (int i = idx + 1; i < numAddrs; ++i)
+ if (__kmp_topology->at(i).attrs.contains(affinity.core_attr_gran))
+ return i;
+ return numAddrs;
+ });
+ if (!affinity.os_id_masks) {
+ const char *core_attribute;
+ if (affinity.core_attr_gran.core_eff != kmp_hw_attr_t::UNKNOWN_CORE_EFF)
+ core_attribute = "core_efficiency";
+ else
+ core_attribute = "core_type";
+ KMP_AFF_WARNING(affinity, AffIgnoringNotAvailable, env_var,
+ core_attribute,
+ __kmp_hw_get_catalog_string(KMP_HW_CORE, /*plural=*/true))
+ }
+ }
+ // If core attributes did not work, or none were specified,
+ // then make OS Id mask table using typical incremental way with
+ // checking for validity of each id at granularity level specified.
+ if (!affinity.os_id_masks) {
+ int gran = affinity.gran_levels;
+ int gran_level = depth - 1 - affinity.gran_levels;
+ if (gran >= 0 && gran_level >= 0 && gran_level < depth) {
+ __kmp_create_os_id_masks(
+ &numUnique, affinity, [depth, numAddrs, &affinity](int idx) {
+ KMP_ASSERT(idx >= -1);
+ int gran = affinity.gran_levels;
+ int gran_level = depth - 1 - affinity.gran_levels;
+ for (int i = idx + 1; i < numAddrs; ++i)
+ if ((gran >= depth) ||
+ (gran < depth && __kmp_topology->at(i).ids[gran_level] !=
+ kmp_hw_thread_t::UNKNOWN_ID))
+ return i;
+ return numAddrs;
+ });
+ }
+ }
+ // Final attempt to make OS Id mask table using typical incremental way.
+ if (!affinity.os_id_masks) {
+ __kmp_create_os_id_masks(&numUnique, affinity, [](int idx) {
+ KMP_ASSERT(idx >= -1);
+ return idx + 1;
+ });
+ }
+
+ switch (affinity.type) {
case affinity_explicit:
- KMP_DEBUG_ASSERT(__kmp_affinity_proclist != NULL);
- if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_intel) {
- __kmp_affinity_process_proclist(
- &__kmp_affinity_masks, &__kmp_affinity_num_masks,
- __kmp_affinity_proclist, osId2Mask, maxIndex);
+ KMP_DEBUG_ASSERT(affinity.proclist != NULL);
+ if (is_hidden_helper_affinity ||
+ __kmp_nested_proc_bind.bind_types[0] == proc_bind_intel) {
+ __kmp_affinity_process_proclist(affinity);
} else {
- __kmp_affinity_process_placelist(
- &__kmp_affinity_masks, &__kmp_affinity_num_masks,
- __kmp_affinity_proclist, osId2Mask, maxIndex);
- }
- if (__kmp_affinity_num_masks == 0) {
- KMP_AFF_WARNING(AffNoValidProcID);
- __kmp_affinity_type = affinity_none;
- __kmp_create_affinity_none_places();
+ __kmp_affinity_process_placelist(affinity);
+ }
+ if (affinity.num_masks == 0) {
+ KMP_AFF_WARNING(affinity, AffNoValidProcID);
+ affinity.type = affinity_none;
+ __kmp_create_affinity_none_places(affinity);
+ affinity.flags.initialized = TRUE;
return;
}
break;
// The other affinity types rely on sorting the hardware threads according to
- // some permutation of the machine topology tree. Set __kmp_affinity_compact
- // and __kmp_affinity_offset appropriately, then jump to a common code
+ // some permutation of the machine topology tree. Set affinity.compact
+ // and affinity.offset appropriately, then jump to a common code
// fragment to do the sort and create the array of affinity masks.
case affinity_logical:
- __kmp_affinity_compact = 0;
- if (__kmp_affinity_offset) {
- __kmp_affinity_offset =
- __kmp_nThreadsPerCore * __kmp_affinity_offset % __kmp_avail_proc;
+ affinity.compact = 0;
+ if (affinity.offset) {
+ affinity.offset =
+ __kmp_nThreadsPerCore * affinity.offset % __kmp_avail_proc;
}
goto sortTopology;
case affinity_physical:
if (__kmp_nThreadsPerCore > 1) {
- __kmp_affinity_compact = 1;
- if (__kmp_affinity_compact >= depth) {
- __kmp_affinity_compact = 0;
+ affinity.compact = 1;
+ if (affinity.compact >= depth) {
+ affinity.compact = 0;
}
} else {
- __kmp_affinity_compact = 0;
+ affinity.compact = 0;
}
- if (__kmp_affinity_offset) {
- __kmp_affinity_offset =
- __kmp_nThreadsPerCore * __kmp_affinity_offset % __kmp_avail_proc;
+ if (affinity.offset) {
+ affinity.offset =
+ __kmp_nThreadsPerCore * affinity.offset % __kmp_avail_proc;
}
goto sortTopology;
case affinity_scatter:
- if (__kmp_affinity_compact >= depth) {
- __kmp_affinity_compact = 0;
+ if (affinity.compact >= depth) {
+ affinity.compact = 0;
} else {
- __kmp_affinity_compact = depth - 1 - __kmp_affinity_compact;
+ affinity.compact = depth - 1 - affinity.compact;
}
goto sortTopology;
case affinity_compact:
- if (__kmp_affinity_compact >= depth) {
- __kmp_affinity_compact = depth - 1;
+ if (affinity.compact >= depth) {
+ affinity.compact = depth - 1;
}
goto sortTopology;
case affinity_balanced:
- if (depth <= 1) {
- KMP_AFF_WARNING(AffBalancedNotAvail, "KMP_AFFINITY");
- __kmp_affinity_type = affinity_none;
- __kmp_create_affinity_none_places();
+ if (depth <= 1 || is_hidden_helper_affinity) {
+ KMP_AFF_WARNING(affinity, AffBalancedNotAvail, env_var);
+ affinity.type = affinity_none;
+ __kmp_create_affinity_none_places(affinity);
+ affinity.flags.initialized = TRUE;
return;
} else if (!__kmp_topology->is_uniform()) {
// Save the depth for further usage
@@ -4379,8 +5162,10 @@ static void __kmp_aux_affinity_initialize(void) {
int nproc = ncores * maxprocpercore;
if ((nproc < 2) || (nproc < __kmp_avail_proc)) {
- KMP_AFF_WARNING(AffBalancedNotAvail, "KMP_AFFINITY");
- __kmp_affinity_type = affinity_none;
+ KMP_AFF_WARNING(affinity, AffBalancedNotAvail, env_var);
+ affinity.type = affinity_none;
+ __kmp_create_affinity_none_places(affinity);
+ affinity.flags.initialized = TRUE;
return;
}
@@ -4405,48 +5190,57 @@ static void __kmp_aux_affinity_initialize(void) {
procarr[core * maxprocpercore + inlastcore] = proc;
}
}
- if (__kmp_affinity_compact >= depth) {
- __kmp_affinity_compact = depth - 1;
+ if (affinity.compact >= depth) {
+ affinity.compact = depth - 1;
}
sortTopology:
// Allocate the gtid->affinity mask table.
- if (__kmp_affinity_dups) {
- __kmp_affinity_num_masks = __kmp_avail_proc;
+ if (affinity.flags.dups) {
+ affinity.num_masks = __kmp_avail_proc;
} else {
- __kmp_affinity_num_masks = numUnique;
+ affinity.num_masks = numUnique;
}
if ((__kmp_nested_proc_bind.bind_types[0] != proc_bind_intel) &&
(__kmp_affinity_num_places > 0) &&
- ((unsigned)__kmp_affinity_num_places < __kmp_affinity_num_masks)) {
- __kmp_affinity_num_masks = __kmp_affinity_num_places;
+ ((unsigned)__kmp_affinity_num_places < affinity.num_masks) &&
+ !is_hidden_helper_affinity) {
+ affinity.num_masks = __kmp_affinity_num_places;
}
- KMP_CPU_ALLOC_ARRAY(__kmp_affinity_masks, __kmp_affinity_num_masks);
+ KMP_CPU_ALLOC_ARRAY(affinity.masks, affinity.num_masks);
// Sort the topology table according to the current setting of
- // __kmp_affinity_compact, then fill out __kmp_affinity_masks.
- __kmp_topology->sort_compact();
+ // affinity.compact, then fill out affinity.masks.
+ __kmp_topology->sort_compact(affinity);
{
int i;
unsigned j;
int num_hw_threads = __kmp_topology->get_num_hw_threads();
+ kmp_full_mask_modifier_t full_mask;
for (i = 0, j = 0; i < num_hw_threads; i++) {
- if ((!__kmp_affinity_dups) && (!__kmp_topology->at(i).leader)) {
+ if ((!affinity.flags.dups) && (!__kmp_topology->at(i).leader)) {
continue;
}
int osId = __kmp_topology->at(i).os_id;
- kmp_affin_mask_t *src = KMP_CPU_INDEX(osId2Mask, osId);
- kmp_affin_mask_t *dest = KMP_CPU_INDEX(__kmp_affinity_masks, j);
+ kmp_affin_mask_t *src = KMP_CPU_INDEX(affinity.os_id_masks, osId);
+ if (KMP_CPU_ISEMPTY(src))
+ continue;
+ kmp_affin_mask_t *dest = KMP_CPU_INDEX(affinity.masks, j);
KMP_ASSERT(KMP_CPU_ISSET(osId, src));
KMP_CPU_COPY(dest, src);
- if (++j >= __kmp_affinity_num_masks) {
+ full_mask.include(src);
+ if (++j >= affinity.num_masks) {
break;
}
}
- KMP_DEBUG_ASSERT(j == __kmp_affinity_num_masks);
+ KMP_DEBUG_ASSERT(j == affinity.num_masks);
+ // See if the places list further restricts or changes the full mask
+ if (full_mask.restrict_to_mask() && affinity.flags.verbose) {
+ __kmp_topology->print(env_var);
+ }
}
// Sort the topology back using ids
__kmp_topology->sort_ids();
@@ -4455,56 +5249,64 @@ static void __kmp_aux_affinity_initialize(void) {
default:
KMP_ASSERT2(0, "Unexpected affinity setting");
}
-
- KMP_CPU_FREE_ARRAY(osId2Mask, maxIndex + 1);
+ __kmp_aux_affinity_initialize_other_data(affinity);
+ affinity.flags.initialized = TRUE;
}
-void __kmp_affinity_initialize(void) {
+void __kmp_affinity_initialize(kmp_affinity_t &affinity) {
// Much of the code above was written assuming that if a machine was not
- // affinity capable, then __kmp_affinity_type == affinity_none. We now
- // explicitly represent this as __kmp_affinity_type == affinity_disabled.
- // There are too many checks for __kmp_affinity_type == affinity_none
- // in this code. Instead of trying to change them all, check if
- // __kmp_affinity_type == affinity_disabled, and if so, slam it with
- // affinity_none, call the real initialization routine, then restore
- // __kmp_affinity_type to affinity_disabled.
- int disabled = (__kmp_affinity_type == affinity_disabled);
- if (!KMP_AFFINITY_CAPABLE()) {
+ // affinity capable, then affinity type == affinity_none.
+ // We now explicitly represent this as affinity type == affinity_disabled.
+ // There are too many checks for affinity type == affinity_none in this code.
+ // Instead of trying to change them all, check if
+ // affinity type == affinity_disabled, and if so, slam it with affinity_none,
+ // call the real initialization routine, then restore affinity type to
+ // affinity_disabled.
+ int disabled = (affinity.type == affinity_disabled);
+ if (!KMP_AFFINITY_CAPABLE())
KMP_ASSERT(disabled);
- }
- if (disabled) {
- __kmp_affinity_type = affinity_none;
- }
- __kmp_aux_affinity_initialize();
- if (disabled) {
- __kmp_affinity_type = affinity_disabled;
- }
+ if (disabled)
+ affinity.type = affinity_none;
+ __kmp_aux_affinity_initialize(affinity);
+ if (disabled)
+ affinity.type = affinity_disabled;
}
void __kmp_affinity_uninitialize(void) {
- if (__kmp_affinity_masks != NULL) {
- KMP_CPU_FREE_ARRAY(__kmp_affinity_masks, __kmp_affinity_num_masks);
- __kmp_affinity_masks = NULL;
- }
- if (__kmp_affin_fullMask != NULL) {
- KMP_CPU_FREE(__kmp_affin_fullMask);
- __kmp_affin_fullMask = NULL;
+ for (kmp_affinity_t *affinity : __kmp_affinities) {
+ if (affinity->masks != NULL)
+ KMP_CPU_FREE_ARRAY(affinity->masks, affinity->num_masks);
+ if (affinity->os_id_masks != NULL)
+ KMP_CPU_FREE_ARRAY(affinity->os_id_masks, affinity->num_os_id_masks);
+ if (affinity->proclist != NULL)
+ __kmp_free(affinity->proclist);
+ if (affinity->ids != NULL)
+ __kmp_free(affinity->ids);
+ if (affinity->attrs != NULL)
+ __kmp_free(affinity->attrs);
+ *affinity = KMP_AFFINITY_INIT(affinity->env_var);
}
if (__kmp_affin_origMask != NULL) {
+ if (KMP_AFFINITY_CAPABLE()) {
+#if KMP_OS_AIX
+ // Uninitialize by unbinding the thread.
+ bindprocessor(BINDTHREAD, thread_self(), PROCESSOR_CLASS_ANY);
+#else
+ __kmp_set_system_affinity(__kmp_affin_origMask, FALSE);
+#endif
+ }
KMP_CPU_FREE(__kmp_affin_origMask);
__kmp_affin_origMask = NULL;
}
- __kmp_affinity_num_masks = 0;
- __kmp_affinity_type = affinity_default;
__kmp_affinity_num_places = 0;
- if (__kmp_affinity_proclist != NULL) {
- __kmp_free(__kmp_affinity_proclist);
- __kmp_affinity_proclist = NULL;
- }
if (procarr != NULL) {
__kmp_free(procarr);
procarr = NULL;
}
+ if (__kmp_osid_to_hwthread_map) {
+ __kmp_free(__kmp_osid_to_hwthread_map);
+ __kmp_osid_to_hwthread_map = NULL;
+ }
#if KMP_USE_HWLOC
if (__kmp_hwloc_topology != NULL) {
hwloc_topology_destroy(__kmp_hwloc_topology);
@@ -4522,12 +5324,36 @@ void __kmp_affinity_uninitialize(void) {
KMPAffinity::destroy_api();
}
+static void __kmp_select_mask_by_gtid(int gtid, const kmp_affinity_t *affinity,
+ int *place, kmp_affin_mask_t **mask) {
+ int mask_idx;
+ bool is_hidden_helper = KMP_HIDDEN_HELPER_THREAD(gtid);
+ if (is_hidden_helper)
+ // The first gtid is the regular primary thread, the second gtid is the main
+ // thread of hidden team which does not participate in task execution.
+ mask_idx = gtid - 2;
+ else
+ mask_idx = __kmp_adjust_gtid_for_hidden_helpers(gtid);
+ KMP_DEBUG_ASSERT(affinity->num_masks > 0);
+ *place = (mask_idx + affinity->offset) % affinity->num_masks;
+ *mask = KMP_CPU_INDEX(affinity->masks, *place);
+}
+
+// This function initializes the per-thread data concerning affinity including
+// the mask and topology information
void __kmp_affinity_set_init_mask(int gtid, int isa_root) {
+
+ kmp_info_t *th = (kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[gtid]);
+
+ // Set the thread topology information to default of unknown
+ for (int id = 0; id < KMP_HW_LAST; ++id)
+ th->th.th_topology_ids.ids[id] = kmp_hw_thread_t::UNKNOWN_ID;
+ th->th.th_topology_attrs = KMP_AFFINITY_ATTRS_UNKNOWN;
+
if (!KMP_AFFINITY_CAPABLE()) {
return;
}
- kmp_info_t *th = (kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[gtid]);
if (th->th.th_affin_mask == NULL) {
KMP_CPU_ALLOC(th->th.th_affin_mask);
} else {
@@ -4535,16 +5361,24 @@ void __kmp_affinity_set_init_mask(int gtid, int isa_root) {
}
// Copy the thread mask to the kmp_info_t structure. If
- // __kmp_affinity_type == affinity_none, copy the "full" mask, i.e. one that
- // has all of the OS proc ids set, or if __kmp_affinity_respect_mask is set,
- // then the full mask is the same as the mask of the initialization thread.
+ // __kmp_affinity.type == affinity_none, copy the "full" mask, i.e.
+ // one that has all of the OS proc ids set, or if
+ // __kmp_affinity.flags.respect is set, then the full mask is the
+ // same as the mask of the initialization thread.
kmp_affin_mask_t *mask;
int i;
+ const kmp_affinity_t *affinity;
+ bool is_hidden_helper = KMP_HIDDEN_HELPER_THREAD(gtid);
- if (KMP_AFFINITY_NON_PROC_BIND) {
- if ((__kmp_affinity_type == affinity_none) ||
- (__kmp_affinity_type == affinity_balanced) ||
- KMP_HIDDEN_HELPER_THREAD(gtid)) {
+ if (is_hidden_helper)
+ affinity = &__kmp_hh_affinity;
+ else
+ affinity = &__kmp_affinity;
+
+ if (KMP_AFFINITY_NON_PROC_BIND || is_hidden_helper) {
+ if ((affinity->type == affinity_none) ||
+ (affinity->type == affinity_balanced) ||
+ KMP_HIDDEN_HELPER_MAIN_THREAD(gtid)) {
#if KMP_GROUP_AFFINITY
if (__kmp_num_proc_groups > 1) {
return;
@@ -4554,14 +5388,10 @@ void __kmp_affinity_set_init_mask(int gtid, int isa_root) {
i = 0;
mask = __kmp_affin_fullMask;
} else {
- int mask_idx = __kmp_adjust_gtid_for_hidden_helpers(gtid);
- KMP_DEBUG_ASSERT(__kmp_affinity_num_masks > 0);
- i = (mask_idx + __kmp_affinity_offset) % __kmp_affinity_num_masks;
- mask = KMP_CPU_INDEX(__kmp_affinity_masks, i);
+ __kmp_select_mask_by_gtid(gtid, affinity, &i, &mask);
}
} else {
- if ((!isa_root) || KMP_HIDDEN_HELPER_THREAD(gtid) ||
- (__kmp_nested_proc_bind.bind_types[0] == proc_bind_false)) {
+ if (!isa_root || __kmp_nested_proc_bind.bind_types[0] == proc_bind_false) {
#if KMP_GROUP_AFFINITY
if (__kmp_num_proc_groups > 1) {
return;
@@ -4571,85 +5401,94 @@ void __kmp_affinity_set_init_mask(int gtid, int isa_root) {
i = KMP_PLACE_ALL;
mask = __kmp_affin_fullMask;
} else {
- // int i = some hash function or just a counter that doesn't
- // always start at 0. Use adjusted gtid for now.
- int mask_idx = __kmp_adjust_gtid_for_hidden_helpers(gtid);
- KMP_DEBUG_ASSERT(__kmp_affinity_num_masks > 0);
- i = (mask_idx + __kmp_affinity_offset) % __kmp_affinity_num_masks;
- mask = KMP_CPU_INDEX(__kmp_affinity_masks, i);
+ __kmp_select_mask_by_gtid(gtid, affinity, &i, &mask);
}
}
th->th.th_current_place = i;
- if (isa_root || KMP_HIDDEN_HELPER_THREAD(gtid)) {
+ if (isa_root && !is_hidden_helper) {
th->th.th_new_place = i;
th->th.th_first_place = 0;
- th->th.th_last_place = __kmp_affinity_num_masks - 1;
+ th->th.th_last_place = affinity->num_masks - 1;
} else if (KMP_AFFINITY_NON_PROC_BIND) {
// When using a Non-OMP_PROC_BIND affinity method,
// set all threads' place-partition-var to the entire place list
th->th.th_first_place = 0;
- th->th.th_last_place = __kmp_affinity_num_masks - 1;
+ th->th.th_last_place = affinity->num_masks - 1;
+ }
+ // Copy topology information associated with the place
+ if (i >= 0) {
+ th->th.th_topology_ids = __kmp_affinity.ids[i];
+ th->th.th_topology_attrs = __kmp_affinity.attrs[i];
}
if (i == KMP_PLACE_ALL) {
- KA_TRACE(100, ("__kmp_affinity_set_init_mask: binding T#%d to all places\n",
+ KA_TRACE(100, ("__kmp_affinity_set_init_mask: setting T#%d to all places\n",
gtid));
} else {
- KA_TRACE(100, ("__kmp_affinity_set_init_mask: binding T#%d to place %d\n",
+ KA_TRACE(100, ("__kmp_affinity_set_init_mask: setting T#%d to place %d\n",
gtid, i));
}
KMP_CPU_COPY(th->th.th_affin_mask, mask);
+}
- if (__kmp_affinity_verbose && !KMP_HIDDEN_HELPER_THREAD(gtid)
- /* to avoid duplicate printing (will be correctly printed on barrier) */
- && (__kmp_affinity_type == affinity_none ||
- (i != KMP_PLACE_ALL && __kmp_affinity_type != affinity_balanced))) {
- char buf[KMP_AFFIN_MASK_PRINT_LEN];
- __kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
- th->th.th_affin_mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(),
- __kmp_gettid(), gtid, buf);
+void __kmp_affinity_bind_init_mask(int gtid) {
+ if (!KMP_AFFINITY_CAPABLE()) {
+ return;
}
+ kmp_info_t *th = (kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[gtid]);
+ const kmp_affinity_t *affinity;
+ const char *env_var;
+ bool is_hidden_helper = KMP_HIDDEN_HELPER_THREAD(gtid);
-#if KMP_DEBUG
- // Hidden helper thread affinity only printed for debug builds
- if (__kmp_affinity_verbose && KMP_HIDDEN_HELPER_THREAD(gtid)) {
+ if (is_hidden_helper)
+ affinity = &__kmp_hh_affinity;
+ else
+ affinity = &__kmp_affinity;
+ env_var = __kmp_get_affinity_env_var(*affinity, /*for_binding=*/true);
+ /* to avoid duplicate printing (will be correctly printed on barrier) */
+ if (affinity->flags.verbose && (affinity->type == affinity_none ||
+ (th->th.th_current_place != KMP_PLACE_ALL &&
+ affinity->type != affinity_balanced)) &&
+ !KMP_HIDDEN_HELPER_MAIN_THREAD(gtid)) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
th->th.th_affin_mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY (hidden helper thread)",
- (kmp_int32)getpid(), __kmp_gettid(), gtid, buf);
+ KMP_INFORM(BoundToOSProcSet, env_var, (kmp_int32)getpid(), __kmp_gettid(),
+ gtid, buf);
}
-#endif
#if KMP_OS_WINDOWS
// On Windows* OS, the process affinity mask might have changed. If the user
// didn't request affinity and this call fails, just continue silently.
// See CQ171393.
- if (__kmp_affinity_type == affinity_none) {
+ if (affinity->type == affinity_none) {
__kmp_set_system_affinity(th->th.th_affin_mask, FALSE);
} else
#endif
+#ifndef KMP_OS_AIX
+ // Do not set the full mask as the init mask on AIX.
__kmp_set_system_affinity(th->th.th_affin_mask, TRUE);
+#endif
}
-void __kmp_affinity_set_place(int gtid) {
- if (!KMP_AFFINITY_CAPABLE()) {
+void __kmp_affinity_bind_place(int gtid) {
+ // Hidden helper threads should not be affected by OMP_PLACES/OMP_PROC_BIND
+ if (!KMP_AFFINITY_CAPABLE() || KMP_HIDDEN_HELPER_THREAD(gtid)) {
return;
}
kmp_info_t *th = (kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[gtid]);
- KA_TRACE(100, ("__kmp_affinity_set_place: binding T#%d to place %d (current "
+ KA_TRACE(100, ("__kmp_affinity_bind_place: binding T#%d to place %d (current "
"place = %d)\n",
gtid, th->th.th_new_place, th->th.th_current_place));
// Check that the new place is within this thread's partition.
KMP_DEBUG_ASSERT(th->th.th_affin_mask != NULL);
KMP_ASSERT(th->th.th_new_place >= 0);
- KMP_ASSERT((unsigned)th->th.th_new_place <= __kmp_affinity_num_masks);
+ KMP_ASSERT((unsigned)th->th.th_new_place <= __kmp_affinity.num_masks);
if (th->th.th_first_place <= th->th.th_last_place) {
KMP_ASSERT((th->th.th_new_place >= th->th.th_first_place) &&
(th->th.th_new_place <= th->th.th_last_place));
@@ -4661,11 +5500,11 @@ void __kmp_affinity_set_place(int gtid) {
// Copy the thread mask to the kmp_info_t structure,
// and set this thread's affinity.
kmp_affin_mask_t *mask =
- KMP_CPU_INDEX(__kmp_affinity_masks, th->th.th_new_place);
+ KMP_CPU_INDEX(__kmp_affinity.masks, th->th.th_new_place);
KMP_CPU_COPY(th->th.th_affin_mask, mask);
th->th.th_current_place = th->th.th_new_place;
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
th->th.th_affin_mask);
@@ -4733,7 +5572,7 @@ int __kmp_aux_set_affinity(void **mask) {
th->th.th_current_place = KMP_PLACE_UNDEFINED;
th->th.th_new_place = KMP_PLACE_UNDEFINED;
th->th.th_first_place = 0;
- th->th.th_last_place = __kmp_affinity_num_masks - 1;
+ th->th.th_last_place = __kmp_affinity.num_masks - 1;
// Turn off 4.0 affinity for the current tread at this parallel level.
th->th.th_current_task->td_icvs.proc_bind = proc_bind_false;
@@ -4744,7 +5583,7 @@ int __kmp_aux_set_affinity(void **mask) {
int __kmp_aux_get_affinity(void **mask) {
int gtid;
int retval;
-#if KMP_OS_WINDOWS || KMP_DEBUG
+#if KMP_OS_WINDOWS || KMP_OS_AIX || KMP_DEBUG
kmp_info_t *th;
#endif
if (!KMP_AFFINITY_CAPABLE()) {
@@ -4752,7 +5591,7 @@ int __kmp_aux_get_affinity(void **mask) {
}
gtid = __kmp_entry_gtid();
-#if KMP_OS_WINDOWS || KMP_DEBUG
+#if KMP_OS_WINDOWS || KMP_OS_AIX || KMP_DEBUG
th = __kmp_threads[gtid];
#else
(void)gtid; // unused variable
@@ -4775,7 +5614,7 @@ int __kmp_aux_get_affinity(void **mask) {
}
}
-#if !KMP_OS_WINDOWS
+#if !KMP_OS_WINDOWS && !KMP_OS_AIX
retval = __kmp_get_system_affinity((kmp_affin_mask_t *)(*mask), FALSE);
KA_TRACE(
@@ -4795,7 +5634,7 @@ int __kmp_aux_get_affinity(void **mask) {
KMP_CPU_COPY((kmp_affin_mask_t *)(*mask), th->th.th_affin_mask);
return 0;
-#endif /* KMP_OS_WINDOWS */
+#endif /* !KMP_OS_WINDOWS && !KMP_OS_AIX */
}
int __kmp_aux_get_affinity_max_proc() {
@@ -4908,17 +5747,40 @@ int __kmp_aux_get_affinity_mask_proc(int proc, void **mask) {
return KMP_CPU_ISSET(proc, (kmp_affin_mask_t *)(*mask));
}
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+// Returns first os proc id with ATOM core
+int __kmp_get_first_osid_with_ecore(void) {
+ int low = 0;
+ int high = __kmp_topology->get_num_hw_threads() - 1;
+ int mid = 0;
+ while (high - low > 1) {
+ mid = (high + low) / 2;
+ if (__kmp_topology->at(mid).attrs.get_core_type() ==
+ KMP_HW_CORE_TYPE_CORE) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ if (__kmp_topology->at(mid).attrs.get_core_type() == KMP_HW_CORE_TYPE_ATOM) {
+ return mid;
+ }
+ return -1;
+}
+#endif
+
// Dynamic affinity settings - Affinity balanced
void __kmp_balanced_affinity(kmp_info_t *th, int nthreads) {
KMP_DEBUG_ASSERT(th);
bool fine_gran = true;
int tid = th->th.th_info.ds.ds_tid;
+ const char *env_var = "KMP_AFFINITY";
// Do not perform balanced affinity for the hidden helper threads
if (KMP_HIDDEN_HELPER_THREAD(__kmp_gtid_from_thread(th)))
return;
- switch (__kmp_affinity_gran) {
+ switch (__kmp_affinity.gran) {
case KMP_HW_THREAD:
break;
case KMP_HW_CORE:
@@ -4976,12 +5838,13 @@ void __kmp_balanced_affinity(kmp_info_t *th, int nthreads) {
KMP_CPU_SET(osID, mask);
}
}
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN, mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(),
- __kmp_gettid(), tid, buf);
+ KMP_INFORM(BoundToOSProcSet, env_var, (kmp_int32)getpid(), __kmp_gettid(),
+ tid, buf);
}
+ __kmp_affinity_get_thread_topology_info(th);
__kmp_set_system_affinity(mask, TRUE);
} else { // Non-uniform topology
@@ -5142,17 +6005,19 @@ void __kmp_balanced_affinity(kmp_info_t *th, int nthreads) {
__kmp_free(newarr);
}
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity.flags.verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN, mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(),
- __kmp_gettid(), tid, buf);
+ KMP_INFORM(BoundToOSProcSet, env_var, (kmp_int32)getpid(), __kmp_gettid(),
+ tid, buf);
}
+ __kmp_affinity_get_thread_topology_info(th);
__kmp_set_system_affinity(mask, TRUE);
}
}
-#if KMP_OS_LINUX || KMP_OS_FREEBSD
+#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_AIX
// We don't need this entry for Windows because
// there is GetProcessAffinityMask() api
//
@@ -5187,7 +6052,11 @@ extern "C"
"set full mask for thread %d\n",
gtid));
KMP_DEBUG_ASSERT(__kmp_affin_fullMask != NULL);
+#if KMP_OS_AIX
+ return bindprocessor(BINDTHREAD, thread_self(), PROCESSOR_CLASS_ANY);
+#else
return __kmp_set_system_affinity(__kmp_affin_fullMask, FALSE);
+#endif
}
#endif
diff --git a/contrib/libs/cxxsupp/openmp/kmp_affinity.h b/contrib/libs/cxxsupp/openmp/kmp_affinity.h
index ce00362f04ca..9ab2c0cc70d8 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_affinity.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_affinity.h
@@ -29,11 +29,14 @@ class KMPHwlocAffinity : public KMPAffinity {
mask = hwloc_bitmap_alloc();
this->zero();
}
+ Mask(const Mask &other) = delete;
+ Mask &operator=(const Mask &other) = delete;
~Mask() { hwloc_bitmap_free(mask); }
void set(int i) override { hwloc_bitmap_set(mask, i); }
bool is_set(int i) const override { return hwloc_bitmap_isset(mask, i); }
void clear(int i) override { hwloc_bitmap_clr(mask, i); }
void zero() override { hwloc_bitmap_zero(mask); }
+ bool empty() const override { return hwloc_bitmap_iszero(mask); }
void copy(const KMPAffinity::Mask *src) override {
const Mask *convert = static_cast(src);
hwloc_bitmap_copy(mask, convert->mask);
@@ -47,6 +50,10 @@ class KMPHwlocAffinity : public KMPAffinity {
hwloc_bitmap_or(mask, mask, convert->mask);
}
void bitwise_not() override { hwloc_bitmap_not(mask, mask); }
+ bool is_equal(const KMPAffinity::Mask *rhs) const override {
+ const Mask *convert = static_cast(rhs);
+ return hwloc_bitmap_isequal(mask, convert->mask);
+ }
int begin() const override { return hwloc_bitmap_first(mask); }
int end() const override { return -1; }
int next(int previous) const override {
@@ -62,7 +69,8 @@ class KMPHwlocAffinity : public KMPAffinity {
}
int error = errno;
if (abort_on_error) {
- __kmp_fatal(KMP_MSG(FatalSysError), KMP_ERR(error), __kmp_msg_null);
+ __kmp_fatal(KMP_MSG(FunctionError, "hwloc_get_cpubind()"),
+ KMP_ERR(error), __kmp_msg_null);
}
return error;
}
@@ -76,7 +84,8 @@ class KMPHwlocAffinity : public KMPAffinity {
}
int error = errno;
if (abort_on_error) {
- __kmp_fatal(KMP_MSG(FatalSysError), KMP_ERR(error), __kmp_msg_null);
+ __kmp_fatal(KMP_MSG(FunctionError, "hwloc_set_cpubind()"),
+ KMP_ERR(error), __kmp_msg_null);
}
return error;
}
@@ -95,7 +104,8 @@ class KMPHwlocAffinity : public KMPAffinity {
return 0;
error = errno;
if (abort_on_error)
- __kmp_fatal(KMP_MSG(FatalSysError), KMP_ERR(error), __kmp_msg_null);
+ __kmp_fatal(KMP_MSG(FunctionError, "hwloc_set_cpubind()"),
+ KMP_ERR(error), __kmp_msg_null);
}
return error;
}
@@ -128,13 +138,15 @@ class KMPHwlocAffinity : public KMPAffinity {
if (__kmp_hwloc_topology == NULL) {
if (hwloc_topology_init(&__kmp_hwloc_topology) < 0) {
__kmp_hwloc_error = TRUE;
- if (__kmp_affinity_verbose)
+ if (__kmp_affinity.flags.verbose) {
KMP_WARNING(AffHwlocErrorOccurred, var, "hwloc_topology_init()");
+ }
}
if (hwloc_topology_load(__kmp_hwloc_topology) < 0) {
__kmp_hwloc_error = TRUE;
- if (__kmp_affinity_verbose)
+ if (__kmp_affinity.flags.verbose) {
KMP_WARNING(AffHwlocErrorOccurred, var, "hwloc_topology_load()");
+ }
}
}
topology_support = hwloc_topology_get_support(__kmp_hwloc_topology);
@@ -181,7 +193,8 @@ class KMPHwlocAffinity : public KMPAffinity {
};
#endif /* KMP_USE_HWLOC */
-#if KMP_OS_LINUX || KMP_OS_FREEBSD
+#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_AIX
#if KMP_OS_LINUX
/* On some of the older OS's that we build on, these constants aren't present
in #included from . They must be the same on
@@ -254,11 +267,65 @@ class KMPHwlocAffinity : public KMPAffinity {
#elif __NR_sched_getaffinity != 5196
#error Wrong code for getaffinity system call.
#endif /* __NR_sched_getaffinity */
+#elif KMP_ARCH_LOONGARCH64
+#ifndef __NR_sched_setaffinity
+#define __NR_sched_setaffinity 122
+#elif __NR_sched_setaffinity != 122
+#error Wrong code for setaffinity system call.
+#endif /* __NR_sched_setaffinity */
+#ifndef __NR_sched_getaffinity
+#define __NR_sched_getaffinity 123
+#elif __NR_sched_getaffinity != 123
+#error Wrong code for getaffinity system call.
+#endif /* __NR_sched_getaffinity */
+#elif KMP_ARCH_RISCV64
+#ifndef __NR_sched_setaffinity
+#define __NR_sched_setaffinity 122
+#elif __NR_sched_setaffinity != 122
+#error Wrong code for setaffinity system call.
+#endif /* __NR_sched_setaffinity */
+#ifndef __NR_sched_getaffinity
+#define __NR_sched_getaffinity 123
+#elif __NR_sched_getaffinity != 123
+#error Wrong code for getaffinity system call.
+#endif /* __NR_sched_getaffinity */
+#elif KMP_ARCH_VE
+#ifndef __NR_sched_setaffinity
+#define __NR_sched_setaffinity 203
+#elif __NR_sched_setaffinity != 203
+#error Wrong code for setaffinity system call.
+#endif /* __NR_sched_setaffinity */
+#ifndef __NR_sched_getaffinity
+#define __NR_sched_getaffinity 204
+#elif __NR_sched_getaffinity != 204
+#error Wrong code for getaffinity system call.
+#endif /* __NR_sched_getaffinity */
+#elif KMP_ARCH_S390X
+#ifndef __NR_sched_setaffinity
+#define __NR_sched_setaffinity 239
+#elif __NR_sched_setaffinity != 239
+#error Wrong code for setaffinity system call.
+#endif /* __NR_sched_setaffinity */
+#ifndef __NR_sched_getaffinity
+#define __NR_sched_getaffinity 240
+#elif __NR_sched_getaffinity != 240
+#error Wrong code for getaffinity system call.
+#endif /* __NR_sched_getaffinity */
+#else
#error Unknown or unsupported architecture
#endif /* KMP_ARCH_* */
-#elif KMP_OS_FREEBSD
+#elif KMP_OS_FREEBSD || KMP_OS_DRAGONFLY
#include
#include
+#elif KMP_OS_NETBSD
+#include
+#include
+#elif KMP_OS_AIX
+#include
+#include
+#define VMI_MAXRADS 64 // Maximum number of RADs allowed by AIX.
+#define GET_NUMBER_SMT_SETS 0x0004
+extern "C" int syssmt(int flags, int, int, int *);
#endif
class KMPNativeAffinity : public KMPAffinity {
class Mask : public KMPAffinity::Mask {
@@ -291,6 +358,13 @@ class KMPNativeAffinity : public KMPAffinity {
for (mask_size_type i = 0; i < e; ++i)
mask[i] = (mask_t)0;
}
+ bool empty() const override {
+ mask_size_type e = get_num_mask_types();
+ for (mask_size_type i = 0; i < e; ++i)
+ if (mask[i] != (mask_t)0)
+ return false;
+ return true;
+ }
void copy(const KMPAffinity::Mask *src) override {
const Mask *convert = static_cast(src);
mask_size_type e = get_num_mask_types();
@@ -314,6 +388,14 @@ class KMPNativeAffinity : public KMPAffinity {
for (mask_size_type i = 0; i < e; ++i)
mask[i] = ~(mask[i]);
}
+ bool is_equal(const KMPAffinity::Mask *rhs) const override {
+ const Mask *convert = static_cast(rhs);
+ mask_size_type e = get_num_mask_types();
+ for (mask_size_type i = 0; i < e; ++i)
+ if (mask[i] != convert->mask[i])
+ return false;
+ return true;
+ }
int begin() const override {
int retval = 0;
while (retval < end() && !is_set(retval))
@@ -331,13 +413,77 @@ class KMPNativeAffinity : public KMPAffinity {
++retval;
return retval;
}
+#if KMP_OS_AIX
+ // On AIX, we don't have a way to get CPU(s) a thread is bound to.
+ // This routine is only used to get the full mask.
+ int get_system_affinity(bool abort_on_error) override {
+ KMP_ASSERT2(KMP_AFFINITY_CAPABLE(),
+ "Illegal get affinity operation when not capable");
+
+ (void)abort_on_error;
+
+ // Set the mask with all CPUs that are available.
+ for (int i = 0; i < __kmp_xproc; ++i)
+ KMP_CPU_SET(i, this);
+ return 0;
+ }
+ int set_system_affinity(bool abort_on_error) const override {
+ KMP_ASSERT2(KMP_AFFINITY_CAPABLE(),
+
+ "Illegal set affinity operation when not capable");
+
+ int location;
+ int gtid = __kmp_entry_gtid();
+ int tid = thread_self();
+
+ // Unbind the thread if it was bound to any processors before so that
+ // we can bind the thread to CPUs specified by the mask not others.
+ int retval = bindprocessor(BINDTHREAD, tid, PROCESSOR_CLASS_ANY);
+
+ // On AIX, we can only bind to one instead of a set of CPUs with the
+ // bindprocessor() system call.
+ KMP_CPU_SET_ITERATE(location, this) {
+ if (KMP_CPU_ISSET(location, this)) {
+ retval = bindprocessor(BINDTHREAD, tid, location);
+ if (retval == -1 && errno == 1) {
+ rsid_t rsid;
+ rsethandle_t rsh;
+ // Put something in rsh to prevent compiler warning
+ // about uninitalized use
+ rsh = rs_alloc(RS_EMPTY);
+ rsid.at_pid = getpid();
+ if (RS_DEFAULT_RSET != ra_getrset(R_PROCESS, rsid, 0, rsh)) {
+ retval = ra_detachrset(R_PROCESS, rsid, 0);
+ retval = bindprocessor(BINDTHREAD, tid, location);
+ }
+ }
+ if (retval == 0) {
+ KA_TRACE(10, ("__kmp_set_system_affinity: Done binding "
+ "T#%d to cpu=%d.\n",
+ gtid, location));
+ continue;
+ }
+ int error = errno;
+ if (abort_on_error) {
+ __kmp_fatal(KMP_MSG(FunctionError, "bindprocessor()"),
+ KMP_ERR(error), __kmp_msg_null);
+ KA_TRACE(10, ("__kmp_set_system_affinity: Error binding "
+ "T#%d to cpu=%d, errno=%d.\n",
+ gtid, location, error));
+ return error;
+ }
+ }
+ }
+ return 0;
+ }
+#else // !KMP_OS_AIX
int get_system_affinity(bool abort_on_error) override {
KMP_ASSERT2(KMP_AFFINITY_CAPABLE(),
"Illegal get affinity operation when not capable");
#if KMP_OS_LINUX
long retval =
syscall(__NR_sched_getaffinity, 0, __kmp_affin_mask_size, mask);
-#elif KMP_OS_FREEBSD
+#elif KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY
int r = pthread_getaffinity_np(pthread_self(), __kmp_affin_mask_size,
reinterpret_cast(mask));
int retval = (r == 0 ? 0 : -1);
@@ -347,7 +493,8 @@ class KMPNativeAffinity : public KMPAffinity {
}
int error = errno;
if (abort_on_error) {
- __kmp_fatal(KMP_MSG(FatalSysError), KMP_ERR(error), __kmp_msg_null);
+ __kmp_fatal(KMP_MSG(FunctionError, "pthread_getaffinity_np()"),
+ KMP_ERR(error), __kmp_msg_null);
}
return error;
}
@@ -357,7 +504,7 @@ class KMPNativeAffinity : public KMPAffinity {
#if KMP_OS_LINUX
long retval =
syscall(__NR_sched_setaffinity, 0, __kmp_affin_mask_size, mask);
-#elif KMP_OS_FREEBSD
+#elif KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY
int r = pthread_setaffinity_np(pthread_self(), __kmp_affin_mask_size,
reinterpret_cast(mask));
int retval = (r == 0 ? 0 : -1);
@@ -367,10 +514,12 @@ class KMPNativeAffinity : public KMPAffinity {
}
int error = errno;
if (abort_on_error) {
- __kmp_fatal(KMP_MSG(FatalSysError), KMP_ERR(error), __kmp_msg_null);
+ __kmp_fatal(KMP_MSG(FunctionError, "pthread_setaffinity_np()"),
+ KMP_ERR(error), __kmp_msg_null);
}
return error;
}
+#endif // KMP_OS_AIX
};
void determine_capable(const char *env_var) override {
__kmp_affinity_determine_capable(env_var);
@@ -399,7 +548,8 @@ class KMPNativeAffinity : public KMPAffinity {
}
api_type get_api_type() const override { return NATIVE_OS; }
};
-#endif /* KMP_OS_LINUX || KMP_OS_FREEBSD */
+#endif /* KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY \
+ || KMP_OS_AIX */
#if KMP_OS_WINDOWS
class KMPNativeAffinity : public KMPAffinity {
@@ -429,6 +579,12 @@ class KMPNativeAffinity : public KMPAffinity {
for (int i = 0; i < __kmp_num_proc_groups; ++i)
mask[i] = 0;
}
+ bool empty() const override {
+ for (size_t i = 0; i < __kmp_num_proc_groups; ++i)
+ if (mask[i])
+ return false;
+ return true;
+ }
void copy(const KMPAffinity::Mask *src) override {
const Mask *convert = static_cast(src);
for (int i = 0; i < __kmp_num_proc_groups; ++i)
@@ -448,6 +604,13 @@ class KMPNativeAffinity : public KMPAffinity {
for (int i = 0; i < __kmp_num_proc_groups; ++i)
mask[i] = ~(mask[i]);
}
+ bool is_equal(const KMPAffinity::Mask *rhs) const override {
+ const Mask *convert = static_cast(rhs);
+ for (size_t i = 0; i < __kmp_num_proc_groups; ++i)
+ if (mask[i] != convert->mask[i])
+ return false;
+ return true;
+ }
int begin() const override {
int retval = 0;
while (retval < end() && !is_set(retval))
@@ -649,6 +812,21 @@ struct kmp_hw_attr_t {
}
return false;
}
+#if KMP_AFFINITY_SUPPORTED
+ bool contains(const kmp_affinity_attrs_t &attr) const {
+ if (!valid && !attr.valid)
+ return true;
+ if (valid && attr.valid) {
+ if (attr.core_type != KMP_HW_CORE_TYPE_UNKNOWN)
+ return (is_core_type_valid() &&
+ (get_core_type() == (kmp_hw_core_type_t)attr.core_type));
+ if (attr.core_eff != UNKNOWN_CORE_EFF)
+ return (is_core_eff_valid() && (get_core_eff() == attr.core_eff));
+ return true;
+ }
+ return false;
+ }
+#endif // KMP_AFFINITY_SUPPORTED
bool operator==(const kmp_hw_attr_t &rhs) const {
return (rhs.valid == valid && rhs.core_eff == core_eff &&
rhs.core_type == core_type);
@@ -656,15 +834,21 @@ struct kmp_hw_attr_t {
bool operator!=(const kmp_hw_attr_t &rhs) const { return !operator==(rhs); }
};
+#if KMP_AFFINITY_SUPPORTED
+KMP_BUILD_ASSERT(sizeof(kmp_hw_attr_t) == sizeof(kmp_affinity_attrs_t));
+#endif
+
class kmp_hw_thread_t {
public:
static const int UNKNOWN_ID = -1;
+ static const int MULTIPLE_ID = -2;
static int compare_ids(const void *a, const void *b);
static int compare_compact(const void *a, const void *b);
int ids[KMP_HW_LAST];
int sub_ids[KMP_HW_LAST];
bool leader;
int os_id;
+ int original_idx;
kmp_hw_attr_t attrs;
void print() const;
@@ -721,8 +905,8 @@ class kmp_topology_t {
// Flags describing the topology
flags_t flags;
- // Insert a new topology layer after allocation
- void _insert_layer(kmp_hw_t type, const int *ids);
+ // Compact value used during sort_compact()
+ int compact;
#if KMP_GROUP_AFFINITY
// Insert topology information about Windows Processor groups
@@ -783,6 +967,10 @@ class kmp_topology_t {
qsort(hw_threads, num_hw_threads, sizeof(kmp_hw_thread_t),
kmp_hw_thread_t::compare_ids);
}
+
+ // Insert a new topology layer after allocation
+ void insert_layer(kmp_hw_t type, const int *ids);
+
// Check if the hardware ids are unique, if they are
// return true, otherwise return false
bool check_ids() const;
@@ -791,13 +979,23 @@ class kmp_topology_t {
void canonicalize();
void canonicalize(int pkgs, int cores_per_pkg, int thr_per_core, int cores);
- // Functions used after canonicalize() called
+// Functions used after canonicalize() called
+
+#if KMP_AFFINITY_SUPPORTED
+ // Set the granularity for affinity settings
+ void set_granularity(kmp_affinity_t &stgs) const;
+ bool is_close(int hwt1, int hwt2, const kmp_affinity_t &stgs) const;
+ bool restrict_to_mask(const kmp_affin_mask_t *mask);
bool filter_hw_subset();
- bool is_close(int hwt1, int hwt2, int level) const;
+#endif
bool is_uniform() const { return flags.uniform; }
// Tell whether a type is a valid type in the topology
// returns KMP_HW_UNKNOWN when there is no equivalent type
- kmp_hw_t get_equivalent_type(kmp_hw_t type) const { return equivalent[type]; }
+ kmp_hw_t get_equivalent_type(kmp_hw_t type) const {
+ if (type == KMP_HW_UNKNOWN)
+ return KMP_HW_UNKNOWN;
+ return equivalent[type];
+ }
// Set type1 = type2
void set_equivalent_type(kmp_hw_t type1, kmp_hw_t type2) {
KMP_DEBUG_ASSERT_VALID_HW_TYPE(type1);
@@ -858,7 +1056,9 @@ class kmp_topology_t {
}
#if KMP_AFFINITY_SUPPORTED
- void sort_compact() {
+ friend int kmp_hw_thread_t::compare_compact(const void *a, const void *b);
+ void sort_compact(kmp_affinity_t &affinity) {
+ compact = affinity.compact;
qsort(hw_threads, num_hw_threads, sizeof(kmp_hw_thread_t),
kmp_hw_thread_t::compare_compact);
}
@@ -978,6 +1178,50 @@ class kmp_hw_subset_t {
qsort(items, depth, sizeof(item_t), hw_subset_compare);
}
bool specified(kmp_hw_t type) const { return ((set & (1ull << type)) > 0); }
+
+ // Canonicalize the KMP_HW_SUBSET value if it is not an absolute subset.
+ // This means putting each of {sockets, cores, threads} in the topology if
+ // they are not specified:
+ // e.g., 1s,2c => 1s,2c,*t | 2c,1t => *s,2c,1t | 1t => *s,*c,1t | etc.
+ // e.g., 3module => *s,3module,*c,*t
+ // By doing this, the runtime assumes users who fiddle with KMP_HW_SUBSET
+ // are expecting the traditional sockets/cores/threads topology. For newer
+ // hardware, there can be intervening layers like dies/tiles/modules
+ // (usually corresponding to a cache level). So when a user asks for
+ // 1s,6c,2t and the topology is really 1s,2modules,4cores,2threads, the user
+ // should get 12 hardware threads across 6 cores and effectively ignore the
+ // module layer.
+ void canonicalize(const kmp_topology_t *top) {
+ // Layers to target for KMP_HW_SUBSET canonicalization
+ kmp_hw_t targeted[] = {KMP_HW_SOCKET, KMP_HW_CORE, KMP_HW_THREAD};
+
+ // Do not target-layer-canonicalize absolute KMP_HW_SUBSETS
+ if (is_absolute())
+ return;
+
+ // Do not target-layer-canonicalize KMP_HW_SUBSETS when the
+ // topology doesn't have these layers
+ for (kmp_hw_t type : targeted)
+ if (top->get_level(type) == KMP_HW_UNKNOWN)
+ return;
+
+ // Put targeted layers in topology if they do not exist
+ for (kmp_hw_t type : targeted) {
+ bool found = false;
+ for (int i = 0; i < get_depth(); ++i) {
+ if (top->get_equivalent_type(items[i].type) == type) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ push_back(USE_ALL, type, 0, kmp_hw_attr_t{});
+ }
+ }
+ sort();
+ // Set as an absolute topology that only targets the targeted layers
+ set_absolute();
+ }
void dump() const {
printf("**********************\n");
printf("*** kmp_hw_subset: ***\n");
@@ -1029,7 +1273,7 @@ class hierarchy_info {
leaf. It corresponds to the number of entries in numPerLevel if we exclude
all but one trailing 1. */
kmp_uint32 depth;
- kmp_uint32 base_num_threads;
+ kmp_uint32 base_num_threads = 0;
enum init_status { initialized = 0, not_initialized = 1, initializing = 2 };
volatile kmp_int8 uninitialized; // 0=initialized, 1=not initialized,
// 2=initialization in progress
@@ -1039,8 +1283,8 @@ class hierarchy_info {
the parent of a node at level i has. For example, if we have a machine
with 4 packages, 4 cores/package and 2 HT per core, then numPerLevel =
{2, 4, 4, 1, 1}. All empty levels are set to 1. */
- kmp_uint32 *numPerLevel;
- kmp_uint32 *skipPerLevel;
+ kmp_uint32 *numPerLevel = nullptr;
+ kmp_uint32 *skipPerLevel = nullptr;
void deriveLevels() {
int hier_depth = __kmp_topology->get_depth();
diff --git a/contrib/libs/cxxsupp/openmp/kmp_alloc.cpp b/contrib/libs/cxxsupp/openmp/kmp_alloc.cpp
index e9aaedc538ce..00a4f1ef9560 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_alloc.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_alloc.cpp
@@ -1257,7 +1257,11 @@ static void **mk_dax_kmem_preferred;
static void *(*kmp_target_alloc_host)(size_t size, int device);
static void *(*kmp_target_alloc_shared)(size_t size, int device);
static void *(*kmp_target_alloc_device)(size_t size, int device);
-static void *(*kmp_target_free)(void *ptr, int device);
+static void *(*kmp_target_lock_mem)(void *ptr, size_t size, int device);
+static void *(*kmp_target_unlock_mem)(void *ptr, int device);
+static void *(*kmp_target_free_host)(void *ptr, int device);
+static void *(*kmp_target_free_shared)(void *ptr, int device);
+static void *(*kmp_target_free_device)(void *ptr, int device);
static bool __kmp_target_mem_available;
#define KMP_IS_TARGET_MEM_SPACE(MS) \
(MS == llvm_omp_target_host_mem_space || \
@@ -1370,10 +1374,18 @@ void __kmp_init_target_mem() {
KMP_DLSYM("llvm_omp_target_alloc_shared");
*(void **)(&kmp_target_alloc_device) =
KMP_DLSYM("llvm_omp_target_alloc_device");
- *(void **)(&kmp_target_free) = KMP_DLSYM("omp_target_free");
- __kmp_target_mem_available = kmp_target_alloc_host &&
- kmp_target_alloc_shared &&
- kmp_target_alloc_device && kmp_target_free;
+ *(void **)(&kmp_target_free_host) = KMP_DLSYM("llvm_omp_target_free_host");
+ *(void **)(&kmp_target_free_shared) =
+ KMP_DLSYM("llvm_omp_target_free_shared");
+ *(void **)(&kmp_target_free_device) =
+ KMP_DLSYM("llvm_omp_target_free_device");
+ __kmp_target_mem_available =
+ kmp_target_alloc_host && kmp_target_alloc_shared &&
+ kmp_target_alloc_device && kmp_target_free_host &&
+ kmp_target_free_shared && kmp_target_free_device;
+ // lock/pin and unlock/unpin target calls
+ *(void **)(&kmp_target_lock_mem) = KMP_DLSYM("llvm_omp_target_lock_mem");
+ *(void **)(&kmp_target_unlock_mem) = KMP_DLSYM("llvm_omp_target_unlock_mem");
}
omp_allocator_handle_t __kmpc_init_allocator(int gtid, omp_memspace_handle_t ms,
@@ -1391,7 +1403,9 @@ omp_allocator_handle_t __kmpc_init_allocator(int gtid, omp_memspace_handle_t ms,
switch (traits[i].key) {
case omp_atk_sync_hint:
case omp_atk_access:
+ break;
case omp_atk_pinned:
+ al->pinned = true;
break;
case omp_atk_alignment:
__kmp_type_convert(traits[i].value, &(al->alignment));
@@ -1550,6 +1564,8 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
return NULL;
if (allocator == omp_null_allocator)
allocator = __kmp_threads[gtid]->th.th_def_allocator;
+ kmp_int32 default_device =
+ __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
al = RCAST(kmp_allocator_t *, allocator);
@@ -1565,6 +1581,46 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
align = algn; // max of allocator trait, parameter and sizeof(void*)
desc.size_orig = size;
desc.size_a = size + sz_desc + align;
+ bool is_pinned = false;
+ if (allocator > kmp_max_mem_alloc)
+ is_pinned = al->pinned;
+
+ // Use default allocator if libmemkind is not available
+ int use_default_allocator = (__kmp_memkind_available) ? false : true;
+
+ if (KMP_IS_TARGET_MEM_ALLOC(allocator)) {
+ // Use size input directly as the memory may not be accessible on host.
+ // Use default device for now.
+ if (__kmp_target_mem_available) {
+ kmp_int32 device =
+ __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
+ if (allocator == llvm_omp_target_host_mem_alloc)
+ ptr = kmp_target_alloc_host(size, device);
+ else if (allocator == llvm_omp_target_shared_mem_alloc)
+ ptr = kmp_target_alloc_shared(size, device);
+ else // allocator == llvm_omp_target_device_mem_alloc
+ ptr = kmp_target_alloc_device(size, device);
+ return ptr;
+ } else {
+ KMP_INFORM(TargetMemNotAvailable);
+ }
+ }
+
+ if (allocator >= kmp_max_mem_alloc && KMP_IS_TARGET_MEM_SPACE(al->memspace)) {
+ if (__kmp_target_mem_available) {
+ kmp_int32 device =
+ __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
+ if (al->memspace == llvm_omp_target_host_mem_space)
+ ptr = kmp_target_alloc_host(size, device);
+ else if (al->memspace == llvm_omp_target_shared_mem_space)
+ ptr = kmp_target_alloc_shared(size, device);
+ else // al->memspace == llvm_omp_target_device_mem_space
+ ptr = kmp_target_alloc_device(size, device);
+ return ptr;
+ } else {
+ KMP_INFORM(TargetMemNotAvailable);
+ }
+ }
if (__kmp_memkind_available) {
if (allocator < kmp_max_mem_alloc) {
@@ -1591,7 +1647,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
} else if (al->fb == omp_atv_allocator_fb) {
KMP_ASSERT(al != al->fb_data);
al = al->fb_data;
- return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ if (is_pinned && kmp_target_lock_mem)
+ kmp_target_lock_mem(ptr, size, default_device);
+ return ptr;
} // else ptr == NULL;
} else {
// pool has enough space
@@ -1605,7 +1664,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
} else if (al->fb == omp_atv_allocator_fb) {
KMP_ASSERT(al != al->fb_data);
al = al->fb_data;
- return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ if (is_pinned && kmp_target_lock_mem)
+ kmp_target_lock_mem(ptr, size, default_device);
+ return ptr;
}
}
}
@@ -1621,47 +1683,36 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
} else if (al->fb == omp_atv_allocator_fb) {
KMP_ASSERT(al != al->fb_data);
al = al->fb_data;
- return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ if (is_pinned && kmp_target_lock_mem)
+ kmp_target_lock_mem(ptr, size, default_device);
+ return ptr;
}
}
}
} else if (allocator < kmp_max_mem_alloc) {
- if (KMP_IS_TARGET_MEM_ALLOC(allocator)) {
- // Use size input directly as the memory may not be accessible on host.
- // Use default device for now.
- if (__kmp_target_mem_available) {
- kmp_int32 device =
- __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
- if (allocator == llvm_omp_target_host_mem_alloc)
- ptr = kmp_target_alloc_host(size, device);
- else if (allocator == llvm_omp_target_shared_mem_alloc)
- ptr = kmp_target_alloc_shared(size, device);
- else // allocator == llvm_omp_target_device_mem_alloc
- ptr = kmp_target_alloc_device(size, device);
- }
- return ptr;
- }
-
// pre-defined allocator
if (allocator == omp_high_bw_mem_alloc) {
- // ptr = NULL;
+ KMP_WARNING(OmpNoAllocator, "omp_high_bw_mem_alloc");
} else if (allocator == omp_large_cap_mem_alloc) {
- // warnings?
- } else {
- ptr = __kmp_thread_malloc(__kmp_thread_from_gtid(gtid), desc.size_a);
+ KMP_WARNING(OmpNoAllocator, "omp_large_cap_mem_alloc");
+ } else if (allocator == omp_const_mem_alloc) {
+ KMP_WARNING(OmpNoAllocator, "omp_const_mem_alloc");
+ } else if (allocator == omp_low_lat_mem_alloc) {
+ KMP_WARNING(OmpNoAllocator, "omp_low_lat_mem_alloc");
+ } else if (allocator == omp_cgroup_mem_alloc) {
+ KMP_WARNING(OmpNoAllocator, "omp_cgroup_mem_alloc");
+ } else if (allocator == omp_pteam_mem_alloc) {
+ KMP_WARNING(OmpNoAllocator, "omp_pteam_mem_alloc");
+ } else if (allocator == omp_thread_mem_alloc) {
+ KMP_WARNING(OmpNoAllocator, "omp_thread_mem_alloc");
+ } else { // default allocator requested
+ use_default_allocator = true;
}
- } else if (KMP_IS_TARGET_MEM_SPACE(al->memspace)) {
- if (__kmp_target_mem_available) {
- kmp_int32 device =
- __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
- if (al->memspace == llvm_omp_target_host_mem_space)
- ptr = kmp_target_alloc_host(size, device);
- else if (al->memspace == llvm_omp_target_shared_mem_space)
- ptr = kmp_target_alloc_shared(size, device);
- else // al->memspace == llvm_omp_target_device_mem_space
- ptr = kmp_target_alloc_device(size, device);
+ if (use_default_allocator) {
+ ptr = __kmp_thread_malloc(__kmp_thread_from_gtid(gtid), desc.size_a);
+ use_default_allocator = false;
}
- return ptr;
} else if (al->pool_size > 0) {
// custom allocator with pool size requested
kmp_uint64 used =
@@ -1677,7 +1728,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
} else if (al->fb == omp_atv_allocator_fb) {
KMP_ASSERT(al != al->fb_data);
al = al->fb_data;
- return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
+ if (is_pinned && kmp_target_lock_mem)
+ kmp_target_lock_mem(ptr, size, default_device);
+ return ptr;
} // else ptr == NULL;
} else {
// pool has enough space
@@ -1697,6 +1751,9 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
if (ptr == NULL)
return NULL;
+ if (is_pinned && kmp_target_lock_mem)
+ kmp_target_lock_mem(ptr, desc.size_a, default_device);
+
addr = (kmp_uintptr_t)ptr;
addr_align = (addr + sz_desc + align - 1) & ~(align - 1);
addr_descr = addr_align - sz_desc;
@@ -1786,13 +1843,18 @@ void ___kmpc_free(int gtid, void *ptr, omp_allocator_handle_t allocator) {
kmp_mem_desc_t desc;
kmp_uintptr_t addr_align; // address to return to caller
kmp_uintptr_t addr_descr; // address of memory block descriptor
- if (KMP_IS_TARGET_MEM_ALLOC(allocator) ||
- (allocator > kmp_max_mem_alloc &&
- KMP_IS_TARGET_MEM_SPACE(al->memspace))) {
- KMP_DEBUG_ASSERT(kmp_target_free);
+ if (__kmp_target_mem_available && (KMP_IS_TARGET_MEM_ALLOC(allocator) ||
+ (allocator > kmp_max_mem_alloc &&
+ KMP_IS_TARGET_MEM_SPACE(al->memspace)))) {
kmp_int32 device =
__kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
- kmp_target_free(ptr, device);
+ if (allocator == llvm_omp_target_host_mem_alloc) {
+ kmp_target_free_host(ptr, device);
+ } else if (allocator == llvm_omp_target_shared_mem_alloc) {
+ kmp_target_free_shared(ptr, device);
+ } else if (allocator == llvm_omp_target_device_mem_alloc) {
+ kmp_target_free_device(ptr, device);
+ }
return;
}
@@ -1808,6 +1870,12 @@ void ___kmpc_free(int gtid, void *ptr, omp_allocator_handle_t allocator) {
oal = (omp_allocator_handle_t)al; // cast to void* for comparisons
KMP_DEBUG_ASSERT(al);
+ if (allocator > kmp_max_mem_alloc && kmp_target_unlock_mem && al->pinned) {
+ kmp_int32 device =
+ __kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
+ kmp_target_unlock_mem(desc.ptr_alloc, device);
+ }
+
if (__kmp_memkind_available) {
if (oal < kmp_max_mem_alloc) {
// pre-defined allocator
diff --git a/contrib/libs/cxxsupp/openmp/kmp_atomic.cpp b/contrib/libs/cxxsupp/openmp/kmp_atomic.cpp
index 21c2c60bfb60..261e9f1beee6 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_atomic.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_atomic.cpp
@@ -832,7 +832,7 @@ static inline kmp_cmplx128_a16_t operator/(kmp_cmplx128_a16_t &lhs,
// end of the first part of the workaround for C78287
#endif // USE_CMPXCHG_FIX
-#if KMP_OS_WINDOWS && KMP_ARCH_AARCH64
+#if KMP_OS_WINDOWS && (KMP_ARCH_AARCH64 || KMP_ARCH_ARM)
// Undo explicit type casts to get MSVC ARM64 to build. Uses
// OP_CMPXCHG_WORKAROUND definition for OP_CMPXCHG
#undef OP_CMPXCHG
@@ -863,7 +863,7 @@ static inline kmp_cmplx128_a16_t operator/(kmp_cmplx128_a16_t &lhs,
(*lhs) = (*lhs)OP rhs; \
__kmp_release_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid);
-#endif // KMP_OS_WINDOWS && KMP_ARCH_AARCH64
+#endif // KMP_OS_WINDOWS && (KMP_ARCH_AARCH64 || KMP_ARCH_ARM)
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -1914,8 +1914,7 @@ ATOMIC_CMPXCHG_CMPLX(cmplx4, kmp_cmplx32, mul, 64, *, cmplx8, kmp_cmplx64, 8c,
ATOMIC_CMPXCHG_CMPLX(cmplx4, kmp_cmplx32, div, 64, /, cmplx8, kmp_cmplx64, 8c,
7, KMP_ARCH_X86) // __kmpc_atomic_cmplx4_div_cmplx8
-// READ, WRITE, CAPTURE are supported only on IA-32 architecture and Intel(R) 64
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+// READ, WRITE, CAPTURE
// ------------------------------------------------------------------------
// Atomic READ routines
@@ -2925,6 +2924,7 @@ ATOMIC_CRITICAL_CPT(cmplx16, div_a16_cpt, kmp_cmplx128_a16_t, /, 32c,
// binop x; v = x; } for non-commutative operations.
// Supported only on IA-32 architecture and Intel(R) 64
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
// -------------------------------------------------------------------------
// Operation on *lhs, rhs bound by critical section
// OP - operator (it's supposed to contain an assignment)
diff --git a/contrib/libs/cxxsupp/openmp/kmp_atomic.h b/contrib/libs/cxxsupp/openmp/kmp_atomic.h
index 19c02e9d25c0..4fc51ee4289b 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_atomic.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_atomic.h
@@ -1005,8 +1005,7 @@ void __kmpc_atomic_20(ident_t *id_ref, int gtid, void *lhs, void *rhs,
void __kmpc_atomic_32(ident_t *id_ref, int gtid, void *lhs, void *rhs,
void (*f)(void *, void *, void *));
-// READ, WRITE, CAPTURE are supported only on IA-32 architecture and Intel(R) 64
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+// READ, WRITE, CAPTURE
// Below routines for atomic READ are listed
char __kmpc_atomic_fixed1_rd(ident_t *id_ref, int gtid, char *loc);
@@ -1337,7 +1336,6 @@ void __kmpc_atomic_cmplx4_mul_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
void __kmpc_atomic_cmplx4_div_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
-
kmp_cmplx64 __kmpc_atomic_cmplx8_add_cpt(ident_t *id_ref, int gtid,
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
int flag);
@@ -1419,7 +1417,7 @@ void __kmpc_atomic_end(void);
// OpenMP 4.0: v = x = expr binop x; { v = x; x = expr binop x; } { x = expr
// binop x; v = x; } for non-commutative operations.
-
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
char __kmpc_atomic_fixed1_sub_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
char rhs, int flag);
char __kmpc_atomic_fixed1_div_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
diff --git a/contrib/libs/cxxsupp/openmp/kmp_barrier.cpp b/contrib/libs/cxxsupp/openmp/kmp_barrier.cpp
index 1a718b45ffff..d7ef57c60814 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_barrier.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_barrier.cpp
@@ -444,7 +444,8 @@ static void __kmp_dist_barrier_release(
next_go = my_current_iter + distributedBarrier::MAX_ITERS;
my_go_index = tid / b->threads_per_go;
if (this_thr->th.th_used_in_team.load() == 3) {
- KMP_COMPARE_AND_STORE_ACQ32(&(this_thr->th.th_used_in_team), 3, 1);
+ (void)KMP_COMPARE_AND_STORE_ACQ32(&(this_thr->th.th_used_in_team), 3,
+ 1);
}
// Check if go flag is set
if (b->go[my_go_index].go.load() != next_go) {
@@ -1805,7 +1806,25 @@ static int __kmp_barrier_template(enum barrier_type bt, int gtid, int is_split,
// It is OK to report the barrier state after the barrier begin callback.
// According to the OMPT specification, a compliant implementation may
// even delay reporting this state until the barrier begins to wait.
- this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier;
+ auto *ompt_thr_info = &this_thr->th.ompt_thread_info;
+ switch (barrier_kind) {
+ case ompt_sync_region_barrier_explicit:
+ ompt_thr_info->state = ompt_state_wait_barrier_explicit;
+ break;
+ case ompt_sync_region_barrier_implicit_workshare:
+ ompt_thr_info->state = ompt_state_wait_barrier_implicit_workshare;
+ break;
+ case ompt_sync_region_barrier_implicit_parallel:
+ ompt_thr_info->state = ompt_state_wait_barrier_implicit_parallel;
+ break;
+ case ompt_sync_region_barrier_teams:
+ ompt_thr_info->state = ompt_state_wait_barrier_teams;
+ break;
+ case ompt_sync_region_barrier_implementation:
+ [[fallthrough]];
+ default:
+ ompt_thr_info->state = ompt_state_wait_barrier_implementation;
+ }
}
#endif
@@ -1858,8 +1877,7 @@ static int __kmp_barrier_template(enum barrier_type bt, int gtid, int is_split,
}
if (KMP_MASTER_TID(tid) && __kmp_tasking_mode != tskm_immediate_exec)
- // use 0 to only setup the current team if nthreads > 1
- __kmp_task_team_setup(this_thr, team, 0);
+ __kmp_task_team_setup(this_thr, team);
if (cancellable) {
cancelled = __kmp_linear_barrier_gather_cancellable(
@@ -2042,7 +2060,7 @@ static int __kmp_barrier_template(enum barrier_type bt, int gtid, int is_split,
this_thr->th.th_task_team->tt.tt_hidden_helper_task_encountered ==
TRUE);
__kmp_task_team_wait(this_thr, team USE_ITT_BUILD_ARG(itt_sync_obj));
- __kmp_task_team_setup(this_thr, team, 0);
+ __kmp_task_team_setup(this_thr, team);
#if USE_ITT_BUILD
if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
@@ -2214,20 +2232,24 @@ void __kmp_join_barrier(int gtid) {
codeptr = team->t.ompt_team_info.master_return_address;
my_task_data = OMPT_CUR_TASK_DATA(this_thr);
my_parallel_data = OMPT_CUR_TEAM_DATA(this_thr);
+ ompt_sync_region_t sync_kind = ompt_sync_region_barrier_implicit_parallel;
+ ompt_state_t ompt_state = ompt_state_wait_barrier_implicit_parallel;
+ if (this_thr->th.ompt_thread_info.parallel_flags & ompt_parallel_league) {
+ sync_kind = ompt_sync_region_barrier_teams;
+ ompt_state = ompt_state_wait_barrier_teams;
+ }
if (ompt_enabled.ompt_callback_sync_region) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region)(
- ompt_sync_region_barrier_implicit, ompt_scope_begin, my_parallel_data,
- my_task_data, codeptr);
+ sync_kind, ompt_scope_begin, my_parallel_data, my_task_data, codeptr);
}
if (ompt_enabled.ompt_callback_sync_region_wait) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait)(
- ompt_sync_region_barrier_implicit, ompt_scope_begin, my_parallel_data,
- my_task_data, codeptr);
+ sync_kind, ompt_scope_begin, my_parallel_data, my_task_data, codeptr);
}
if (!KMP_MASTER_TID(ds_tid))
this_thr->th.ompt_thread_info.task_data = *OMPT_CUR_TASK_DATA(this_thr);
#endif
- this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier_implicit;
+ this_thr->th.ompt_thread_info.state = ompt_state;
}
#endif
@@ -2243,9 +2265,7 @@ void __kmp_join_barrier(int gtid) {
__kmp_gtid_from_thread(this_thr), team_id,
team->t.t_task_team[this_thr->th.th_task_state],
this_thr->th.th_task_team));
- if (this_thr->th.th_task_team)
- KMP_DEBUG_ASSERT(this_thr->th.th_task_team ==
- team->t.t_task_team[this_thr->th.th_task_state]);
+ KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team, this_thr);
}
#endif /* KMP_DEBUG */
@@ -2403,11 +2423,11 @@ void __kmp_fork_barrier(int gtid, int tid) {
#if USE_ITT_BUILD
void *itt_sync_obj = NULL;
#endif /* USE_ITT_BUILD */
+#ifdef KMP_DEBUG
if (team)
-
- KA_TRACE(10, ("__kmp_fork_barrier: T#%d(%d:%d) has arrived\n", gtid,
- (team != NULL) ? team->t.t_id : -1, tid));
-
+ KA_TRACE(10, ("__kmp_fork_barrier: T#%d(%d:%d) has arrived\n", gtid,
+ (team != NULL) ? team->t.t_id : -1, tid));
+#endif
// th_team pointer only valid for primary thread here
if (KMP_MASTER_TID(tid)) {
#if USE_ITT_BUILD && USE_ITT_NOTIFY
@@ -2440,10 +2460,8 @@ void __kmp_fork_barrier(int gtid, int tid) {
}
#endif
- if (__kmp_tasking_mode != tskm_immediate_exec) {
- // 0 indicates setup current task team if nthreads > 1
- __kmp_task_team_setup(this_thr, team, 0);
- }
+ if (__kmp_tasking_mode != tskm_immediate_exec)
+ __kmp_task_team_setup(this_thr, team);
/* The primary thread may have changed its blocktime between join barrier
and fork barrier. Copy the blocktime info to the thread, where
@@ -2493,8 +2511,10 @@ void __kmp_fork_barrier(int gtid, int tid) {
}
#if OMPT_SUPPORT
+ ompt_state_t ompt_state = this_thr->th.ompt_thread_info.state;
if (ompt_enabled.enabled &&
- this_thr->th.ompt_thread_info.state == ompt_state_wait_barrier_implicit) {
+ (ompt_state == ompt_state_wait_barrier_teams ||
+ ompt_state == ompt_state_wait_barrier_implicit_parallel)) {
int ds_tid = this_thr->th.th_info.ds.ds_tid;
ompt_data_t *task_data = (team)
? OMPT_CUR_TASK_DATA(this_thr)
@@ -2506,15 +2526,16 @@ void __kmp_fork_barrier(int gtid, int tid) {
(ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait) ||
ompt_callbacks.ompt_callback(ompt_callback_sync_region)))
codeptr = team ? team->t.ompt_team_info.master_return_address : NULL;
+ ompt_sync_region_t sync_kind = ompt_sync_region_barrier_implicit_parallel;
+ if (this_thr->th.ompt_thread_info.parallel_flags & ompt_parallel_league)
+ sync_kind = ompt_sync_region_barrier_teams;
if (ompt_enabled.ompt_callback_sync_region_wait) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait)(
- ompt_sync_region_barrier_implicit, ompt_scope_end, NULL, task_data,
- codeptr);
+ sync_kind, ompt_scope_end, NULL, task_data, codeptr);
}
if (ompt_enabled.ompt_callback_sync_region) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region)(
- ompt_sync_region_barrier_implicit, ompt_scope_end, NULL, task_data,
- codeptr);
+ sync_kind, ompt_scope_end, NULL, task_data, codeptr);
}
#endif
if (!KMP_MASTER_TID(ds_tid) && ompt_enabled.ompt_callback_implicit_task) {
@@ -2582,7 +2603,7 @@ void __kmp_fork_barrier(int gtid, int tid) {
kmp_proc_bind_t proc_bind = team->t.t_proc_bind;
if (proc_bind == proc_bind_intel) {
// Call dynamic affinity settings
- if (__kmp_affinity_type == affinity_balanced && team->t.t_size_changed) {
+ if (__kmp_affinity.type == affinity_balanced && team->t.t_size_changed) {
__kmp_balanced_affinity(this_thr, team->t.t_nproc);
}
} else if (proc_bind != proc_bind_false) {
@@ -2591,7 +2612,7 @@ void __kmp_fork_barrier(int gtid, int tid) {
__kmp_gtid_from_thread(this_thr),
this_thr->th.th_current_place));
} else {
- __kmp_affinity_set_place(gtid);
+ __kmp_affinity_bind_place(gtid);
}
}
#endif // KMP_AFFINITY_SUPPORTED
@@ -2599,7 +2620,7 @@ void __kmp_fork_barrier(int gtid, int tid) {
if (__kmp_display_affinity) {
if (team->t.t_display_affinity
#if KMP_AFFINITY_SUPPORTED
- || (__kmp_affinity_type == affinity_balanced && team->t.t_size_changed)
+ || (__kmp_affinity.type == affinity_balanced && team->t.t_size_changed)
#endif
) {
// NULL means use the affinity-format-var ICV
diff --git a/contrib/libs/cxxsupp/openmp/kmp_barrier.h b/contrib/libs/cxxsupp/openmp/kmp_barrier.h
index ac28a13217e9..ae9b8d62f4c3 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_barrier.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_barrier.h
@@ -21,7 +21,10 @@
#define KMP_ALIGNED_ALLOCATE(size, alignment) _mm_malloc(size, alignment)
#define KMP_ALIGNED_FREE(ptr) _mm_free(ptr)
#elif KMP_HAVE_ALIGNED_ALLOC
-#define KMP_ALIGNED_ALLOCATE(size, alignment) aligned_alloc(alignment, size)
+#define KMP_ALGIN_UP(val, alignment) \
+ (((val) + (alignment)-1) / (alignment) * (alignment))
+#define KMP_ALIGNED_ALLOCATE(size, alignment) \
+ aligned_alloc(alignment, KMP_ALGIN_UP(size, alignment))
#define KMP_ALIGNED_FREE(ptr) free(ptr)
#elif KMP_HAVE_POSIX_MEMALIGN
static inline void *KMP_ALIGNED_ALLOCATE(size_t size, size_t alignment) {
diff --git a/contrib/libs/cxxsupp/openmp/kmp_collapse.cpp b/contrib/libs/cxxsupp/openmp/kmp_collapse.cpp
new file mode 100644
index 000000000000..f1bf04901dc7
--- /dev/null
+++ b/contrib/libs/cxxsupp/openmp/kmp_collapse.cpp
@@ -0,0 +1,1781 @@
+/*
+ * kmp_collapse.cpp -- loop collapse feature
+ */
+
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "kmp.h"
+#include "kmp_error.h"
+#include "kmp_i18n.h"
+#include "kmp_itt.h"
+#include "kmp_stats.h"
+#include "kmp_str.h"
+#include "kmp_collapse.h"
+
+#if OMPT_SUPPORT
+#include "ompt-specific.h"
+#endif
+
+// OMPTODO: different style of comments (see kmp_sched)
+// OMPTODO: OMPT/OMPD
+
+// avoid inadevertently using a library based abs
+template T __kmp_abs(const T val) {
+ return (val < 0) ? -val : val;
+}
+kmp_uint32 __kmp_abs(const kmp_uint32 val) { return val; }
+kmp_uint64 __kmp_abs(const kmp_uint64 val) { return val; }
+
+//----------------------------------------------------------------------------
+// Common functions for working with rectangular and non-rectangular loops
+//----------------------------------------------------------------------------
+
+template int __kmp_sign(T val) {
+ return (T(0) < val) - (val < T(0));
+}
+
+template class CollapseAllocator {
+ typedef T *pT;
+
+private:
+ static const size_t allocaSize = 32; // size limit for stack allocations
+ // (8 bytes x 4 nested loops)
+ char stackAlloc[allocaSize];
+ static constexpr size_t maxElemCount = allocaSize / sizeof(T);
+ pT pTAlloc;
+
+public:
+ CollapseAllocator(size_t n) : pTAlloc(reinterpret_cast(stackAlloc)) {
+ if (n > maxElemCount) {
+ pTAlloc = reinterpret_cast(__kmp_allocate(n * sizeof(T)));
+ }
+ }
+ ~CollapseAllocator() {
+ if (pTAlloc != reinterpret_cast(stackAlloc)) {
+ __kmp_free(pTAlloc);
+ }
+ }
+ T &operator[](int index) { return pTAlloc[index]; }
+ operator const pT() { return pTAlloc; }
+};
+
+//----------Loop canonicalization---------------------------------------------
+
+// For loop nest (any shape):
+// convert != to < or >;
+// switch from using < or > to <= or >=.
+// "bounds" array has to be allocated per thread.
+// All other internal functions will work only with canonicalized loops.
+template
+void kmp_canonicalize_one_loop_XX(
+ ident_t *loc,
+ /*in/out*/ bounds_infoXX_template *bounds) {
+
+ if (__kmp_env_consistency_check) {
+ if (bounds->step == 0) {
+ __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
+ loc);
+ }
+ }
+
+ if (bounds->comparison == comparison_t::comp_not_eq) {
+ // We can convert this to < or >, depends on the sign of the step:
+ if (bounds->step > 0) {
+ bounds->comparison = comparison_t::comp_less;
+ } else {
+ bounds->comparison = comparison_t::comp_greater;
+ }
+ }
+
+ if (bounds->comparison == comparison_t::comp_less) {
+ // Note: ub0 can be unsigned. Should be Ok to hit overflow here,
+ // because ub0 + ub1*j should be still positive (otherwise loop was not
+ // well formed)
+ bounds->ub0 -= 1;
+ bounds->comparison = comparison_t::comp_less_or_eq;
+ } else if (bounds->comparison == comparison_t::comp_greater) {
+ bounds->ub0 += 1;
+ bounds->comparison = comparison_t::comp_greater_or_eq;
+ }
+}
+
+// Canonicalize loop nest. original_bounds_nest is an array of length n.
+void kmp_canonicalize_loop_nest(ident_t *loc,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ kmp_index_t n) {
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(original_bounds_nest[ind]);
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ kmp_canonicalize_one_loop_XX(
+ loc,
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_uint32:
+ kmp_canonicalize_one_loop_XX(
+ loc,
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_int64:
+ kmp_canonicalize_one_loop_XX(
+ loc,
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_uint64:
+ kmp_canonicalize_one_loop_XX(
+ loc,
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+ }
+}
+
+//----------Calculating trip count on one level-------------------------------
+
+// Calculate trip count on this loop level.
+// We do this either for a rectangular loop nest,
+// or after an adjustment bringing the loops to a parallelepiped shape.
+// This number should not depend on the value of outer IV
+// even if the formular has lb1 and ub1.
+// Note: for non-rectangular loops don't use span for this, it's too big.
+
+template
+kmp_loop_nest_iv_t kmp_calculate_trip_count_XX(
+ /*in/out*/ bounds_infoXX_template *bounds) {
+
+ if (bounds->comparison == comparison_t::comp_less_or_eq) {
+ if (bounds->ub0 < bounds->lb0) {
+ // Note: after this we don't need to calculate inner loops,
+ // but that should be an edge case:
+ bounds->trip_count = 0;
+ } else {
+ // ub - lb may exceed signed type range; we need to cast to
+ // kmp_loop_nest_iv_t anyway
+ bounds->trip_count =
+ static_cast(bounds->ub0 - bounds->lb0) /
+ __kmp_abs(bounds->step) +
+ 1;
+ }
+ } else if (bounds->comparison == comparison_t::comp_greater_or_eq) {
+ if (bounds->lb0 < bounds->ub0) {
+ // Note: after this we don't need to calculate inner loops,
+ // but that should be an edge case:
+ bounds->trip_count = 0;
+ } else {
+ // lb - ub may exceed signed type range; we need to cast to
+ // kmp_loop_nest_iv_t anyway
+ bounds->trip_count =
+ static_cast(bounds->lb0 - bounds->ub0) /
+ __kmp_abs(bounds->step) +
+ 1;
+ }
+ } else {
+ KMP_ASSERT(false);
+ }
+ return bounds->trip_count;
+}
+
+// Calculate trip count on this loop level.
+kmp_loop_nest_iv_t kmp_calculate_trip_count(/*in/out*/ bounds_info_t *bounds) {
+
+ kmp_loop_nest_iv_t trip_count = 0;
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ trip_count = kmp_calculate_trip_count_XX(
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_uint32:
+ trip_count = kmp_calculate_trip_count_XX(
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_int64:
+ trip_count = kmp_calculate_trip_count_XX(
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ case loop_type_t::loop_type_uint64:
+ trip_count = kmp_calculate_trip_count_XX(
+ /*in/out*/ (bounds_infoXX_template *)(bounds));
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+
+ return trip_count;
+}
+
+//----------Trim original iv according to its type----------------------------
+
+// Trim original iv according to its type.
+// Return kmp_uint64 value which can be easily used in all internal calculations
+// And can be statically cast back to original type in user code.
+kmp_uint64 kmp_fix_iv(loop_type_t loop_iv_type, kmp_uint64 original_iv) {
+ kmp_uint64 res = 0;
+
+ switch (loop_iv_type) {
+ case loop_type_t::loop_type_int8:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_uint8:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_int16:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_uint16:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_int32:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_uint32:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_int64:
+ res = static_cast(static_cast(original_iv));
+ break;
+ case loop_type_t::loop_type_uint64:
+ res = static_cast(original_iv);
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+
+ return res;
+}
+
+//----------Compare two IVs (remember they have a type)-----------------------
+
+bool kmp_ivs_eq(loop_type_t loop_iv_type, kmp_uint64 original_iv1,
+ kmp_uint64 original_iv2) {
+ bool res = false;
+
+ switch (loop_iv_type) {
+ case loop_type_t::loop_type_int8:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_uint8:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_int16:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_uint16:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_int32:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_uint32:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_int64:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ case loop_type_t::loop_type_uint64:
+ res = static_cast(original_iv1) ==
+ static_cast(original_iv2);
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+
+ return res;
+}
+
+//----------Calculate original iv on one level--------------------------------
+
+// Return true if the point fits into upper bounds on this level,
+// false otherwise
+template
+bool kmp_iv_is_in_upper_bound_XX(const bounds_infoXX_template *bounds,
+ const kmp_point_t original_ivs,
+ kmp_index_t ind) {
+
+ T iv = static_cast(original_ivs[ind]);
+ T outer_iv = static_cast(original_ivs[bounds->outer_iv]);
+
+ if (((bounds->comparison == comparison_t::comp_less_or_eq) &&
+ (iv > (bounds->ub0 + bounds->ub1 * outer_iv))) ||
+ ((bounds->comparison == comparison_t::comp_greater_or_eq) &&
+ (iv < (bounds->ub0 + bounds->ub1 * outer_iv)))) {
+ // The calculated point is outside of loop upper boundary:
+ return false;
+ }
+
+ return true;
+}
+
+// Calculate one iv corresponding to iteration on the level ind.
+// Return true if it fits into lower-upper bounds on this level
+// (if not, we need to re-calculate)
+template
+bool kmp_calc_one_iv_XX(const bounds_infoXX_template *bounds,
+ /*in/out*/ kmp_point_t original_ivs,
+ const kmp_iterations_t iterations, kmp_index_t ind,
+ bool start_with_lower_bound, bool checkBounds) {
+
+ kmp_uint64 temp = 0;
+ T outer_iv = static_cast(original_ivs[bounds->outer_iv]);
+
+ if (start_with_lower_bound) {
+ // we moved to the next iteration on one of outer loops, should start
+ // with the lower bound here:
+ temp = bounds->lb0 + bounds->lb1 * outer_iv;
+ } else {
+ auto iteration = iterations[ind];
+ temp = bounds->lb0 + bounds->lb1 * outer_iv + iteration * bounds->step;
+ }
+
+ // Now trim original iv according to its type:
+ original_ivs[ind] = kmp_fix_iv(bounds->loop_iv_type, temp);
+
+ if (checkBounds) {
+ return kmp_iv_is_in_upper_bound_XX(bounds, original_ivs, ind);
+ } else {
+ return true;
+ }
+}
+
+bool kmp_calc_one_iv(const bounds_info_t *bounds,
+ /*in/out*/ kmp_point_t original_ivs,
+ const kmp_iterations_t iterations, kmp_index_t ind,
+ bool start_with_lower_bound, bool checkBounds) {
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ return kmp_calc_one_iv_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind, start_with_lower_bound,
+ checkBounds);
+ break;
+ case loop_type_t::loop_type_uint32:
+ return kmp_calc_one_iv_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind, start_with_lower_bound,
+ checkBounds);
+ break;
+ case loop_type_t::loop_type_int64:
+ return kmp_calc_one_iv_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind, start_with_lower_bound,
+ checkBounds);
+ break;
+ case loop_type_t::loop_type_uint64:
+ return kmp_calc_one_iv_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind, start_with_lower_bound,
+ checkBounds);
+ break;
+ default:
+ KMP_ASSERT(false);
+ return false;
+ }
+}
+
+//----------Calculate original iv on one level for rectangular loop nest------
+
+// Calculate one iv corresponding to iteration on the level ind.
+// Return true if it fits into lower-upper bounds on this level
+// (if not, we need to re-calculate)
+template
+void kmp_calc_one_iv_rectang_XX(const bounds_infoXX_template *bounds,
+ /*in/out*/ kmp_uint64 *original_ivs,
+ const kmp_iterations_t iterations,
+ kmp_index_t ind) {
+
+ auto iteration = iterations[ind];
+
+ kmp_uint64 temp =
+ bounds->lb0 +
+ bounds->lb1 * static_cast(original_ivs[bounds->outer_iv]) +
+ iteration * bounds->step;
+
+ // Now trim original iv according to its type:
+ original_ivs[ind] = kmp_fix_iv(bounds->loop_iv_type, temp);
+}
+
+void kmp_calc_one_iv_rectang(const bounds_info_t *bounds,
+ /*in/out*/ kmp_uint64 *original_ivs,
+ const kmp_iterations_t iterations,
+ kmp_index_t ind) {
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ kmp_calc_one_iv_rectang_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind);
+ break;
+ case loop_type_t::loop_type_uint32:
+ kmp_calc_one_iv_rectang_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind);
+ break;
+ case loop_type_t::loop_type_int64:
+ kmp_calc_one_iv_rectang_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind);
+ break;
+ case loop_type_t::loop_type_uint64:
+ kmp_calc_one_iv_rectang_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, iterations, ind);
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Rectangular loop nest
+//----------------------------------------------------------------------------
+
+//----------Canonicalize loop nest and calculate trip count-------------------
+
+// Canonicalize loop nest and calculate overall trip count.
+// "bounds_nest" has to be allocated per thread.
+// API will modify original bounds_nest array to bring it to a canonical form
+// (only <= and >=, no !=, <, >). If the original loop nest was already in a
+// canonical form there will be no changes to bounds in bounds_nest array
+// (only trip counts will be calculated).
+// Returns trip count of overall space.
+extern "C" kmp_loop_nest_iv_t
+__kmpc_process_loop_nest_rectang(ident_t *loc, kmp_int32 gtid,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ kmp_index_t n) {
+
+ kmp_canonicalize_loop_nest(loc, /*in/out*/ original_bounds_nest, n);
+
+ kmp_loop_nest_iv_t total = 1;
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(original_bounds_nest[ind]);
+
+ kmp_loop_nest_iv_t trip_count = kmp_calculate_trip_count(/*in/out*/ bounds);
+ total *= trip_count;
+ }
+
+ return total;
+}
+
+//----------Calculate old induction variables---------------------------------
+
+// Calculate old induction variables corresponding to overall new_iv.
+// Note: original IV will be returned as if it had kmp_uint64 type,
+// will have to be converted to original type in user code.
+// Note: trip counts should be already calculated by
+// __kmpc_process_loop_nest_rectang.
+// OMPTODO: special case 2, 3 nested loops: either do different
+// interface without array or possibly template this over n
+extern "C" void
+__kmpc_calc_original_ivs_rectang(ident_t *loc, kmp_loop_nest_iv_t new_iv,
+ const bounds_info_t *original_bounds_nest,
+ /*out*/ kmp_uint64 *original_ivs,
+ kmp_index_t n) {
+
+ CollapseAllocator iterations(n);
+
+ // First, calc corresponding iteration in every original loop:
+ for (kmp_index_t ind = n; ind > 0;) {
+ --ind;
+ auto bounds = &(original_bounds_nest[ind]);
+
+ // should be optimized to OPDIVREM:
+ auto temp = new_iv / bounds->trip_count;
+ auto iteration = new_iv % bounds->trip_count;
+ new_iv = temp;
+
+ iterations[ind] = iteration;
+ }
+ KMP_ASSERT(new_iv == 0);
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(original_bounds_nest[ind]);
+
+ kmp_calc_one_iv_rectang(bounds, /*in/out*/ original_ivs, iterations, ind);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Non-rectangular loop nest
+//----------------------------------------------------------------------------
+
+//----------Calculate maximum possible span of iv values on one level---------
+
+// Calculate span for IV on this loop level for "<=" case.
+// Note: it's for <= on this loop nest level, so lower bound should be smallest
+// value, upper bound should be the biggest value. If the loop won't execute,
+// 'smallest' may be bigger than 'biggest', but we'd better not switch them
+// around.
+template
+void kmp_calc_span_lessoreq_XX(
+ /* in/out*/ bounds_info_internalXX_template *bounds,
+ /* in/out*/ bounds_info_internal_t *bounds_nest) {
+
+ typedef typename traits_t::unsigned_t UT;
+ // typedef typename traits_t::signed_t ST;
+
+ // typedef typename big_span_t span_t;
+ typedef T span_t;
+
+ auto &bbounds = bounds->b;
+
+ if ((bbounds.lb1 != 0) || (bbounds.ub1 != 0)) {
+ // This dimention depends on one of previous ones; can't be the outermost
+ // one.
+ bounds_info_internalXX_template *previous =
+ reinterpret_cast *>(
+ &(bounds_nest[bbounds.outer_iv]));
+
+ // OMPTODO: assert that T is compatible with loop variable type on
+ // 'previous' loop
+
+ {
+ span_t bound_candidate1 =
+ bbounds.lb0 + bbounds.lb1 * previous->span_smallest;
+ span_t bound_candidate2 =
+ bbounds.lb0 + bbounds.lb1 * previous->span_biggest;
+ if (bound_candidate1 < bound_candidate2) {
+ bounds->span_smallest = bound_candidate1;
+ } else {
+ bounds->span_smallest = bound_candidate2;
+ }
+ }
+
+ {
+ // We can't adjust the upper bound with respect to step, because
+ // lower bound might be off after adjustments
+
+ span_t bound_candidate1 =
+ bbounds.ub0 + bbounds.ub1 * previous->span_smallest;
+ span_t bound_candidate2 =
+ bbounds.ub0 + bbounds.ub1 * previous->span_biggest;
+ if (bound_candidate1 < bound_candidate2) {
+ bounds->span_biggest = bound_candidate2;
+ } else {
+ bounds->span_biggest = bound_candidate1;
+ }
+ }
+ } else {
+ // Rectangular:
+ bounds->span_smallest = bbounds.lb0;
+ bounds->span_biggest = bbounds.ub0;
+ }
+ if (!bounds->loop_bounds_adjusted) {
+ // Here it's safe to reduce the space to the multiply of step.
+ // OMPTODO: check if the formular is correct.
+ // Also check if it would be safe to do this if we didn't adjust left side.
+ bounds->span_biggest -=
+ (static_cast(bbounds.ub0 - bbounds.lb0)) % bbounds.step; // abs?
+ }
+}
+
+// Calculate span for IV on this loop level for ">=" case.
+template
+void kmp_calc_span_greateroreq_XX(
+ /* in/out*/ bounds_info_internalXX_template *bounds,
+ /* in/out*/ bounds_info_internal_t *bounds_nest) {
+
+ typedef typename traits_t::unsigned_t UT;
+ // typedef typename traits_t::signed_t ST;
+
+ // typedef typename big_span_t span_t;
+ typedef T span_t;
+
+ auto &bbounds = bounds->b;
+
+ if ((bbounds.lb1 != 0) || (bbounds.ub1 != 0)) {
+ // This dimention depends on one of previous ones; can't be the outermost
+ // one.
+ bounds_info_internalXX_template *previous =
+ reinterpret_cast *>(
+ &(bounds_nest[bbounds.outer_iv]));
+
+ // OMPTODO: assert that T is compatible with loop variable type on
+ // 'previous' loop
+
+ {
+ span_t bound_candidate1 =
+ bbounds.lb0 + bbounds.lb1 * previous->span_smallest;
+ span_t bound_candidate2 =
+ bbounds.lb0 + bbounds.lb1 * previous->span_biggest;
+ if (bound_candidate1 >= bound_candidate2) {
+ bounds->span_smallest = bound_candidate1;
+ } else {
+ bounds->span_smallest = bound_candidate2;
+ }
+ }
+
+ {
+ // We can't adjust the upper bound with respect to step, because
+ // lower bound might be off after adjustments
+
+ span_t bound_candidate1 =
+ bbounds.ub0 + bbounds.ub1 * previous->span_smallest;
+ span_t bound_candidate2 =
+ bbounds.ub0 + bbounds.ub1 * previous->span_biggest;
+ if (bound_candidate1 >= bound_candidate2) {
+ bounds->span_biggest = bound_candidate2;
+ } else {
+ bounds->span_biggest = bound_candidate1;
+ }
+ }
+
+ } else {
+ // Rectangular:
+ bounds->span_biggest = bbounds.lb0;
+ bounds->span_smallest = bbounds.ub0;
+ }
+ if (!bounds->loop_bounds_adjusted) {
+ // Here it's safe to reduce the space to the multiply of step.
+ // OMPTODO: check if the formular is correct.
+ // Also check if it would be safe to do this if we didn't adjust left side.
+ bounds->span_biggest -=
+ (static_cast(bbounds.ub0 - bbounds.lb0)) % bbounds.step; // abs?
+ }
+}
+
+// Calculate maximum possible span for IV on this loop level.
+template
+void kmp_calc_span_XX(
+ /* in/out*/ bounds_info_internalXX_template *bounds,
+ /* in/out*/ bounds_info_internal_t *bounds_nest) {
+
+ if (bounds->b.comparison == comparison_t::comp_less_or_eq) {
+ kmp_calc_span_lessoreq_XX(/* in/out*/ bounds, /* in/out*/ bounds_nest);
+ } else {
+ KMP_ASSERT(bounds->b.comparison == comparison_t::comp_greater_or_eq);
+ kmp_calc_span_greateroreq_XX(/* in/out*/ bounds, /* in/out*/ bounds_nest);
+ }
+}
+
+//----------All initial processing of the loop nest---------------------------
+
+// Calculate new bounds for this loop level.
+// To be able to work with the nest we need to get it to a parallelepiped shape.
+// We need to stay in the original range of values, so that there will be no
+// overflow, for that we'll adjust both upper and lower bounds as needed.
+template
+void kmp_calc_new_bounds_XX(
+ /* in/out*/ bounds_info_internalXX_template *bounds,
+ /* in/out*/ bounds_info_internal_t *bounds_nest) {
+
+ auto &bbounds = bounds->b;
+
+ if (bbounds.lb1 == bbounds.ub1) {
+ // Already parallel, no need to adjust:
+ bounds->loop_bounds_adjusted = false;
+ } else {
+ bounds->loop_bounds_adjusted = true;
+
+ T old_lb1 = bbounds.lb1;
+ T old_ub1 = bbounds.ub1;
+
+ if (__kmp_sign(old_lb1) != __kmp_sign(old_ub1)) {
+ // With this shape we can adjust to a rectangle:
+ bbounds.lb1 = 0;
+ bbounds.ub1 = 0;
+ } else {
+ // get upper and lower bounds to be parallel
+ // with values in the old range.
+ // Note: abs didn't work here.
+ if (((old_lb1 < 0) && (old_lb1 < old_ub1)) ||
+ ((old_lb1 > 0) && (old_lb1 > old_ub1))) {
+ bbounds.lb1 = old_ub1;
+ } else {
+ bbounds.ub1 = old_lb1;
+ }
+ }
+
+ // Now need to adjust lb0, ub0, otherwise in some cases space will shrink.
+ // The idea here that for this IV we are now getting the same span
+ // irrespective of the previous IV value.
+ bounds_info_internalXX_template *previous =
+ reinterpret_cast *>(
+ &bounds_nest[bbounds.outer_iv]);
+
+ if (bbounds.comparison == comparison_t::comp_less_or_eq) {
+ if (old_lb1 < bbounds.lb1) {
+ KMP_ASSERT(old_lb1 < 0);
+ // The length is good on outer_iv biggest number,
+ // can use it to find where to move the lower bound:
+
+ T sub = (bbounds.lb1 - old_lb1) * previous->span_biggest;
+ bbounds.lb0 -= sub; // OMPTODO: what if it'll go out of unsigned space?
+ // e.g. it was 0?? (same below)
+ } else if (old_lb1 > bbounds.lb1) {
+ // still need to move lower bound:
+ T add = (old_lb1 - bbounds.lb1) * previous->span_smallest;
+ bbounds.lb0 += add;
+ }
+
+ if (old_ub1 > bbounds.ub1) {
+ KMP_ASSERT(old_ub1 > 0);
+ // The length is good on outer_iv biggest number,
+ // can use it to find where to move upper bound:
+
+ T add = (old_ub1 - bbounds.ub1) * previous->span_biggest;
+ bbounds.ub0 += add;
+ } else if (old_ub1 < bbounds.ub1) {
+ // still need to move upper bound:
+ T sub = (bbounds.ub1 - old_ub1) * previous->span_smallest;
+ bbounds.ub0 -= sub;
+ }
+ } else {
+ KMP_ASSERT(bbounds.comparison == comparison_t::comp_greater_or_eq);
+ if (old_lb1 < bbounds.lb1) {
+ KMP_ASSERT(old_lb1 < 0);
+ T sub = (bbounds.lb1 - old_lb1) * previous->span_smallest;
+ bbounds.lb0 -= sub;
+ } else if (old_lb1 > bbounds.lb1) {
+ T add = (old_lb1 - bbounds.lb1) * previous->span_biggest;
+ bbounds.lb0 += add;
+ }
+
+ if (old_ub1 > bbounds.ub1) {
+ KMP_ASSERT(old_ub1 > 0);
+ T add = (old_ub1 - bbounds.ub1) * previous->span_smallest;
+ bbounds.ub0 += add;
+ } else if (old_ub1 < bbounds.ub1) {
+ T sub = (bbounds.ub1 - old_ub1) * previous->span_biggest;
+ bbounds.ub0 -= sub;
+ }
+ }
+ }
+}
+
+// Do all processing for one canonicalized loop in the nest
+// (assuming that outer loops already were processed):
+template
+kmp_loop_nest_iv_t kmp_process_one_loop_XX(
+ /* in/out*/ bounds_info_internalXX_template *bounds,
+ /*in/out*/ bounds_info_internal_t *bounds_nest) {
+
+ kmp_calc_new_bounds_XX(/* in/out*/ bounds, /* in/out*/ bounds_nest);
+ kmp_calc_span_XX(/* in/out*/ bounds, /* in/out*/ bounds_nest);
+ return kmp_calculate_trip_count_XX(/*in/out*/ &(bounds->b));
+}
+
+// Non-rectangular loop nest, canonicalized to use <= or >=.
+// Process loop nest to have a parallelepiped shape,
+// calculate biggest spans for IV's on all levels and calculate overall trip
+// count. "bounds_nest" has to be allocated per thread.
+// Returns overall trip count (for adjusted space).
+kmp_loop_nest_iv_t kmp_process_loop_nest(
+ /*in/out*/ bounds_info_internal_t *bounds_nest, kmp_index_t n) {
+
+ kmp_loop_nest_iv_t total = 1;
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(bounds_nest[ind]);
+ kmp_loop_nest_iv_t trip_count = 0;
+
+ switch (bounds->b.loop_type) {
+ case loop_type_t::loop_type_int32:
+ trip_count = kmp_process_one_loop_XX(
+ /*in/out*/ (bounds_info_internalXX_template *)(bounds),
+ /*in/out*/ bounds_nest);
+ break;
+ case loop_type_t::loop_type_uint32:
+ trip_count = kmp_process_one_loop_XX(
+ /*in/out*/ (bounds_info_internalXX_template *)(bounds),
+ /*in/out*/ bounds_nest);
+ break;
+ case loop_type_t::loop_type_int64:
+ trip_count = kmp_process_one_loop_XX(
+ /*in/out*/ (bounds_info_internalXX_template *)(bounds),
+ /*in/out*/ bounds_nest);
+ break;
+ case loop_type_t::loop_type_uint64:
+ trip_count = kmp_process_one_loop_XX(
+ /*in/out*/ (bounds_info_internalXX_template *)(bounds),
+ /*in/out*/ bounds_nest);
+ break;
+ default:
+ KMP_ASSERT(false);
+ }
+ total *= trip_count;
+ }
+
+ return total;
+}
+
+//----------Calculate iterations (in the original or updated space)-----------
+
+// Calculate number of iterations in original or updated space resulting in
+// original_ivs[ind] (only on this level, non-negative)
+// (not counting initial iteration)
+template
+kmp_loop_nest_iv_t
+kmp_calc_number_of_iterations_XX(const bounds_infoXX_template *bounds,
+ const kmp_point_t original_ivs,
+ kmp_index_t ind) {
+
+ kmp_loop_nest_iv_t iterations = 0;
+
+ if (bounds->comparison == comparison_t::comp_less_or_eq) {
+ iterations =
+ (static_cast(original_ivs[ind]) - bounds->lb0 -
+ bounds->lb1 * static_cast(original_ivs[bounds->outer_iv])) /
+ __kmp_abs(bounds->step);
+ } else {
+ KMP_DEBUG_ASSERT(bounds->comparison == comparison_t::comp_greater_or_eq);
+ iterations = (bounds->lb0 +
+ bounds->lb1 * static_cast(original_ivs[bounds->outer_iv]) -
+ static_cast(original_ivs[ind])) /
+ __kmp_abs(bounds->step);
+ }
+
+ return iterations;
+}
+
+// Calculate number of iterations in the original or updated space resulting in
+// original_ivs[ind] (only on this level, non-negative)
+kmp_loop_nest_iv_t kmp_calc_number_of_iterations(const bounds_info_t *bounds,
+ const kmp_point_t original_ivs,
+ kmp_index_t ind) {
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ return kmp_calc_number_of_iterations_XX(
+ (bounds_infoXX_template *)(bounds), original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_uint32:
+ return kmp_calc_number_of_iterations_XX(
+ (bounds_infoXX_template *)(bounds), original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_int64:
+ return kmp_calc_number_of_iterations_XX(
+ (bounds_infoXX_template *)(bounds), original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_uint64:
+ return kmp_calc_number_of_iterations_XX(
+ (bounds_infoXX_template *)(bounds), original_ivs, ind);
+ break;
+ default:
+ KMP_ASSERT(false);
+ return 0;
+ }
+}
+
+//----------Calculate new iv corresponding to original ivs--------------------
+
+// We got a point in the original loop nest.
+// Take updated bounds and calculate what new_iv will correspond to this point.
+// When we are getting original IVs from new_iv, we have to adjust to fit into
+// original loops bounds. Getting new_iv for the adjusted original IVs will help
+// with making more chunks non-empty.
+kmp_loop_nest_iv_t
+kmp_calc_new_iv_from_original_ivs(const bounds_info_internal_t *bounds_nest,
+ const kmp_point_t original_ivs,
+ kmp_index_t n) {
+
+ kmp_loop_nest_iv_t new_iv = 0;
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(bounds_nest[ind].b);
+
+ new_iv = new_iv * bounds->trip_count +
+ kmp_calc_number_of_iterations(bounds, original_ivs, ind);
+ }
+
+ return new_iv;
+}
+
+//----------Calculate original ivs for provided iterations--------------------
+
+// Calculate original IVs for provided iterations, assuming iterations are
+// calculated in the original space.
+// Loop nest is in canonical form (with <= / >=).
+bool kmp_calc_original_ivs_from_iterations(
+ const bounds_info_t *original_bounds_nest, kmp_index_t n,
+ /*in/out*/ kmp_point_t original_ivs,
+ /*in/out*/ kmp_iterations_t iterations, kmp_index_t ind) {
+
+ kmp_index_t lengthened_ind = n;
+
+ for (; ind < n;) {
+ auto bounds = &(original_bounds_nest[ind]);
+ bool good = kmp_calc_one_iv(bounds, /*in/out*/ original_ivs, iterations,
+ ind, (lengthened_ind < ind), true);
+
+ if (!good) {
+ // The calculated iv value is too big (or too small for >=):
+ if (ind == 0) {
+ // Space is empty:
+ return false;
+ } else {
+ // Go to next iteration on the outer loop:
+ --ind;
+ ++iterations[ind];
+ lengthened_ind = ind;
+ for (kmp_index_t i = ind + 1; i < n; ++i) {
+ iterations[i] = 0;
+ }
+ continue;
+ }
+ }
+ ++ind;
+ }
+
+ return true;
+}
+
+//----------Calculate original ivs for the beginning of the loop nest---------
+
+// Calculate IVs for the beginning of the loop nest.
+// Note: lower bounds of all loops may not work -
+// if on some of the iterations of the outer loops inner loops are empty.
+// Loop nest is in canonical form (with <= / >=).
+bool kmp_calc_original_ivs_for_start(const bounds_info_t *original_bounds_nest,
+ kmp_index_t n,
+ /*out*/ kmp_point_t original_ivs) {
+
+ // Iterations in the original space, multiplied by step:
+ CollapseAllocator iterations(n);
+ for (kmp_index_t ind = n; ind > 0;) {
+ --ind;
+ iterations[ind] = 0;
+ }
+
+ // Now calculate the point:
+ bool b = kmp_calc_original_ivs_from_iterations(original_bounds_nest, n,
+ /*in/out*/ original_ivs,
+ /*in/out*/ iterations, 0);
+ return b;
+}
+
+//----------Calculate next point in the original loop space-------------------
+
+// From current set of original IVs calculate next point.
+// Return false if there is no next point in the loop bounds.
+bool kmp_calc_next_original_ivs(const bounds_info_t *original_bounds_nest,
+ kmp_index_t n, const kmp_point_t original_ivs,
+ /*out*/ kmp_point_t next_original_ivs) {
+ // Iterations in the original space, multiplied by step (so can be negative):
+ CollapseAllocator iterations(n);
+ // First, calc corresponding iteration in every original loop:
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(original_bounds_nest[ind]);
+ iterations[ind] = kmp_calc_number_of_iterations(bounds, original_ivs, ind);
+ }
+
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ next_original_ivs[ind] = original_ivs[ind];
+ }
+
+ // Next add one step to the iterations on the inner-most level, and see if we
+ // need to move up the nest:
+ kmp_index_t ind = n - 1;
+ ++iterations[ind];
+
+ bool b = kmp_calc_original_ivs_from_iterations(
+ original_bounds_nest, n, /*in/out*/ next_original_ivs, iterations, ind);
+
+ return b;
+}
+
+//----------Calculate chunk end in the original loop space--------------------
+
+// For one level calculate old induction variable corresponding to overall
+// new_iv for the chunk end.
+// Return true if it fits into upper bound on this level
+// (if not, we need to re-calculate)
+template
+bool kmp_calc_one_iv_for_chunk_end_XX(
+ const bounds_infoXX_template *bounds,
+ const bounds_infoXX_template *updated_bounds,
+ /*in/out*/ kmp_point_t original_ivs, const kmp_iterations_t iterations,
+ kmp_index_t ind, bool start_with_lower_bound, bool compare_with_start,
+ const kmp_point_t original_ivs_start) {
+
+ // typedef std::conditional::value, kmp_int64, kmp_uint64>
+ // big_span_t;
+
+ // OMPTODO: is it good enough, or do we need ST or do we need big_span_t?
+ T temp = 0;
+
+ T outer_iv = static_cast(original_ivs[bounds->outer_iv]);
+
+ if (start_with_lower_bound) {
+ // we moved to the next iteration on one of outer loops, may as well use
+ // the lower bound here:
+ temp = bounds->lb0 + bounds->lb1 * outer_iv;
+ } else {
+ // Start in expanded space, but:
+ // - we need to hit original space lower bound, so need to account for
+ // that
+ // - we have to go into original space, even if that means adding more
+ // iterations than was planned
+ // - we have to go past (or equal to) previous point (which is the chunk
+ // starting point)
+
+ auto iteration = iterations[ind];
+
+ auto step = bounds->step;
+
+ // In case of >= it's negative:
+ auto accountForStep =
+ ((bounds->lb0 + bounds->lb1 * outer_iv) -
+ (updated_bounds->lb0 + updated_bounds->lb1 * outer_iv)) %
+ step;
+
+ temp = updated_bounds->lb0 + updated_bounds->lb1 * outer_iv +
+ accountForStep + iteration * step;
+
+ if (((bounds->comparison == comparison_t::comp_less_or_eq) &&
+ (temp < (bounds->lb0 + bounds->lb1 * outer_iv))) ||
+ ((bounds->comparison == comparison_t::comp_greater_or_eq) &&
+ (temp > (bounds->lb0 + bounds->lb1 * outer_iv)))) {
+ // Too small (or too big), didn't reach the original lower bound. Use
+ // heuristic:
+ temp = bounds->lb0 + bounds->lb1 * outer_iv + iteration / 2 * step;
+ }
+
+ if (compare_with_start) {
+
+ T start = static_cast(original_ivs_start[ind]);
+
+ temp = kmp_fix_iv(bounds->loop_iv_type, temp);
+
+ // On all previous levels start of the chunk is same as the end, need to
+ // be really careful here:
+ if (((bounds->comparison == comparison_t::comp_less_or_eq) &&
+ (temp < start)) ||
+ ((bounds->comparison == comparison_t::comp_greater_or_eq) &&
+ (temp > start))) {
+ // End of the chunk can't be smaller (for >= bigger) than it's start.
+ // Use heuristic:
+ temp = start + iteration / 4 * step;
+ }
+ }
+ }
+
+ original_ivs[ind] = temp = kmp_fix_iv(bounds->loop_iv_type, temp);
+
+ if (((bounds->comparison == comparison_t::comp_less_or_eq) &&
+ (temp > (bounds->ub0 + bounds->ub1 * outer_iv))) ||
+ ((bounds->comparison == comparison_t::comp_greater_or_eq) &&
+ (temp < (bounds->ub0 + bounds->ub1 * outer_iv)))) {
+ // Too big (or too small for >=).
+ return false;
+ }
+
+ return true;
+}
+
+// For one level calculate old induction variable corresponding to overall
+// new_iv for the chunk end.
+bool kmp_calc_one_iv_for_chunk_end(const bounds_info_t *bounds,
+ const bounds_info_t *updated_bounds,
+ /*in/out*/ kmp_point_t original_ivs,
+ const kmp_iterations_t iterations,
+ kmp_index_t ind, bool start_with_lower_bound,
+ bool compare_with_start,
+ const kmp_point_t original_ivs_start) {
+
+ switch (bounds->loop_type) {
+ case loop_type_t::loop_type_int32:
+ return kmp_calc_one_iv_for_chunk_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ (bounds_infoXX_template *)(updated_bounds),
+ /*in/out*/
+ original_ivs, iterations, ind, start_with_lower_bound,
+ compare_with_start, original_ivs_start);
+ break;
+ case loop_type_t::loop_type_uint32:
+ return kmp_calc_one_iv_for_chunk_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ (bounds_infoXX_template *)(updated_bounds),
+ /*in/out*/
+ original_ivs, iterations, ind, start_with_lower_bound,
+ compare_with_start, original_ivs_start);
+ break;
+ case loop_type_t::loop_type_int64:
+ return kmp_calc_one_iv_for_chunk_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ (bounds_infoXX_template *)(updated_bounds),
+ /*in/out*/
+ original_ivs, iterations, ind, start_with_lower_bound,
+ compare_with_start, original_ivs_start);
+ break;
+ case loop_type_t::loop_type_uint64:
+ return kmp_calc_one_iv_for_chunk_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ (bounds_infoXX_template *)(updated_bounds),
+ /*in/out*/
+ original_ivs, iterations, ind, start_with_lower_bound,
+ compare_with_start, original_ivs_start);
+ break;
+ default:
+ KMP_ASSERT(false);
+ return false;
+ }
+}
+
+// Calculate old induction variables corresponding to overall new_iv for the
+// chunk end. If due to space extension we are getting old IVs outside of the
+// boundaries, bring them into the boundaries. Need to do this in the runtime,
+// esp. on the lower bounds side. When getting result need to make sure that the
+// new chunk starts at next position to old chunk, not overlaps with it (this is
+// done elsewhere), and need to make sure end of the chunk is further than the
+// beginning of the chunk. We don't need an exact ending point here, just
+// something more-or-less close to the desired chunk length, bigger is fine
+// (smaller would be fine, but we risk going into infinite loop, so do smaller
+// only at the very end of the space). result: false if could not find the
+// ending point in the original loop space. In this case the caller can use
+// original upper bounds as the end of the chunk. Chunk won't be empty, because
+// it'll have at least the starting point, which is by construction in the
+// original space.
+bool kmp_calc_original_ivs_for_chunk_end(
+ const bounds_info_t *original_bounds_nest, kmp_index_t n,
+ const bounds_info_internal_t *updated_bounds_nest,
+ const kmp_point_t original_ivs_start, kmp_loop_nest_iv_t new_iv,
+ /*out*/ kmp_point_t original_ivs) {
+
+ // Iterations in the expanded space:
+ CollapseAllocator iterations(n);
+ // First, calc corresponding iteration in every modified loop:
+ for (kmp_index_t ind = n; ind > 0;) {
+ --ind;
+ auto &updated_bounds = updated_bounds_nest[ind];
+
+ // should be optimized to OPDIVREM:
+ auto new_ind = new_iv / updated_bounds.b.trip_count;
+ auto iteration = new_iv % updated_bounds.b.trip_count;
+
+ new_iv = new_ind;
+ iterations[ind] = iteration;
+ }
+ KMP_DEBUG_ASSERT(new_iv == 0);
+
+ kmp_index_t lengthened_ind = n;
+ kmp_index_t equal_ind = -1;
+
+ // Next calculate the point, but in original loop nest.
+ for (kmp_index_t ind = 0; ind < n;) {
+ auto bounds = &(original_bounds_nest[ind]);
+ auto updated_bounds = &(updated_bounds_nest[ind].b);
+
+ bool good = kmp_calc_one_iv_for_chunk_end(
+ bounds, updated_bounds,
+ /*in/out*/ original_ivs, iterations, ind, (lengthened_ind < ind),
+ (equal_ind >= ind - 1), original_ivs_start);
+
+ if (!good) {
+ // Too big (or too small for >=).
+ if (ind == 0) {
+ // Need to reduce to the end.
+ return false;
+ } else {
+ // Go to next iteration on outer loop:
+ --ind;
+ ++(iterations[ind]);
+ lengthened_ind = ind;
+ if (equal_ind >= lengthened_ind) {
+ // We've changed the number of iterations here,
+ // can't be same anymore:
+ equal_ind = lengthened_ind - 1;
+ }
+ for (kmp_index_t i = ind + 1; i < n; ++i) {
+ iterations[i] = 0;
+ }
+ continue;
+ }
+ }
+
+ if ((equal_ind == ind - 1) &&
+ (kmp_ivs_eq(bounds->loop_iv_type, original_ivs[ind],
+ original_ivs_start[ind]))) {
+ equal_ind = ind;
+ } else if ((equal_ind > ind - 1) &&
+ !(kmp_ivs_eq(bounds->loop_iv_type, original_ivs[ind],
+ original_ivs_start[ind]))) {
+ equal_ind = ind - 1;
+ }
+ ++ind;
+ }
+
+ return true;
+}
+
+//----------Calculate upper bounds for the last chunk-------------------------
+
+// Calculate one upper bound for the end.
+template
+void kmp_calc_one_iv_end_XX(const bounds_infoXX_template *bounds,
+ /*in/out*/ kmp_point_t original_ivs,
+ kmp_index_t ind) {
+
+ T temp = bounds->ub0 +
+ bounds->ub1 * static_cast(original_ivs[bounds->outer_iv]);
+
+ original_ivs[ind] = kmp_fix_iv(bounds->loop_iv_type, temp);
+}
+
+void kmp_calc_one_iv_end(const bounds_info_t *bounds,
+ /*in/out*/ kmp_point_t original_ivs, kmp_index_t ind) {
+
+ switch (bounds->loop_type) {
+ default:
+ KMP_ASSERT(false);
+ break;
+ case loop_type_t::loop_type_int32:
+ kmp_calc_one_iv_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_uint32:
+ kmp_calc_one_iv_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_int64:
+ kmp_calc_one_iv_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, ind);
+ break;
+ case loop_type_t::loop_type_uint64:
+ kmp_calc_one_iv_end_XX(
+ (bounds_infoXX_template *)(bounds),
+ /*in/out*/ original_ivs, ind);
+ break;
+ }
+}
+
+// Calculate upper bounds for the last loop iteration. Just use original upper
+// bounds (adjusted when canonicalized to use <= / >=). No need to check that
+// this point is in the original space (it's likely not)
+void kmp_calc_original_ivs_for_end(
+ const bounds_info_t *const original_bounds_nest, kmp_index_t n,
+ /*out*/ kmp_point_t original_ivs) {
+ for (kmp_index_t ind = 0; ind < n; ++ind) {
+ auto bounds = &(original_bounds_nest[ind]);
+ kmp_calc_one_iv_end(bounds, /*in/out*/ original_ivs, ind);
+ }
+}
+
+/**************************************************************************
+ * Identify nested loop structure - loops come in the canonical form
+ * Lower triangle matrix: i = 0; i <= N; i++ {0,0}:{N,0}
+ * j = 0; j <= 0/-1+1*i; j++ {0,0}:{0/-1,1}
+ * Upper Triangle matrix
+ * i = 0; i <= N; i++ {0,0}:{N,0}
+ * j = 0+1*i; j <= N; j++ {0,1}:{N,0}
+ * ************************************************************************/
+nested_loop_type_t
+kmp_identify_nested_loop_structure(/*in*/ bounds_info_t *original_bounds_nest,
+ /*in*/ kmp_index_t n) {
+ // only 2-level nested loops are supported
+ if (n != 2) {
+ return nested_loop_type_unkown;
+ }
+ // loops must be canonical
+ KMP_ASSERT(
+ (original_bounds_nest[0].comparison == comparison_t::comp_less_or_eq) &&
+ (original_bounds_nest[1].comparison == comparison_t::comp_less_or_eq));
+ // check outer loop bounds: for triangular need to be {0,0}:{N,0}
+ kmp_uint64 outer_lb0_u64 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].lb0_u64);
+ kmp_uint64 outer_ub0_u64 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].ub0_u64);
+ kmp_uint64 outer_lb1_u64 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].lb1_u64);
+ kmp_uint64 outer_ub1_u64 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].ub1_u64);
+ if (outer_lb0_u64 != 0 || outer_lb1_u64 != 0 || outer_ub1_u64 != 0) {
+ return nested_loop_type_unkown;
+ }
+ // check inner bounds to determine triangle type
+ kmp_uint64 inner_lb0_u64 = kmp_fix_iv(original_bounds_nest[1].loop_iv_type,
+ original_bounds_nest[1].lb0_u64);
+ kmp_uint64 inner_ub0_u64 = kmp_fix_iv(original_bounds_nest[1].loop_iv_type,
+ original_bounds_nest[1].ub0_u64);
+ kmp_uint64 inner_lb1_u64 = kmp_fix_iv(original_bounds_nest[1].loop_iv_type,
+ original_bounds_nest[1].lb1_u64);
+ kmp_uint64 inner_ub1_u64 = kmp_fix_iv(original_bounds_nest[1].loop_iv_type,
+ original_bounds_nest[1].ub1_u64);
+ // lower triangle loop inner bounds need to be {0,0}:{0/-1,1}
+ if (inner_lb0_u64 == 0 && inner_lb1_u64 == 0 &&
+ (inner_ub0_u64 == 0 || inner_ub0_u64 == -1) && inner_ub1_u64 == 1) {
+ return nested_loop_type_lower_triangular_matrix;
+ }
+ // upper triangle loop inner bounds need to be {0,1}:{N,0}
+ if (inner_lb0_u64 == 0 && inner_lb1_u64 == 1 &&
+ inner_ub0_u64 == outer_ub0_u64 && inner_ub1_u64 == 0) {
+ return nested_loop_type_upper_triangular_matrix;
+ }
+ return nested_loop_type_unkown;
+}
+
+/**************************************************************************
+ * SQRT Approximation: https://math.mit.edu/~stevenj/18.335/newton-sqrt.pdf
+ * Start point is x so the result is always > sqrt(x)
+ * The method has uniform convergence, PRECISION is set to 0.1
+ * ************************************************************************/
+#define level_of_precision 0.1
+double sqrt_newton_approx(/*in*/ kmp_uint64 x) {
+ double sqrt_old = 0.;
+ double sqrt_new = (double)x;
+ do {
+ sqrt_old = sqrt_new;
+ sqrt_new = (sqrt_old + x / sqrt_old) / 2;
+ } while ((sqrt_old - sqrt_new) > level_of_precision);
+ return sqrt_new;
+}
+
+/**************************************************************************
+ * Handle lower triangle matrix in the canonical form
+ * i = 0; i <= N; i++ {0,0}:{N,0}
+ * j = 0; j <= 0/-1 + 1*i; j++ {0,0}:{0/-1,1}
+ * ************************************************************************/
+void kmp_handle_lower_triangle_matrix(
+ /*in*/ kmp_uint32 nth,
+ /*in*/ kmp_uint32 tid,
+ /*in */ kmp_index_t n,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ /*out*/ bounds_info_t *chunk_bounds_nest) {
+
+ // transfer loop types from the original loop to the chunks
+ for (kmp_index_t i = 0; i < n; ++i) {
+ chunk_bounds_nest[i] = original_bounds_nest[i];
+ }
+ // cleanup iv variables
+ kmp_uint64 outer_ub0 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].ub0_u64);
+ kmp_uint64 outer_lb0 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].lb0_u64);
+ kmp_uint64 inner_ub0 = kmp_fix_iv(original_bounds_nest[1].loop_iv_type,
+ original_bounds_nest[1].ub0_u64);
+ // calculate the chunk's lower and upper bounds
+ // the total number of iterations in the loop is the sum of the arithmetic
+ // progression from the outer lower to outer upper bound (inclusive since the
+ // loop is canonical) note that less_than inner loops (inner_ub0 = -1)
+ // effectively make the progression 1-based making N = (outer_ub0 - inner_lb0
+ // + 1) -> N - 1
+ kmp_uint64 outer_iters = (outer_ub0 - outer_lb0 + 1) + inner_ub0;
+ kmp_uint64 iter_total = outer_iters * (outer_iters + 1) / 2;
+ // the current thread's number of iterations:
+ // each thread gets an equal number of iterations: total number of iterations
+ // divided by the number of threads plus, if there's a remainder,
+ // the first threads with the number up to the remainder get an additional
+ // iteration each to cover it
+ kmp_uint64 iter_current =
+ iter_total / nth + ((tid < (iter_total % nth)) ? 1 : 0);
+ // cumulative number of iterations executed by all the previous threads:
+ // threads with the tid below the remainder will have (iter_total/nth+1)
+ // elements, and so will all threads before them so the cumulative number of
+ // iterations executed by the all previous will be the current thread's number
+ // of iterations multiplied by the number of previous threads which is equal
+ // to the current thread's tid; threads with the number equal or above the
+ // remainder will have (iter_total/nth) elements so the cumulative number of
+ // iterations previously executed is its number of iterations multipled by the
+ // number of previous threads which is again equal to the current thread's tid
+ // PLUS all the remainder iterations that will have been executed by the
+ // previous threads
+ kmp_uint64 iter_before_current =
+ tid * iter_current + ((tid < iter_total % nth) ? 0 : (iter_total % nth));
+ // cumulative number of iterations executed with the current thread is
+ // the cumulative number executed before it plus its own
+ kmp_uint64 iter_with_current = iter_before_current + iter_current;
+ // calculate the outer loop lower bound (lbo) which is the max outer iv value
+ // that gives the number of iterations that is equal or just below the total
+ // number of iterations executed by the previous threads, for less_than
+ // (1-based) inner loops (inner_ub0 == -1) it will be i.e.
+ // lbo*(lbo-1)/2<=iter_before_current => lbo^2-lbo-2*iter_before_current<=0
+ // for less_than_equal (0-based) inner loops (inner_ub == 0) it will be:
+ // i.e. lbo*(lbo+1)/2<=iter_before_current =>
+ // lbo^2+lbo-2*iter_before_current<=0 both cases can be handled similarily
+ // using a parameter to control the equation sign
+ kmp_int64 inner_adjustment = 1 + 2 * inner_ub0;
+ kmp_uint64 lower_bound_outer =
+ (kmp_uint64)(sqrt_newton_approx(inner_adjustment * inner_adjustment +
+ 8 * iter_before_current) +
+ inner_adjustment) /
+ 2 -
+ inner_adjustment;
+ // calculate the inner loop lower bound which is the remaining number of
+ // iterations required to hit the total number of iterations executed by the
+ // previous threads giving the starting point of this thread
+ kmp_uint64 lower_bound_inner =
+ iter_before_current -
+ ((lower_bound_outer + inner_adjustment) * lower_bound_outer) / 2;
+ // calculate the outer loop upper bound using the same approach as for the
+ // inner bound except using the total number of iterations executed with the
+ // current thread
+ kmp_uint64 upper_bound_outer =
+ (kmp_uint64)(sqrt_newton_approx(inner_adjustment * inner_adjustment +
+ 8 * iter_with_current) +
+ inner_adjustment) /
+ 2 -
+ inner_adjustment;
+ // calculate the inner loop upper bound which is the remaining number of
+ // iterations required to hit the total number of iterations executed after
+ // the current thread giving the starting point of the next thread
+ kmp_uint64 upper_bound_inner =
+ iter_with_current -
+ ((upper_bound_outer + inner_adjustment) * upper_bound_outer) / 2;
+ // adjust the upper bounds down by 1 element to point at the last iteration of
+ // the current thread the first iteration of the next thread
+ if (upper_bound_inner == 0) {
+ // {n,0} => {n-1,n-1}
+ upper_bound_outer -= 1;
+ upper_bound_inner = upper_bound_outer;
+ } else {
+ // {n,m} => {n,m-1} (m!=0)
+ upper_bound_inner -= 1;
+ }
+
+ // assign the values, zeroing out lb1 and ub1 values since the iteration space
+ // is now one-dimensional
+ chunk_bounds_nest[0].lb0_u64 = lower_bound_outer;
+ chunk_bounds_nest[1].lb0_u64 = lower_bound_inner;
+ chunk_bounds_nest[0].ub0_u64 = upper_bound_outer;
+ chunk_bounds_nest[1].ub0_u64 = upper_bound_inner;
+ chunk_bounds_nest[0].lb1_u64 = 0;
+ chunk_bounds_nest[0].ub1_u64 = 0;
+ chunk_bounds_nest[1].lb1_u64 = 0;
+ chunk_bounds_nest[1].ub1_u64 = 0;
+
+#if 0
+ printf("tid/nth = %d/%d : From [%llu, %llu] To [%llu, %llu] : Chunks %llu/%llu\n",
+ tid, nth, chunk_bounds_nest[0].lb0_u64, chunk_bounds_nest[1].lb0_u64,
+ chunk_bounds_nest[0].ub0_u64, chunk_bounds_nest[1].ub0_u64, iter_current, iter_total);
+#endif
+}
+
+/**************************************************************************
+ * Handle upper triangle matrix in the canonical form
+ * i = 0; i <= N; i++ {0,0}:{N,0}
+ * j = 0+1*i; j <= N; j++ {0,1}:{N,0}
+ * ************************************************************************/
+void kmp_handle_upper_triangle_matrix(
+ /*in*/ kmp_uint32 nth,
+ /*in*/ kmp_uint32 tid,
+ /*in */ kmp_index_t n,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ /*out*/ bounds_info_t *chunk_bounds_nest) {
+
+ // transfer loop types from the original loop to the chunks
+ for (kmp_index_t i = 0; i < n; ++i) {
+ chunk_bounds_nest[i] = original_bounds_nest[i];
+ }
+ // cleanup iv variables
+ kmp_uint64 outer_ub0 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].ub0_u64);
+ kmp_uint64 outer_lb0 = kmp_fix_iv(original_bounds_nest[0].loop_iv_type,
+ original_bounds_nest[0].lb0_u64);
+ [[maybe_unused]] kmp_uint64 inner_ub0 = kmp_fix_iv(
+ original_bounds_nest[1].loop_iv_type, original_bounds_nest[1].ub0_u64);
+ // calculate the chunk's lower and upper bounds
+ // the total number of iterations in the loop is the sum of the arithmetic
+ // progression from the outer lower to outer upper bound (inclusive since the
+ // loop is canonical) note that less_than inner loops (inner_ub0 = -1)
+ // effectively make the progression 1-based making N = (outer_ub0 - inner_lb0
+ // + 1) -> N - 1
+ kmp_uint64 outer_iters = (outer_ub0 - outer_lb0 + 1);
+ kmp_uint64 iter_total = outer_iters * (outer_iters + 1) / 2;
+ // the current thread's number of iterations:
+ // each thread gets an equal number of iterations: total number of iterations
+ // divided by the number of threads plus, if there's a remainder,
+ // the first threads with the number up to the remainder get an additional
+ // iteration each to cover it
+ kmp_uint64 iter_current =
+ iter_total / nth + ((tid < (iter_total % nth)) ? 1 : 0);
+ // cumulative number of iterations executed by all the previous threads:
+ // threads with the tid below the remainder will have (iter_total/nth+1)
+ // elements, and so will all threads before them so the cumulative number of
+ // iterations executed by the all previous will be the current thread's number
+ // of iterations multiplied by the number of previous threads which is equal
+ // to the current thread's tid; threads with the number equal or above the
+ // remainder will have (iter_total/nth) elements so the cumulative number of
+ // iterations previously executed is its number of iterations multipled by the
+ // number of previous threads which is again equal to the current thread's tid
+ // PLUS all the remainder iterations that will have been executed by the
+ // previous threads
+ kmp_uint64 iter_before_current =
+ tid * iter_current + ((tid < iter_total % nth) ? 0 : (iter_total % nth));
+ // cumulative number of iterations executed with the current thread is
+ // the cumulative number executed before it plus its own
+ kmp_uint64 iter_with_current = iter_before_current + iter_current;
+ // calculate the outer loop lower bound (lbo) which is the max outer iv value
+ // that gives the number of iterations that is equal or just below the total
+ // number of iterations executed by the previous threads:
+ // lbo*(lbo+1)/2<=iter_before_current =>
+ // lbo^2+lbo-2*iter_before_current<=0
+ kmp_uint64 lower_bound_outer =
+ (kmp_uint64)(sqrt_newton_approx(1 + 8 * iter_before_current) + 1) / 2 - 1;
+ // calculate the inner loop lower bound which is the remaining number of
+ // iterations required to hit the total number of iterations executed by the
+ // previous threads giving the starting point of this thread
+ kmp_uint64 lower_bound_inner =
+ iter_before_current - ((lower_bound_outer + 1) * lower_bound_outer) / 2;
+ // calculate the outer loop upper bound using the same approach as for the
+ // inner bound except using the total number of iterations executed with the
+ // current thread
+ kmp_uint64 upper_bound_outer =
+ (kmp_uint64)(sqrt_newton_approx(1 + 8 * iter_with_current) + 1) / 2 - 1;
+ // calculate the inner loop upper bound which is the remaining number of
+ // iterations required to hit the total number of iterations executed after
+ // the current thread giving the starting point of the next thread
+ kmp_uint64 upper_bound_inner =
+ iter_with_current - ((upper_bound_outer + 1) * upper_bound_outer) / 2;
+ // adjust the upper bounds down by 1 element to point at the last iteration of
+ // the current thread the first iteration of the next thread
+ if (upper_bound_inner == 0) {
+ // {n,0} => {n-1,n-1}
+ upper_bound_outer -= 1;
+ upper_bound_inner = upper_bound_outer;
+ } else {
+ // {n,m} => {n,m-1} (m!=0)
+ upper_bound_inner -= 1;
+ }
+
+ // assign the values, zeroing out lb1 and ub1 values since the iteration space
+ // is now one-dimensional
+ chunk_bounds_nest[0].lb0_u64 = (outer_iters - 1) - upper_bound_outer;
+ chunk_bounds_nest[1].lb0_u64 = (outer_iters - 1) - upper_bound_inner;
+ chunk_bounds_nest[0].ub0_u64 = (outer_iters - 1) - lower_bound_outer;
+ chunk_bounds_nest[1].ub0_u64 = (outer_iters - 1) - lower_bound_inner;
+ chunk_bounds_nest[0].lb1_u64 = 0;
+ chunk_bounds_nest[0].ub1_u64 = 0;
+ chunk_bounds_nest[1].lb1_u64 = 0;
+ chunk_bounds_nest[1].ub1_u64 = 0;
+
+#if 0
+ printf("tid/nth = %d/%d : From [%llu, %llu] To [%llu, %llu] : Chunks %llu/%llu\n",
+ tid, nth, chunk_bounds_nest[0].lb0_u64, chunk_bounds_nest[1].lb0_u64,
+ chunk_bounds_nest[0].ub0_u64, chunk_bounds_nest[1].ub0_u64, iter_current, iter_total);
+#endif
+}
+//----------Init API for non-rectangular loops--------------------------------
+
+// Init API for collapsed loops (static, no chunks defined).
+// "bounds_nest" has to be allocated per thread.
+// API will modify original bounds_nest array to bring it to a canonical form
+// (only <= and >=, no !=, <, >). If the original loop nest was already in a
+// canonical form there will be no changes to bounds in bounds_nest array
+// (only trip counts will be calculated). Internally API will expand the space
+// to parallelogram/parallelepiped, calculate total, calculate bounds for the
+// chunks in terms of the new IV, re-calc them in terms of old IVs (especially
+// important on the left side, to hit the lower bounds and not step over), and
+// pick the correct chunk for this thread (so it will calculate chunks up to the
+// needed one). It could be optimized to calculate just this chunk, potentially
+// a bit less well distributed among threads. It is designed to make sure that
+// threads will receive predictable chunks, deterministically (so that next nest
+// of loops with similar characteristics will get exactly same chunks on same
+// threads).
+// Current contract: chunk_bounds_nest has only lb0 and ub0,
+// lb1 and ub1 are set to 0 and can be ignored. (This may change in the future).
+extern "C" kmp_int32
+__kmpc_for_collapsed_init(ident_t *loc, kmp_int32 gtid,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ /*out*/ bounds_info_t *chunk_bounds_nest,
+ kmp_index_t n, /*out*/ kmp_int32 *plastiter) {
+
+ KMP_DEBUG_ASSERT(plastiter && original_bounds_nest);
+ KE_TRACE(10, ("__kmpc_for_collapsed_init called (%d)\n", gtid));
+
+ if (__kmp_env_consistency_check) {
+ __kmp_push_workshare(gtid, ct_pdo, loc);
+ }
+
+ kmp_canonicalize_loop_nest(loc, /*in/out*/ original_bounds_nest, n);
+
+ CollapseAllocator updated_bounds_nest(n);
+
+ for (kmp_index_t i = 0; i < n; ++i) {
+ updated_bounds_nest[i].b = original_bounds_nest[i];
+ }
+
+ kmp_loop_nest_iv_t total =
+ kmp_process_loop_nest(/*in/out*/ updated_bounds_nest, n);
+
+ if (plastiter != NULL) {
+ *plastiter = FALSE;
+ }
+
+ if (total == 0) {
+ // Loop won't execute:
+ return FALSE;
+ }
+
+ // OMPTODO: DISTRIBUTE is not supported yet
+ __kmp_assert_valid_gtid(gtid);
+ kmp_uint32 tid = __kmp_tid_from_gtid(gtid);
+
+ kmp_info_t *th = __kmp_threads[gtid];
+ kmp_team_t *team = th->th.th_team;
+ kmp_uint32 nth = team->t.t_nproc; // Number of threads
+
+ KMP_DEBUG_ASSERT(tid < nth);
+
+ // Handle special cases
+ nested_loop_type_t loop_type =
+ kmp_identify_nested_loop_structure(original_bounds_nest, n);
+ if (loop_type == nested_loop_type_lower_triangular_matrix) {
+ kmp_handle_lower_triangle_matrix(nth, tid, n, original_bounds_nest,
+ chunk_bounds_nest);
+ return TRUE;
+ } else if (loop_type == nested_loop_type_upper_triangular_matrix) {
+ kmp_handle_upper_triangle_matrix(nth, tid, n, original_bounds_nest,
+ chunk_bounds_nest);
+ return TRUE;
+ }
+
+ CollapseAllocator original_ivs_start(n);
+
+ if (!kmp_calc_original_ivs_for_start(original_bounds_nest, n,
+ /*out*/ original_ivs_start)) {
+ // Loop won't execute:
+ return FALSE;
+ }
+
+ // Not doing this optimization for one thread:
+ // (1) more to test
+ // (2) without it current contract that chunk_bounds_nest has only lb0 and
+ // ub0, lb1 and ub1 are set to 0 and can be ignored.
+ // if (nth == 1) {
+ // // One thread:
+ // // Copy all info from original_bounds_nest, it'll be good enough.
+
+ // for (kmp_index_t i = 0; i < n; ++i) {
+ // chunk_bounds_nest[i] = original_bounds_nest[i];
+ // }
+
+ // if (plastiter != NULL) {
+ // *plastiter = TRUE;
+ // }
+ // return TRUE;
+ //}
+
+ kmp_loop_nest_iv_t new_iv = kmp_calc_new_iv_from_original_ivs(
+ updated_bounds_nest, original_ivs_start, n);
+
+ bool last_iter = false;
+
+ for (; nth > 0;) {
+ // We could calculate chunk size once, but this is to compensate that the
+ // original space is not parallelepiped and some threads can be left
+ // without work:
+ KMP_DEBUG_ASSERT(total >= new_iv);
+
+ kmp_loop_nest_iv_t total_left = total - new_iv;
+ kmp_loop_nest_iv_t chunk_size = total_left / nth;
+ kmp_loop_nest_iv_t remainder = total_left % nth;
+
+ kmp_loop_nest_iv_t curr_chunk_size = chunk_size;
+
+ if (remainder > 0) {
+ ++curr_chunk_size;
+ --remainder;
+ }
+
+#if defined(KMP_DEBUG)
+ kmp_loop_nest_iv_t new_iv_for_start = new_iv;
+#endif
+
+ if (curr_chunk_size > 1) {
+ new_iv += curr_chunk_size - 1;
+ }
+
+ CollapseAllocator original_ivs_end(n);
+ if ((nth == 1) || (new_iv >= total - 1)) {
+ // Do this one till the end - just in case we miscalculated
+ // and either too much is left to process or new_iv is a bit too big:
+ kmp_calc_original_ivs_for_end(original_bounds_nest, n,
+ /*out*/ original_ivs_end);
+
+ last_iter = true;
+ } else {
+ // Note: here we make sure it's past (or equal to) the previous point.
+ if (!kmp_calc_original_ivs_for_chunk_end(original_bounds_nest, n,
+ updated_bounds_nest,
+ original_ivs_start, new_iv,
+ /*out*/ original_ivs_end)) {
+ // We could not find the ending point, use the original upper bounds:
+ kmp_calc_original_ivs_for_end(original_bounds_nest, n,
+ /*out*/ original_ivs_end);
+
+ last_iter = true;
+ }
+ }
+
+#if defined(KMP_DEBUG)
+ auto new_iv_for_end = kmp_calc_new_iv_from_original_ivs(
+ updated_bounds_nest, original_ivs_end, n);
+ KMP_DEBUG_ASSERT(new_iv_for_end >= new_iv_for_start);
+#endif
+
+ if (last_iter && (tid != 0)) {
+ // We are done, this was last chunk, but no chunk for current thread was
+ // found:
+ return FALSE;
+ }
+
+ if (tid == 0) {
+ // We found the chunk for this thread, now we need to check if it's the
+ // last chunk or not:
+
+ CollapseAllocator original_ivs_next_start(n);
+ if (last_iter ||
+ !kmp_calc_next_original_ivs(original_bounds_nest, n, original_ivs_end,
+ /*out*/ original_ivs_next_start)) {
+ // no more loop iterations left to process,
+ // this means that currently found chunk is the last chunk:
+ if (plastiter != NULL) {
+ *plastiter = TRUE;
+ }
+ }
+
+ // Fill in chunk bounds:
+ for (kmp_index_t i = 0; i < n; ++i) {
+ chunk_bounds_nest[i] =
+ original_bounds_nest[i]; // To fill in types, etc. - optional
+ chunk_bounds_nest[i].lb0_u64 = original_ivs_start[i];
+ chunk_bounds_nest[i].lb1_u64 = 0;
+
+ chunk_bounds_nest[i].ub0_u64 = original_ivs_end[i];
+ chunk_bounds_nest[i].ub1_u64 = 0;
+ }
+
+ return TRUE;
+ }
+
+ --tid;
+ --nth;
+
+ bool next_chunk = kmp_calc_next_original_ivs(
+ original_bounds_nest, n, original_ivs_end, /*out*/ original_ivs_start);
+ if (!next_chunk) {
+ // no more loop iterations to process,
+ // the prevoius chunk was the last chunk
+ break;
+ }
+
+ // original_ivs_start is next to previous chunk original_ivs_end,
+ // we need to start new chunk here, so chunks will be one after another
+ // without any gap or overlap:
+ new_iv = kmp_calc_new_iv_from_original_ivs(updated_bounds_nest,
+ original_ivs_start, n);
+ }
+
+ return FALSE;
+}
diff --git a/contrib/libs/cxxsupp/openmp/kmp_collapse.h b/contrib/libs/cxxsupp/openmp/kmp_collapse.h
new file mode 100644
index 000000000000..1044478554a0
--- /dev/null
+++ b/contrib/libs/cxxsupp/openmp/kmp_collapse.h
@@ -0,0 +1,247 @@
+/*
+ * kmp_collapse.h -- header for loop collapse feature
+ */
+
+//===----------------------------------------------------------------------===//
+//
+// 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 KMP_COLLAPSE_H
+#define KMP_COLLAPSE_H
+
+#include
+
+// Type of the index into the loop nest structures
+// (with values from 0 to less than n from collapse(n))
+typedef kmp_int32 kmp_index_t;
+
+// Type for combined loop nest space IV:
+typedef kmp_uint64 kmp_loop_nest_iv_t;
+
+// Loop has <, <=, etc. as a comparison:
+enum comparison_t : kmp_int32 {
+ comp_less_or_eq = 0,
+ comp_greater_or_eq = 1,
+ comp_not_eq = 2,
+ comp_less = 3,
+ comp_greater = 4
+};
+
+// Type of loop IV.
+// Type of bounds and step, after usual promotions
+// are a subset of these types (32 & 64 only):
+enum loop_type_t : kmp_int32 {
+ loop_type_uint8 = 0,
+ loop_type_int8 = 1,
+ loop_type_uint16 = 2,
+ loop_type_int16 = 3,
+ loop_type_uint32 = 4,
+ loop_type_int32 = 5,
+ loop_type_uint64 = 6,
+ loop_type_int64 = 7
+};
+
+// Defining loop types to handle special cases
+enum nested_loop_type_t : kmp_int32 {
+ nested_loop_type_unkown = 0,
+ nested_loop_type_lower_triangular_matrix = 1,
+ nested_loop_type_upper_triangular_matrix = 2
+};
+
+/*!
+ @ingroup WORK_SHARING
+ * Describes the structure for rectangular nested loops.
+ */
+template struct bounds_infoXX_template {
+
+ // typedef typename traits_t::unsigned_t UT;
+ typedef typename traits_t::signed_t ST;
+
+ loop_type_t loop_type; // The differentiator
+ loop_type_t loop_iv_type;
+ comparison_t comparison;
+ // outer_iv should be 0 (or any other less then number of dimentions)
+ // if loop doesn't depend on it (lb1 and ub1 will be 0).
+ // This way we can do multiplication without a check.
+ kmp_index_t outer_iv;
+
+ // unions to keep the size constant:
+ union {
+ T lb0;
+ kmp_uint64 lb0_u64; // real type can be signed
+ };
+
+ union {
+ T lb1;
+ kmp_uint64 lb1_u64; // real type can be signed
+ };
+
+ union {
+ T ub0;
+ kmp_uint64 ub0_u64; // real type can be signed
+ };
+
+ union {
+ T ub1;
+ kmp_uint64 ub1_u64; // real type can be signed
+ };
+
+ union {
+ ST step; // signed even if bounds type is unsigned
+ kmp_int64 step_64; // signed
+ };
+
+ kmp_loop_nest_iv_t trip_count;
+};
+
+/*!
+ @ingroup WORK_SHARING
+ * Interface struct for rectangular nested loops.
+ * Same size as bounds_infoXX_template.
+ */
+struct bounds_info_t {
+
+ loop_type_t loop_type; // The differentiator
+ loop_type_t loop_iv_type;
+ comparison_t comparison;
+ // outer_iv should be 0 (or any other less then number of dimentions)
+ // if loop doesn't depend on it (lb1 and ub1 will be 0).
+ // This way we can do multiplication without a check.
+ kmp_index_t outer_iv;
+
+ kmp_uint64 lb0_u64; // real type can be signed
+ kmp_uint64 lb1_u64; // real type can be signed
+ kmp_uint64 ub0_u64; // real type can be signed
+ kmp_uint64 ub1_u64; // real type can be signed
+ kmp_int64 step_64; // signed
+
+ // This is internal, but it's the only internal thing we need
+ // in rectangular case, so let's expose it here:
+ kmp_loop_nest_iv_t trip_count;
+};
+
+//-------------------------------------------------------------------------
+// Additional types for internal representation:
+
+// Array for a point in the loop space, in the original space.
+// It's represented in kmp_uint64, but each dimention is calculated in
+// that loop IV type. Also dimentions have to be converted to those types
+// when used in generated code.
+typedef kmp_uint64 *kmp_point_t;
+
+// Array: Number of loop iterations on each nesting level to achieve some point,
+// in expanded space or in original space.
+// OMPTODO: move from using iterations to using offsets (iterations multiplied
+// by steps). For those we need to be careful with the types, as step can be
+// negative, but it'll remove multiplications and divisions in several places.
+typedef kmp_loop_nest_iv_t *kmp_iterations_t;
+
+// Internal struct with additional info:
+template struct bounds_info_internalXX_template {
+
+ // OMPTODO: should span have type T or should it better be
+ // kmp_uint64/kmp_int64 depending on T sign? (if kmp_uint64/kmp_int64 than
+ // updated bounds should probably also be kmp_uint64/kmp_int64). I'd like to
+ // use big_span_t, if it can be resolved at compile time.
+ typedef
+ typename std::conditional::value, kmp_int64, kmp_uint64>
+ big_span_t;
+
+ // typedef typename big_span_t span_t;
+ typedef T span_t;
+
+ bounds_infoXX_template b; // possibly adjusted bounds
+
+ // Leaving this as a union in case we'll switch to span_t with different sizes
+ // (depending on T)
+ union {
+ // Smallest possible value of iv (may be smaller than actually possible)
+ span_t span_smallest;
+ kmp_uint64 span_smallest_u64;
+ };
+
+ // Leaving this as a union in case we'll switch to span_t with different sizes
+ // (depending on T)
+ union {
+ // Biggest possible value of iv (may be bigger than actually possible)
+ span_t span_biggest;
+ kmp_uint64 span_biggest_u64;
+ };
+
+ // Did we adjust loop bounds (not counting canonicalization)?
+ bool loop_bounds_adjusted;
+};
+
+// Internal struct with additional info:
+struct bounds_info_internal_t {
+
+ bounds_info_t b; // possibly adjusted bounds
+
+ // Smallest possible value of iv (may be smaller than actually possible)
+ kmp_uint64 span_smallest_u64;
+
+ // Biggest possible value of iv (may be bigger than actually possible)
+ kmp_uint64 span_biggest_u64;
+
+ // Did we adjust loop bounds (not counting canonicalization)?
+ bool loop_bounds_adjusted;
+};
+
+//----------APIs for rectangular loop nests--------------------------------
+
+// Canonicalize loop nest and calculate overall trip count.
+// "bounds_nest" has to be allocated per thread.
+// API will modify original bounds_nest array to bring it to a canonical form
+// (only <= and >=, no !=, <, >). If the original loop nest was already in a
+// canonical form there will be no changes to bounds in bounds_nest array
+// (only trip counts will be calculated).
+// Returns trip count of overall space.
+extern "C" kmp_loop_nest_iv_t
+__kmpc_process_loop_nest_rectang(ident_t *loc, kmp_int32 gtid,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ kmp_index_t n);
+
+// Calculate old induction variables corresponding to overall new_iv.
+// Note: original IV will be returned as if it had kmp_uint64 type,
+// will have to be converted to original type in user code.
+// Note: trip counts should be already calculated by
+// __kmpc_process_loop_nest_rectang.
+// OMPTODO: special case 2, 3 nested loops - if it'll be possible to inline
+// that into user code.
+extern "C" void
+__kmpc_calc_original_ivs_rectang(ident_t *loc, kmp_loop_nest_iv_t new_iv,
+ const bounds_info_t *original_bounds_nest,
+ /*out*/ kmp_uint64 *original_ivs,
+ kmp_index_t n);
+
+//----------Init API for non-rectangular loops--------------------------------
+
+// Init API for collapsed loops (static, no chunks defined).
+// "bounds_nest" has to be allocated per thread.
+// API will modify original bounds_nest array to bring it to a canonical form
+// (only <= and >=, no !=, <, >). If the original loop nest was already in a
+// canonical form there will be no changes to bounds in bounds_nest array
+// (only trip counts will be calculated). Internally API will expand the space
+// to parallelogram/parallelepiped, calculate total, calculate bounds for the
+// chunks in terms of the new IV, re-calc them in terms of old IVs (especially
+// important on the left side, to hit the lower bounds and not step over), and
+// pick the correct chunk for this thread (so it will calculate chunks up to the
+// needed one). It could be optimized to calculate just this chunk, potentially
+// a bit less well distributed among threads. It is designed to make sure that
+// threads will receive predictable chunks, deterministically (so that next nest
+// of loops with similar characteristics will get exactly same chunks on same
+// threads).
+// Current contract: chunk_bounds_nest has only lb0 and ub0,
+// lb1 and ub1 are set to 0 and can be ignored. (This may change in the future).
+extern "C" kmp_int32
+__kmpc_for_collapsed_init(ident_t *loc, kmp_int32 gtid,
+ /*in/out*/ bounds_info_t *original_bounds_nest,
+ /*out*/ bounds_info_t *chunk_bounds_nest,
+ kmp_index_t n,
+ /*out*/ kmp_int32 *plastiter);
+
+#endif // KMP_COLLAPSE_H
diff --git a/contrib/libs/cxxsupp/openmp/kmp_config-linux.h b/contrib/libs/cxxsupp/openmp/kmp_config-linux.h
index 2f7a7f9320ab..a0289547f10d 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_config-linux.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_config-linux.h
@@ -42,6 +42,8 @@
#define OMPT_SUPPORT LIBOMP_OMPT_SUPPORT
#define LIBOMP_OMPD_SUPPORT 0
#define OMPD_SUPPORT LIBOMP_OMPD_SUPPORT
+#define LIBOMP_OMPX_TASKGRAPH 0
+#define OMPX_TASKGRAPH LIBOMP_OMPX_TASKGRAPH
#define LIBOMP_PROFILING_SUPPORT 0
#define OMP_PROFILING_SUPPORT LIBOMP_PROFILING_SUPPORT
#define LIBOMP_OMPT_OPTIONAL 1
@@ -90,12 +92,16 @@
#define KMP_HAVE_POSIX_MEMALIGN LIBOMP_HAVE_POSIX_MEMALIGN
#define LIBOMP_HAVE__ALIGNED_MALLOC 0
#define KMP_HAVE__ALIGNED_MALLOC LIBOMP_HAVE__ALIGNED_MALLOC
+#define OPENMP_ENABLE_LIBOMPTARGET 0
+#define ENABLE_LIBOMPTARGET OPENMP_ENABLE_LIBOMPTARGET
// Configured cache line based on architecture
-#if KMP_ARCH_PPC64
+#if KMP_ARCH_PPC64 || KMP_ARCH_PPC
# define CACHE_LINE 128
#elif KMP_ARCH_AARCH64_A64FX
# define CACHE_LINE 256
+#elif KMP_ARCH_S390X
+# define CACHE_LINE 256
#else
# define CACHE_LINE 64
#endif
diff --git a/contrib/libs/cxxsupp/openmp/kmp_csupport.cpp b/contrib/libs/cxxsupp/openmp/kmp_csupport.cpp
index c932d450c84e..fdbf9ff45e35 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_csupport.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_csupport.cpp
@@ -18,6 +18,7 @@
#include "kmp_itt.h"
#include "kmp_lock.h"
#include "kmp_stats.h"
+#include "kmp_utils.h"
#include "ompt-specific.h"
#define MAX_MESSAGE 512
@@ -236,6 +237,50 @@ void __kmpc_push_num_threads(ident_t *loc, kmp_int32 global_tid,
__kmp_push_num_threads(loc, global_tid, num_threads);
}
+void __kmpc_push_num_threads_strict(ident_t *loc, kmp_int32 global_tid,
+ kmp_int32 num_threads, int severity,
+ const char *message) {
+ __kmp_push_num_threads(loc, global_tid, num_threads);
+ __kmp_set_strict_num_threads(loc, global_tid, severity, message);
+}
+
+/*!
+@ingroup PARALLEL
+@param loc source location information
+@param global_tid global thread number
+@param list_length number of entries in the num_threads_list array
+@param num_threads_list array of numbers of threads requested for this parallel
+construct and subsequent nested parallel constructs
+
+Set the number of threads to be used by the next fork spawned by this thread,
+and some nested forks as well.
+This call is only required if the parallel construct has a `num_threads` clause
+that has a list of integers as the argument.
+*/
+void __kmpc_push_num_threads_list(ident_t *loc, kmp_int32 global_tid,
+ kmp_uint32 list_length,
+ kmp_int32 *num_threads_list) {
+ KA_TRACE(20, ("__kmpc_push_num_threads_list: enter T#%d num_threads_list=",
+ global_tid));
+ KA_TRACE(20, ("%d", num_threads_list[0]));
+#ifdef KMP_DEBUG
+ for (kmp_uint32 i = 1; i < list_length; ++i)
+ KA_TRACE(20, (", %d", num_threads_list[i]));
+#endif
+ KA_TRACE(20, ("/n"));
+
+ __kmp_assert_valid_gtid(global_tid);
+ __kmp_push_num_threads_list(loc, global_tid, list_length, num_threads_list);
+}
+
+void __kmpc_push_num_threads_list_strict(ident_t *loc, kmp_int32 global_tid,
+ kmp_uint32 list_length,
+ kmp_int32 *num_threads_list,
+ int severity, const char *message) {
+ __kmp_push_num_threads_list(loc, global_tid, list_length, num_threads_list);
+ __kmp_set_strict_num_threads(loc, global_tid, severity, message);
+}
+
void __kmpc_pop_num_threads(ident_t *loc, kmp_int32 global_tid) {
KA_TRACE(20, ("__kmpc_pop_num_threads: enter\n"));
/* the num_threads are automatically popped */
@@ -330,6 +375,55 @@ void __kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...) {
#endif // KMP_STATS_ENABLED
}
+/*!
+@ingroup PARALLEL
+@param loc source location information
+@param microtask pointer to callback routine consisting of outlined parallel
+construct
+@param cond condition for running in parallel
+@param args struct of pointers to shared variables that aren't global
+
+Perform a fork only if the condition is true.
+*/
+void __kmpc_fork_call_if(ident_t *loc, kmp_int32 argc, kmpc_micro microtask,
+ kmp_int32 cond, void *args) {
+ int gtid = __kmp_entry_gtid();
+ if (cond) {
+ if (args)
+ __kmpc_fork_call(loc, argc, microtask, args);
+ else
+ __kmpc_fork_call(loc, argc, microtask);
+ } else {
+ __kmpc_serialized_parallel(loc, gtid);
+
+#if OMPT_SUPPORT
+ void *exit_frame_ptr;
+#endif
+
+ if (args)
+ __kmp_invoke_microtask(VOLATILE_CAST(microtask_t) microtask, gtid,
+ /*npr=*/0,
+ /*argc=*/1, &args
+#if OMPT_SUPPORT
+ ,
+ &exit_frame_ptr
+#endif
+ );
+ else
+ __kmp_invoke_microtask(VOLATILE_CAST(microtask_t) microtask, gtid,
+ /*npr=*/0,
+ /*argc=*/0,
+ /*args=*/nullptr
+#if OMPT_SUPPORT
+ ,
+ &exit_frame_ptr
+#endif
+ );
+
+ __kmpc_end_serialized_parallel(loc, gtid);
+ }
+}
+
/*!
@ingroup PARALLEL
@param loc source location information
@@ -350,6 +444,24 @@ void __kmpc_push_num_teams(ident_t *loc, kmp_int32 global_tid,
__kmp_push_num_teams(loc, global_tid, num_teams, num_threads);
}
+/*!
+@ingroup PARALLEL
+@param loc source location information
+@param global_tid global thread number
+@param thread_limit limit on number of threads which can be created within the
+current task
+
+Set the thread_limit for the current task
+This call is there to support `thread_limit` clause on the `target` construct
+*/
+void __kmpc_set_thread_limit(ident_t *loc, kmp_int32 global_tid,
+ kmp_int32 thread_limit) {
+ __kmp_assert_valid_gtid(global_tid);
+ kmp_info_t *thread = __kmp_threads[global_tid];
+ if (thread_limit > 0)
+ thread->th.th_current_task->td_icvs.task_thread_limit = thread_limit;
+}
+
/*!
@ingroup PARALLEL
@param loc source location information
@@ -586,6 +698,12 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
serial_team->t.t_dispatch->th_disp_buffer->next;
__kmp_free(disp_buffer);
}
+
+ /* pop the task team stack */
+ if (serial_team->t.t_serialized > 1) {
+ __kmp_pop_task_team_node(this_thr, serial_team);
+ }
+
this_thr->th.th_def_allocator = serial_team->t.t_def_allocator; // restore
--serial_team->t.t_serialized;
@@ -624,6 +742,11 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
this_thr->th.th_current_task->td_flags.executing = 1;
if (__kmp_tasking_mode != tskm_immediate_exec) {
+ // Restore task state from serial team structure
+ KMP_DEBUG_ASSERT(serial_team->t.t_primary_task_state == 0 ||
+ serial_team->t.t_primary_task_state == 1);
+ this_thr->th.th_task_state =
+ (kmp_uint8)serial_team->t.t_primary_task_state;
// Copy the task team from the new child / old parent team to the thread.
this_thr->th.th_task_team =
this_thr->th.th_team->t.t_task_team[this_thr->th.th_task_state];
@@ -633,7 +756,7 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
global_tid, this_thr->th.th_task_team, this_thr->th.th_team));
}
#if KMP_AFFINITY_SUPPORTED
- if (this_thr->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (this_thr->th.th_team->t.t_level == 0 && __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(global_tid);
}
#endif
@@ -668,45 +791,7 @@ void __kmpc_flush(ident_t *loc) {
KC_TRACE(10, ("__kmpc_flush: called\n"));
/* need explicit __mf() here since use volatile instead in library */
- KMP_MB(); /* Flush all pending memory write invalidates. */
-
-#if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
-#if KMP_MIC
-// fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used.
-// We shouldn't need it, though, since the ABI rules require that
-// * If the compiler generates NGO stores it also generates the fence
-// * If users hand-code NGO stores they should insert the fence
-// therefore no incomplete unordered stores should be visible.
-#else
- // C74404
- // This is to address non-temporal store instructions (sfence needed).
- // The clflush instruction is addressed either (mfence needed).
- // Probably the non-temporal load monvtdqa instruction should also be
- // addressed.
- // mfence is a SSE2 instruction. Do not execute it if CPU is not SSE2.
- if (!__kmp_cpuinfo.initialized) {
- __kmp_query_cpuid(&__kmp_cpuinfo);
- }
- if (!__kmp_cpuinfo.flags.sse2) {
- // CPU cannot execute SSE2 instructions.
- } else {
-#if KMP_COMPILER_ICC || KMP_COMPILER_ICX
- _mm_mfence();
-#elif KMP_COMPILER_MSVC
- MemoryBarrier();
-#else
- __sync_synchronize();
-#endif // KMP_COMPILER_ICC || KMP_COMPILER_ICX
- }
-#endif // KMP_MIC
-#elif (KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || KMP_ARCH_MIPS64 || \
- KMP_ARCH_RISCV64)
-// Nothing to see here move along
-#elif KMP_ARCH_PPC64
-// Nothing needed here (we have a real MB above).
-#else
-#error Unknown or unsupported architecture
-#endif
+ KMP_MFENCE(); /* Flush all pending memory write invalidates. */
#if OMPT_SUPPORT && OMPT_OPTIONAL
if (ompt_enabled.ompt_callback_flush) {
@@ -1504,8 +1589,9 @@ void __kmpc_critical_with_hint(ident_t *loc, kmp_int32 global_tid,
kmp_dyna_lockseq_t lockseq = __kmp_map_hint_to_lock(hint);
if (*lk == 0) {
if (KMP_IS_D_LOCK(lockseq)) {
- KMP_COMPARE_AND_STORE_ACQ32((volatile kmp_int32 *)crit, 0,
- KMP_GET_D_TAG(lockseq));
+ (void)KMP_COMPARE_AND_STORE_ACQ32(
+ (volatile kmp_int32 *)&((kmp_base_tas_lock_t *)crit)->poll, 0,
+ KMP_GET_D_TAG(lockseq));
} else {
__kmp_init_indirect_csptr(crit, loc, global_tid, KMP_GET_I_TAG(lockseq));
}
@@ -1920,13 +2006,13 @@ void __kmpc_for_static_fini(ident_t *loc, kmp_int32 global_tid) {
#if OMPT_SUPPORT && OMPT_OPTIONAL
if (ompt_enabled.ompt_callback_work) {
- ompt_work_t ompt_work_type = ompt_work_loop;
+ ompt_work_t ompt_work_type = ompt_work_loop_static;
ompt_team_info_t *team_info = __ompt_get_teaminfo(0, NULL);
ompt_task_info_t *task_info = __ompt_get_task_info_object(0);
// Determine workshare type
if (loc != NULL) {
if ((loc->flags & KMP_IDENT_WORK_LOOP) != 0) {
- ompt_work_type = ompt_work_loop;
+ ompt_work_type = ompt_work_loop_static;
} else if ((loc->flags & KMP_IDENT_WORK_SECTIONS) != 0) {
ompt_work_type = ompt_work_sections;
} else if ((loc->flags & KMP_IDENT_WORK_DISTRIBUTE) != 0) {
@@ -2027,7 +2113,8 @@ void KMP_EXPAND_NAME(ompc_display_affinity)(char const *format) {
__kmp_assign_root_init_mask();
gtid = __kmp_get_gtid();
#if KMP_AFFINITY_SUPPORTED
- if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
+ __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
#endif
@@ -2045,7 +2132,8 @@ size_t KMP_EXPAND_NAME(ompc_capture_affinity)(char *buffer, size_t buf_size,
__kmp_assign_root_init_mask();
gtid = __kmp_get_gtid();
#if KMP_AFFINITY_SUPPORTED
- if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
+ __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
#endif
@@ -2070,14 +2158,15 @@ void kmpc_set_stacksize_s(size_t arg) {
}
void kmpc_set_blocktime(int arg) {
- int gtid, tid;
+ int gtid, tid, bt = arg;
kmp_info_t *thread;
gtid = __kmp_entry_gtid();
tid = __kmp_tid_from_gtid(gtid);
thread = __kmp_thread_from_gtid(gtid);
- __kmp_aux_set_blocktime(arg, thread, tid);
+ __kmp_aux_convert_blocktime(&bt);
+ __kmp_aux_set_blocktime(bt, thread, tid);
}
void kmpc_set_library(int arg) {
@@ -3155,7 +3244,7 @@ int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
codeptr = OMPT_GET_RETURN_ADDRESS(0);
if (ompt_enabled.ompt_callback_mutex_acquire) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquire)(
- ompt_mutex_lock, omp_lock_hint_none,
+ ompt_mutex_test_lock, omp_lock_hint_none,
__ompt_get_mutex_impl_type(user_lock),
(ompt_wait_id_t)(uintptr_t)user_lock, codeptr);
}
@@ -3179,7 +3268,7 @@ int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
#if OMPT_SUPPORT && OMPT_OPTIONAL
if (ompt_enabled.ompt_callback_mutex_acquired) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquired)(
- ompt_mutex_lock, (ompt_wait_id_t)(uintptr_t)user_lock, codeptr);
+ ompt_mutex_test_lock, (ompt_wait_id_t)(uintptr_t)user_lock, codeptr);
}
#endif
return FTN_TRUE;
@@ -3219,7 +3308,7 @@ int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
codeptr = OMPT_GET_RETURN_ADDRESS(0);
if (ompt_enabled.ompt_callback_mutex_acquire) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquire)(
- ompt_mutex_lock, omp_lock_hint_none, __ompt_get_mutex_impl_type(),
+ ompt_mutex_test_lock, omp_lock_hint_none, __ompt_get_mutex_impl_type(),
(ompt_wait_id_t)(uintptr_t)lck, codeptr);
}
#endif
@@ -3235,7 +3324,7 @@ int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
#if OMPT_SUPPORT && OMPT_OPTIONAL
if (rc && ompt_enabled.ompt_callback_mutex_acquired) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquired)(
- ompt_mutex_lock, (ompt_wait_id_t)(uintptr_t)lck, codeptr);
+ ompt_mutex_test_lock, (ompt_wait_id_t)(uintptr_t)lck, codeptr);
}
#endif
@@ -3260,7 +3349,7 @@ int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
codeptr = OMPT_GET_RETURN_ADDRESS(0);
if (ompt_enabled.ompt_callback_mutex_acquire) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquire)(
- ompt_mutex_nest_lock, omp_lock_hint_none,
+ ompt_mutex_test_nest_lock, omp_lock_hint_none,
__ompt_get_mutex_impl_type(user_lock),
(ompt_wait_id_t)(uintptr_t)user_lock, codeptr);
}
@@ -3279,7 +3368,7 @@ int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
if (ompt_enabled.ompt_callback_mutex_acquired) {
// lock_first
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquired)(
- ompt_mutex_nest_lock, (ompt_wait_id_t)(uintptr_t)user_lock,
+ ompt_mutex_test_nest_lock, (ompt_wait_id_t)(uintptr_t)user_lock,
codeptr);
}
} else {
@@ -3326,7 +3415,7 @@ int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
if (ompt_enabled.enabled) &&
ompt_enabled.ompt_callback_mutex_acquire) {
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquire)(
- ompt_mutex_nest_lock, omp_lock_hint_none,
+ ompt_mutex_test_nest_lock, omp_lock_hint_none,
__ompt_get_mutex_impl_type(), (ompt_wait_id_t)(uintptr_t)lck,
codeptr);
}
@@ -3346,7 +3435,7 @@ int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock) {
if (ompt_enabled.ompt_callback_mutex_acquired) {
// lock_first
ompt_callbacks.ompt_callback(ompt_callback_mutex_acquired)(
- ompt_mutex_nest_lock, (ompt_wait_id_t)(uintptr_t)lck, codeptr);
+ ompt_mutex_test_nest_lock, (ompt_wait_id_t)(uintptr_t)lck, codeptr);
}
} else {
if (ompt_enabled.ompt_callback_nest_lock) {
@@ -3397,8 +3486,8 @@ __kmp_enter_critical_section_reduce_block(ident_t *loc, kmp_int32 global_tid,
// Check if it is initialized.
if (*lk == 0) {
if (KMP_IS_D_LOCK(__kmp_user_lock_seq)) {
- KMP_COMPARE_AND_STORE_ACQ32((volatile kmp_int32 *)crit, 0,
- KMP_GET_D_TAG(__kmp_user_lock_seq));
+ (void)KMP_COMPARE_AND_STORE_ACQ32((volatile kmp_int32 *)crit, 0,
+ KMP_GET_D_TAG(__kmp_user_lock_seq));
} else {
__kmp_init_indirect_csptr(crit, loc, global_tid,
KMP_GET_I_TAG(__kmp_user_lock_seq));
@@ -4200,7 +4289,7 @@ void __kmpc_doacross_wait(ident_t *loc, int gtid, const kmp_int64 *vec) {
up = pr_buf->th_doacross_info[3];
st = pr_buf->th_doacross_info[4];
#if OMPT_SUPPORT && OMPT_OPTIONAL
- ompt_dependence_t deps[num_dims];
+ SimpleVLA deps(num_dims);
#endif
if (st == 1) { // most common case
if (vec[0] < lo || vec[0] > up) {
@@ -4312,7 +4401,7 @@ void __kmpc_doacross_post(ident_t *loc, int gtid, const kmp_int64 *vec) {
lo = pr_buf->th_doacross_info[2];
st = pr_buf->th_doacross_info[4];
#if OMPT_SUPPORT && OMPT_OPTIONAL
- ompt_dependence_t deps[num_dims];
+ SimpleVLA deps(num_dims);
#endif
if (st == 1) { // most common case
iter_number = vec[0] - lo;
@@ -4458,7 +4547,7 @@ void __kmpc_error(ident_t *loc, int severity, const char *message) {
if (loc && loc->psource) {
kmp_str_loc_t str_loc = __kmp_str_loc_init(loc->psource, false);
src_loc =
- __kmp_str_format("%s:%s:%s", str_loc.file, str_loc.line, str_loc.col);
+ __kmp_str_format("%s:%d:%d", str_loc.file, str_loc.line, str_loc.col);
__kmp_str_loc_free(&str_loc);
} else {
src_loc = __kmp_str_format("unknown");
diff --git a/contrib/libs/cxxsupp/openmp/kmp_dispatch.cpp b/contrib/libs/cxxsupp/openmp/kmp_dispatch.cpp
index 8acf3d429e62..2431e3a5cab5 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_dispatch.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_dispatch.cpp
@@ -90,6 +90,70 @@ static inline int __kmp_get_monotonicity(ident_t *loc, enum sched_type schedule,
return monotonicity;
}
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+// Return floating point number rounded to two decimal points
+static inline float __kmp_round_2decimal_val(float num) {
+ return (float)(static_cast(num * 100 + 0.5)) / 100;
+}
+static inline int __kmp_get_round_val(float num) {
+ return static_cast(num < 0 ? num - 0.5 : num + 0.5);
+}
+#endif
+
+template
+inline void
+__kmp_initialize_self_buffer(kmp_team_t *team, T id,
+ dispatch_private_info_template *pr,
+ typename traits_t::unsigned_t nchunks, T nproc,
+ typename traits_t::unsigned_t &init,
+ T &small_chunk, T &extras, T &p_extra) {
+
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ if (pr->flags.use_hybrid) {
+ kmp_info_t *th = __kmp_threads[__kmp_gtid_from_tid((int)id, team)];
+ kmp_hw_core_type_t type =
+ (kmp_hw_core_type_t)th->th.th_topology_attrs.core_type;
+ T pchunks = pr->u.p.pchunks;
+ T echunks = nchunks - pchunks;
+ T num_procs_with_pcore = pr->u.p.num_procs_with_pcore;
+ T num_procs_with_ecore = nproc - num_procs_with_pcore;
+ T first_thread_with_ecore = pr->u.p.first_thread_with_ecore;
+ T big_chunk =
+ pchunks / num_procs_with_pcore; // chunks per thread with p-core
+ small_chunk =
+ echunks / num_procs_with_ecore; // chunks per thread with e-core
+
+ extras =
+ (pchunks % num_procs_with_pcore) + (echunks % num_procs_with_ecore);
+
+ p_extra = (big_chunk - small_chunk);
+
+ if (type == KMP_HW_CORE_TYPE_CORE) {
+ if (id < first_thread_with_ecore) {
+ init = id * small_chunk + id * p_extra + (id < extras ? id : extras);
+ } else {
+ init = id * small_chunk + (id - num_procs_with_ecore) * p_extra +
+ (id < extras ? id : extras);
+ }
+ } else {
+ if (id == first_thread_with_ecore) {
+ init = id * small_chunk + id * p_extra + (id < extras ? id : extras);
+ } else {
+ init = id * small_chunk + first_thread_with_ecore * p_extra +
+ (id < extras ? id : extras);
+ }
+ }
+ p_extra = (type == KMP_HW_CORE_TYPE_CORE) ? p_extra : 0;
+ return;
+ }
+#endif
+
+ small_chunk = nchunks / nproc; // chunks per thread
+ extras = nchunks % nproc;
+ p_extra = 0;
+ init = id * small_chunk + (id < extras ? id : extras);
+}
+
#if KMP_STATIC_STEAL_ENABLED
enum { // values for steal_flag (possible states of private per-loop buffer)
UNUSED = 0,
@@ -366,7 +430,7 @@ void __kmp_dispatch_init_algorithm(ident_t *loc, int gtid,
switch (schedule) {
#if KMP_STATIC_STEAL_ENABLED
case kmp_sch_static_steal: {
- T ntc, init;
+ T ntc, init = 0;
KD_TRACE(100,
("__kmp_dispatch_init_algorithm: T#%d kmp_sch_static_steal case\n",
@@ -376,7 +440,7 @@ void __kmp_dispatch_init_algorithm(ident_t *loc, int gtid,
if (nproc > 1 && ntc >= nproc) {
KMP_COUNT_BLOCK(OMP_LOOP_STATIC_STEAL);
T id = tid;
- T small_chunk, extras;
+ T small_chunk, extras, p_extra = 0;
kmp_uint32 old = UNUSED;
int claimed = pr->steal_flag.compare_exchange_strong(old, CLAIMED);
if (traits_t::type_size > 4) {
@@ -388,13 +452,110 @@ void __kmp_dispatch_init_algorithm(ident_t *loc, int gtid,
pr->u.p.steal_lock = (kmp_lock_t *)__kmp_allocate(sizeof(kmp_lock_t));
__kmp_init_lock(pr->u.p.steal_lock);
}
- small_chunk = ntc / nproc;
- extras = ntc % nproc;
- init = id * small_chunk + (id < extras ? id : extras);
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ // Iterations are divided in a 60/40 skewed distribution among CORE and
+ // ATOM processors for hybrid systems
+ bool use_hybrid = false;
+ kmp_hw_core_type_t core_type = KMP_HW_CORE_TYPE_UNKNOWN;
+ T first_thread_with_ecore = 0;
+ T num_procs_with_pcore = 0;
+ T num_procs_with_ecore = 0;
+ T p_ntc = 0, e_ntc = 0;
+ if (__kmp_is_hybrid_cpu() && __kmp_affinity.type != affinity_none &&
+ __kmp_affinity.type != affinity_explicit) {
+ use_hybrid = true;
+ core_type = (kmp_hw_core_type_t)th->th.th_topology_attrs.core_type;
+ if (core_type != KMP_HW_CORE_TYPE_UNKNOWN &&
+ __kmp_first_osid_with_ecore > -1) {
+ for (int i = 0; i < team->t.t_nproc; ++i) {
+ kmp_hw_core_type_t type = (kmp_hw_core_type_t)team->t.t_threads[i]
+ ->th.th_topology_attrs.core_type;
+ int id = team->t.t_threads[i]->th.th_topology_ids.os_id;
+ if (id == __kmp_first_osid_with_ecore) {
+ first_thread_with_ecore =
+ team->t.t_threads[i]->th.th_info.ds.ds_tid;
+ }
+ if (type == KMP_HW_CORE_TYPE_CORE) {
+ num_procs_with_pcore++;
+ } else if (type == KMP_HW_CORE_TYPE_ATOM) {
+ num_procs_with_ecore++;
+ } else {
+ use_hybrid = false;
+ break;
+ }
+ }
+ }
+ if (num_procs_with_pcore > 0 && num_procs_with_ecore > 0) {
+ float multiplier = 60.0 / 40.0;
+ float p_ratio = (float)num_procs_with_pcore / nproc;
+ float e_ratio = (float)num_procs_with_ecore / nproc;
+ float e_multiplier =
+ (float)1 /
+ (((multiplier * num_procs_with_pcore) / nproc) + e_ratio);
+ float p_multiplier = multiplier * e_multiplier;
+ p_ntc = __kmp_get_round_val(ntc * p_ratio * p_multiplier);
+ if ((int)p_ntc > (int)(ntc * p_ratio * p_multiplier))
+ e_ntc =
+ (int)(__kmp_round_2decimal_val(ntc * e_ratio * e_multiplier));
+ else
+ e_ntc = __kmp_get_round_val(ntc * e_ratio * e_multiplier);
+ KMP_DEBUG_ASSERT(ntc == p_ntc + e_ntc);
+
+ // Use regular static steal if not enough chunks for skewed
+ // distribution
+ use_hybrid = (use_hybrid && (p_ntc >= num_procs_with_pcore &&
+ e_ntc >= num_procs_with_ecore)
+ ? true
+ : false);
+ } else {
+ use_hybrid = false;
+ }
+ }
+ pr->flags.use_hybrid = use_hybrid;
+ pr->u.p.pchunks = p_ntc;
+ pr->u.p.num_procs_with_pcore = num_procs_with_pcore;
+ pr->u.p.first_thread_with_ecore = first_thread_with_ecore;
+
+ if (use_hybrid) {
+ KMP_DEBUG_ASSERT(nproc == num_procs_with_pcore + num_procs_with_ecore);
+ T big_chunk = p_ntc / num_procs_with_pcore;
+ small_chunk = e_ntc / num_procs_with_ecore;
+
+ extras =
+ (p_ntc % num_procs_with_pcore) + (e_ntc % num_procs_with_ecore);
+
+ p_extra = (big_chunk - small_chunk);
+
+ if (core_type == KMP_HW_CORE_TYPE_CORE) {
+ if (id < first_thread_with_ecore) {
+ init =
+ id * small_chunk + id * p_extra + (id < extras ? id : extras);
+ } else {
+ init = id * small_chunk + (id - num_procs_with_ecore) * p_extra +
+ (id < extras ? id : extras);
+ }
+ } else {
+ if (id == first_thread_with_ecore) {
+ init =
+ id * small_chunk + id * p_extra + (id < extras ? id : extras);
+ } else {
+ init = id * small_chunk + first_thread_with_ecore * p_extra +
+ (id < extras ? id : extras);
+ }
+ }
+ p_extra = (core_type == KMP_HW_CORE_TYPE_CORE) ? p_extra : 0;
+ } else
+#endif
+ {
+ small_chunk = ntc / nproc;
+ extras = ntc % nproc;
+ init = id * small_chunk + (id < extras ? id : extras);
+ p_extra = 0;
+ }
pr->u.p.count = init;
if (claimed) { // are we succeeded in claiming own buffer?
- pr->u.p.ub = init + small_chunk + (id < extras ? 1 : 0);
+ pr->u.p.ub = init + small_chunk + p_extra + (id < extras ? 1 : 0);
// Other threads will inspect steal_flag when searching for a victim.
// READY means other threads may steal from this thread from now on.
KMP_ATOMIC_ST_REL(&pr->steal_flag, READY);
@@ -1003,8 +1164,9 @@ __kmp_dispatch_init(ident_t *loc, int gtid, enum sched_type schedule, T lb,
ompt_team_info_t *team_info = __ompt_get_teaminfo(0, NULL);
ompt_task_info_t *task_info = __ompt_get_task_info_object(0);
ompt_callbacks.ompt_callback(ompt_callback_work)(
- ompt_work_loop, ompt_scope_begin, &(team_info->parallel_data),
- &(task_info->task_data), pr->u.p.tc, OMPT_LOAD_RETURN_ADDRESS(gtid));
+ ompt_get_work_schedule(pr->schedule), ompt_scope_begin,
+ &(team_info->parallel_data), &(task_info->task_data), pr->u.p.tc,
+ OMPT_LOAD_RETURN_ADDRESS(gtid));
}
#endif
KMP_PUSH_PARTITIONED_TIMER(OMP_loop_dynamic);
@@ -1261,13 +1423,13 @@ int __kmp_dispatch_next_algorithm(int gtid,
if (status) {
// initialize self buffer with victim's whole range of chunks
T id = victimId;
- T small_chunk, extras;
- small_chunk = nchunks / nproc; // chunks per thread
- extras = nchunks % nproc;
- init = id * small_chunk + (id < extras ? id : extras);
+ T small_chunk = 0, extras = 0, p_extra = 0;
+ __kmp_initialize_self_buffer(team, id, pr, nchunks, nproc,
+ init, small_chunk, extras,
+ p_extra);
__kmp_acquire_lock(lck, gtid);
pr->u.p.count = init + 1; // exclude one we execute immediately
- pr->u.p.ub = init + small_chunk + (id < extras ? 1 : 0);
+ pr->u.p.ub = init + small_chunk + p_extra + (id < extras ? 1 : 0);
__kmp_release_lock(lck, gtid);
pr->u.p.parm4 = (id + 1) % nproc; // remember neighbour tid
// no need to reinitialize other thread invariants: lb, st, etc.
@@ -1275,10 +1437,10 @@ int __kmp_dispatch_next_algorithm(int gtid,
{
char *buff;
// create format specifiers before the debug output
- buff = __kmp_str_format(
- "__kmp_dispatch_next: T#%%d stolen chunks from T#%%d, "
- "count:%%%s ub:%%%s\n",
- traits_t::spec, traits_t::spec);
+ buff = __kmp_str_format("__kmp_dispatch_next_algorithm: T#%%d "
+ "stolen chunks from T#%%d, "
+ "count:%%%s ub:%%%s\n",
+ traits_t::spec, traits_t::spec);
KD_TRACE(10, (buff, gtid, id, pr->u.p.count, pr->u.p.ub));
__kmp_str_free(&buff);
}
@@ -1289,7 +1451,7 @@ int __kmp_dispatch_next_algorithm(int gtid,
break;
}
}
- if (KMP_ATOMIC_LD_RLX(&v->steal_flag) != READY ||
+ if (KMP_ATOMIC_LD_ACQ(&v->steal_flag) != READY ||
v->u.p.count >= (UT)v->u.p.ub) {
pr->u.p.parm4 = (victimId + 1) % nproc; // shift start victim tid
continue; // no chunks to steal, try next victim
@@ -1404,12 +1566,12 @@ int __kmp_dispatch_next_algorithm(int gtid,
if (status) {
// initialize self buffer with victim's whole range of chunks
T id = victimId;
- T small_chunk, extras;
- small_chunk = nchunks / nproc; // chunks per thread
- extras = nchunks % nproc;
- init = id * small_chunk + (id < extras ? id : extras);
+ T small_chunk = 0, extras = 0, p_extra = 0;
+ __kmp_initialize_self_buffer(team, id, pr, nchunks, nproc,
+ init, small_chunk, extras,
+ p_extra);
vnew.p.count = init + 1;
- vnew.p.ub = init + small_chunk + (id < extras ? 1 : 0);
+ vnew.p.ub = init + small_chunk + p_extra + (id < extras ? 1 : 0);
// write pair (count, ub) at once atomically
#if KMP_ARCH_X86
KMP_XCHG_FIXED64((volatile kmp_int64 *)(&pr->u.p.count), vnew.b);
@@ -1422,10 +1584,10 @@ int __kmp_dispatch_next_algorithm(int gtid,
{
char *buff;
// create format specifiers before the debug output
- buff = __kmp_str_format(
- "__kmp_dispatch_next: T#%%d stolen chunks from T#%%d, "
- "count:%%%s ub:%%%s\n",
- traits_t::spec, traits_t::spec);
+ buff = __kmp_str_format("__kmp_dispatch_next_algorithm: T#%%d "
+ "stolen chunks from T#%%d, "
+ "count:%%%s ub:%%%s\n",
+ traits_t::spec, traits_t::spec);
KD_TRACE(10, (buff, gtid, id, pr->u.p.count, pr->u.p.ub));
__kmp_str_free(&buff);
}
@@ -1960,8 +2122,8 @@ int __kmp_dispatch_next_algorithm(int gtid,
ompt_team_info_t *team_info = __ompt_get_teaminfo(0, NULL); \
ompt_task_info_t *task_info = __ompt_get_task_info_object(0); \
ompt_callbacks.ompt_callback(ompt_callback_work)( \
- ompt_work_loop, ompt_scope_end, &(team_info->parallel_data), \
- &(task_info->task_data), 0, codeptr); \
+ ompt_get_work_schedule(pr->schedule), ompt_scope_end, \
+ &(team_info->parallel_data), &(task_info->task_data), 0, codeptr); \
} \
}
#define OMPT_LOOP_DISPATCH(lb, ub, st, status) \
@@ -2236,6 +2398,8 @@ static int __kmp_dispatch_next(ident_t *loc, int gtid, kmp_int32 *p_last,
sh->u.s.ordered_iteration = 0;
}
+ KMP_MB(); /* Flush all pending memory write invalidates. */
+
sh->buffer_index += __kmp_dispatch_num_buffers;
KD_TRACE(100, ("__kmp_dispatch_next: T#%d change buffer_index:%d\n",
gtid, sh->buffer_index));
@@ -2387,7 +2551,7 @@ thread
kmp_int32 __kmpc_next_section(ident_t *loc, kmp_int32 gtid,
kmp_int32 numberOfSections) {
- KMP_TIME_PARTITIONED_BLOCK(OMP_sections);
+ KMP_TIME_PARTITIONED_BLOCK(OMP_sections_overhead);
kmp_info_t *th = __kmp_threads[gtid];
#ifdef KMP_DEBUG
@@ -2460,7 +2624,6 @@ kmp_int32 __kmpc_next_section(ident_t *loc, kmp_int32 gtid,
ompt_dispatch_section, instance);
}
#endif
- KMP_POP_PARTITIONED_TIMER();
}
return sectionIndex;
@@ -2492,9 +2655,9 @@ void __kmpc_end_sections(ident_t *loc, kmp_int32 gtid) {
&(task_info->task_data), 0, OMPT_GET_RETURN_ADDRESS(0));
}
#endif
- KMP_POP_PARTITIONED_TIMER();
}
+ KMP_POP_PARTITIONED_TIMER();
KD_TRACE(100, ("__kmpc_end_sections: T#%d returned\n", gtid));
}
@@ -2847,6 +3010,11 @@ See @ref __kmpc_dispatch_fini_4
void __kmpc_dispatch_fini_8u(ident_t *loc, kmp_int32 gtid) {
__kmp_dispatch_finish(gtid, loc);
}
+
+/*!
+See @ref __kmpc_dispatch_deinit
+*/
+void __kmpc_dispatch_deinit(ident_t *loc, kmp_int32 gtid) {}
/*! @} */
//-----------------------------------------------------------------------------
diff --git a/contrib/libs/cxxsupp/openmp/kmp_dispatch.h b/contrib/libs/cxxsupp/openmp/kmp_dispatch.h
index 154db174613d..cf19eb52662c 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_dispatch.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_dispatch.h
@@ -75,14 +75,17 @@ template struct dispatch_private_infoXX_template {
ST st; // signed
UT tc; // unsigned
kmp_lock_t *steal_lock; // lock used for chunk stealing
+
+ UT ordered_lower; // unsigned
+ UT ordered_upper; // unsigned
+
/* parm[1-4] are used in different ways by different scheduling algorithms */
- // KMP_ALIGN( 32 ) ensures ( if the KMP_ALIGN macro is turned on )
+ // KMP_ALIGN(32) ensures ( if the KMP_ALIGN macro is turned on )
// a) parm3 is properly aligned and
// b) all parm1-4 are in the same cache line.
// Because of parm1-4 are used together, performance seems to be better
// if they are in the same line (not measured though).
-
struct KMP_ALIGN(32) { // compiler does not accept sizeof(T)*4
T parm1;
T parm2;
@@ -90,8 +93,11 @@ template struct dispatch_private_infoXX_template {
T parm4;
};
- UT ordered_lower; // unsigned
- UT ordered_upper; // unsigned
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+ UT pchunks; // total number of chunks for processes with p-core
+ UT num_procs_with_pcore; // number of threads with p-core
+ T first_thread_with_ecore;
+#endif
#if KMP_OS_WINDOWS
T last_upper;
#endif /* KMP_OS_WINDOWS */
diff --git a/contrib/libs/cxxsupp/openmp/kmp_environment.cpp b/contrib/libs/cxxsupp/openmp/kmp_environment.cpp
index b35027b57f03..4def6ea9ac20 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_environment.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_environment.cpp
@@ -407,9 +407,11 @@ ___kmp_env_blk_parse_unix(kmp_env_blk_t *block, // M: Env block to fill.
int i;
var = bulk;
for (i = 0; i < count; ++i) {
+ KMP_ASSERT(var < bulk + size);
+ [[maybe_unused]] size_t ssize = size - (var - bulk);
// Copy variable to bulk.
len = KMP_STRLEN(env[i]);
- KMP_MEMCPY_S(var, size, env[i], len + 1);
+ KMP_MEMCPY_S(var, ssize, env[i], len + 1);
// Save found variable in vars array.
__kmp_str_split(var, '=', &name, &value);
vars[i].name = name;
diff --git a/contrib/libs/cxxsupp/openmp/kmp_ftn_entry.h b/contrib/libs/cxxsupp/openmp/kmp_ftn_entry.h
index 6b332244c6da..8882899c4838 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_ftn_entry.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_ftn_entry.h
@@ -112,17 +112,19 @@ void FTN_STDCALL FTN_SET_BLOCKTIME(int KMP_DEREF arg) {
#ifdef KMP_STUB
__kmps_set_blocktime(KMP_DEREF arg);
#else
- int gtid, tid;
+ int gtid, tid, bt = (KMP_DEREF arg);
kmp_info_t *thread;
gtid = __kmp_entry_gtid();
tid = __kmp_tid_from_gtid(gtid);
thread = __kmp_thread_from_gtid(gtid);
- __kmp_aux_set_blocktime(KMP_DEREF arg, thread, tid);
+ __kmp_aux_convert_blocktime(&bt);
+ __kmp_aux_set_blocktime(bt, thread, tid);
#endif
}
+// Gets blocktime in units used for KMP_BLOCKTIME, ms otherwise
int FTN_STDCALL FTN_GET_BLOCKTIME(void) {
#ifdef KMP_STUB
return __kmps_get_blocktime();
@@ -136,21 +138,24 @@ int FTN_STDCALL FTN_GET_BLOCKTIME(void) {
/* These must match the settings used in __kmp_wait_sleep() */
if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
- KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
- team->t.t_id, tid, KMP_MAX_BLOCKTIME));
+ KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
+ team->t.t_id, tid, KMP_MAX_BLOCKTIME, __kmp_blocktime_units));
return KMP_MAX_BLOCKTIME;
}
#ifdef KMP_ADJUST_BLOCKTIME
else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
- KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
- team->t.t_id, tid, 0));
+ KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
+ team->t.t_id, tid, 0, __kmp_blocktime_units));
return 0;
}
#endif /* KMP_ADJUST_BLOCKTIME */
else {
- KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
- team->t.t_id, tid, get__blocktime(team, tid)));
- return get__blocktime(team, tid);
+ int bt = get__blocktime(team, tid);
+ if (__kmp_blocktime_units == 'm')
+ bt = bt / 1000;
+ KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
+ team->t.t_id, tid, bt, __kmp_blocktime_units));
+ return bt;
}
#endif
}
@@ -239,7 +244,8 @@ int FTN_STDCALL FTN_GET_AFFINITY(void **mask) {
}
__kmp_assign_root_init_mask();
int gtid = __kmp_get_gtid();
- if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
+ __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
return __kmp_aux_get_affinity(mask);
@@ -365,7 +371,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_THREADS)(void) {
gtid = __kmp_entry_gtid();
thread = __kmp_threads[gtid];
#if KMP_AFFINITY_SUPPORTED
- if (thread->th.th_team->t.t_level == 0 && !__kmp_affin_reset) {
+ if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
__kmp_assign_root_init_mask();
}
#endif
@@ -518,7 +524,8 @@ void FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_DISPLAY_AFFINITY)(
__kmp_assign_root_init_mask();
gtid = __kmp_get_gtid();
#if KMP_AFFINITY_SUPPORTED
- if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
+ __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
#endif
@@ -551,7 +558,8 @@ size_t FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_CAPTURE_AFFINITY)(
__kmp_assign_root_init_mask();
gtid = __kmp_get_gtid();
#if KMP_AFFINITY_SUPPORTED
- if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
+ __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
#endif
@@ -574,7 +582,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
int gtid;
#if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
- KMP_OS_HURD || KMP_OS_OPENBSD
+ KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
gtid = __kmp_entry_gtid();
#elif KMP_OS_WINDOWS
if (!__kmp_init_parallel ||
@@ -585,7 +593,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
return 0;
}
--gtid; // We keep (gtid+1) in TLS
-#elif KMP_OS_LINUX
+#elif KMP_OS_LINUX || KMP_OS_WASI
#ifdef KMP_TDATA_GTID
if (__kmp_gtid_mode >= 3) {
if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
@@ -631,7 +639,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PROCS)(void) {
__kmp_middle_initialize();
}
#if KMP_AFFINITY_SUPPORTED
- if (!__kmp_affin_reset) {
+ if (!__kmp_affinity.flags.reset) {
// only bind root here if its affinity reset is not requested
int gtid = __kmp_entry_gtid();
kmp_info_t *thread = __kmp_threads[gtid];
@@ -799,6 +807,10 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_LIMIT)(void) {
gtid = __kmp_entry_gtid();
thread = __kmp_threads[gtid];
+ // If thread_limit for the target task is defined, return that instead of the
+ // regular task thread_limit
+ if (int thread_limit = thread->th.th_current_task->td_icvs.task_thread_limit)
+ return thread_limit;
return thread->th.th_current_task->td_icvs.thread_limit;
#endif
}
@@ -831,7 +843,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PLACES)(void) {
}
if (!KMP_AFFINITY_CAPABLE())
return 0;
- if (!__kmp_affin_reset) {
+ if (!__kmp_affinity.flags.reset) {
// only bind root here if its affinity reset is not requested
int gtid = __kmp_entry_gtid();
kmp_info_t *thread = __kmp_threads[gtid];
@@ -839,7 +851,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PLACES)(void) {
__kmp_assign_root_init_mask();
}
}
- return __kmp_affinity_num_masks;
+ return __kmp_affinity.num_masks;
#endif
}
@@ -854,7 +866,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(int place_num) {
}
if (!KMP_AFFINITY_CAPABLE())
return 0;
- if (!__kmp_affin_reset) {
+ if (!__kmp_affinity.flags.reset) {
// only bind root here if its affinity reset is not requested
int gtid = __kmp_entry_gtid();
kmp_info_t *thread = __kmp_threads[gtid];
@@ -862,9 +874,9 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(int place_num) {
__kmp_assign_root_init_mask();
}
}
- if (place_num < 0 || place_num >= (int)__kmp_affinity_num_masks)
+ if (place_num < 0 || place_num >= (int)__kmp_affinity.num_masks)
return 0;
- kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
+ kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity.masks, place_num);
KMP_CPU_SET_ITERATE(i, mask) {
if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
(!KMP_CPU_ISSET(i, mask))) {
@@ -887,7 +899,7 @@ void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(int place_num,
}
if (!KMP_AFFINITY_CAPABLE())
return;
- if (!__kmp_affin_reset) {
+ if (!__kmp_affinity.flags.reset) {
// only bind root here if its affinity reset is not requested
int gtid = __kmp_entry_gtid();
kmp_info_t *thread = __kmp_threads[gtid];
@@ -895,9 +907,9 @@ void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(int place_num,
__kmp_assign_root_init_mask();
}
}
- if (place_num < 0 || place_num >= (int)__kmp_affinity_num_masks)
+ if (place_num < 0 || place_num >= (int)__kmp_affinity.num_masks)
return;
- kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
+ kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity.masks, place_num);
j = 0;
KMP_CPU_SET_ITERATE(i, mask) {
if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
@@ -922,7 +934,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM)(void) {
return -1;
gtid = __kmp_entry_gtid();
thread = __kmp_thread_from_gtid(gtid);
- if (thread->th.th_team->t.t_level == 0 && !__kmp_affin_reset) {
+ if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
__kmp_assign_root_init_mask();
}
if (thread->th.th_current_place < 0)
@@ -944,7 +956,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_NUM_PLACES)(void) {
return 0;
gtid = __kmp_entry_gtid();
thread = __kmp_thread_from_gtid(gtid);
- if (thread->th.th_team->t.t_level == 0 && !__kmp_affin_reset) {
+ if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
__kmp_assign_root_init_mask();
}
first_place = thread->th.th_first_place;
@@ -954,7 +966,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_NUM_PLACES)(void) {
if (first_place <= last_place)
num_places = last_place - first_place + 1;
else
- num_places = __kmp_affinity_num_masks - first_place + last_place + 1;
+ num_places = __kmp_affinity.num_masks - first_place + last_place + 1;
return num_places;
#endif
}
@@ -973,7 +985,7 @@ KMP_EXPAND_NAME(FTN_GET_PARTITION_PLACE_NUMS)(int *place_nums) {
return;
gtid = __kmp_entry_gtid();
thread = __kmp_thread_from_gtid(gtid);
- if (thread->th.th_team->t.t_level == 0 && !__kmp_affin_reset) {
+ if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
__kmp_assign_root_init_mask();
}
first_place = thread->th.th_first_place;
@@ -1031,7 +1043,7 @@ void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DEFAULT_DEVICE)(int KMP_DEREF arg) {
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void)
KMP_WEAK_ATTRIBUTE_EXTERNAL;
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) {
-#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
+#if KMP_MIC || KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return 0;
#else
int (*fptr)();
@@ -1415,6 +1427,8 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_PAUSE_RESOURCE)(kmp_pause_status_t kind,
#ifdef KMP_STUB
return 1; // just fail
#else
+ if (kind == kmp_stop_tool_paused)
+ return 1; // stop_tool must not be specified
if (device_num == KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)())
return __kmpc_pause_resource(kind);
else {
@@ -1546,14 +1560,14 @@ typedef void *omp_interop_t;
// libomptarget, if loaded, provides this function
int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) {
-#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return 0;
#else
int (*fptr)(const omp_interop_t);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties")))
return (*fptr)(interop);
return 0;
-#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB)
+#endif
}
/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp
@@ -1561,57 +1575,81 @@ int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) {
intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop,
omp_interop_property_t property_id,
int *err) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return 0;
+#else
intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int")))
return (*fptr)(interop, property_id, err);
return 0;
+#endif
}
// libomptarget, if loaded, provides this function
void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop,
omp_interop_property_t property_id,
int *err) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return nullptr;
+#else
void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr")))
return (*fptr)(interop, property_id, err);
return nullptr;
+#endif
}
// libomptarget, if loaded, provides this function
const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop,
omp_interop_property_t property_id,
int *err) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return nullptr;
+#else
const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str")))
return (*fptr)(interop, property_id, err);
return nullptr;
+#endif
}
// libomptarget, if loaded, provides this function
const char *FTN_STDCALL FTN_GET_INTEROP_NAME(
const omp_interop_t interop, omp_interop_property_t property_id) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return nullptr;
+#else
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_name")))
return (*fptr)(interop, property_id);
return nullptr;
+#endif
}
// libomptarget, if loaded, provides this function
const char *FTN_STDCALL FTN_GET_INTEROP_TYPE_DESC(
const omp_interop_t interop, omp_interop_property_t property_id) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return nullptr;
+#else
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_type_desc")))
return (*fptr)(interop, property_id);
return nullptr;
+#endif
}
// libomptarget, if loaded, provides this function
const char *FTN_STDCALL FTN_GET_INTEROP_RC_DESC(
const omp_interop_t interop, omp_interop_property_t property_id) {
+#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
+ return nullptr;
+#else
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_rec_desc")))
return (*fptr)(interop, property_id);
return nullptr;
+#endif
}
// display environment variables when requested
diff --git a/contrib/libs/cxxsupp/openmp/kmp_ftn_os.h b/contrib/libs/cxxsupp/openmp/kmp_ftn_os.h
index d37c9c86028e..7d595b947f4a 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_ftn_os.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_ftn_os.h
@@ -116,6 +116,8 @@
#define FTN_TARGET_IS_PRESENT omp_target_is_present
#define FTN_TARGET_MEMCPY omp_target_memcpy
#define FTN_TARGET_MEMCPY_RECT omp_target_memcpy_rect
+#define FTN_TARGET_MEMSET omp_target_memset
+#define FTN_TARGET_MEMSET_ASYNC omp_target_memset_async
#define FTN_TARGET_ASSOCIATE_PTR omp_target_associate_ptr
#define FTN_TARGET_DISASSOCIATE_PTR omp_target_disassociate_ptr
#endif
diff --git a/contrib/libs/cxxsupp/openmp/kmp_global.cpp b/contrib/libs/cxxsupp/openmp/kmp_global.cpp
index 04b63c72d6e6..30fb65163cd8 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_global.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_global.cpp
@@ -63,8 +63,8 @@ int __kmp_init_counter = 0;
int __kmp_root_counter = 0;
int __kmp_version = 0;
-std::atomic __kmp_team_counter = ATOMIC_VAR_INIT(0);
-std::atomic __kmp_task_counter = ATOMIC_VAR_INIT(0);
+std::atomic __kmp_team_counter = 0;
+std::atomic __kmp_task_counter = 0;
size_t __kmp_stksize = KMP_DEFAULT_STKSIZE;
#if KMP_USE_MONITOR
@@ -125,6 +125,7 @@ size_t __kmp_sys_min_stksize = KMP_MIN_STKSIZE;
int __kmp_sys_max_nth = KMP_MAX_NTH;
int __kmp_max_nth = 0;
int __kmp_cg_max_nth = 0;
+int __kmp_task_max_nth = 0;
int __kmp_teams_max_nth = 0;
int __kmp_threads_capacity = 0;
int __kmp_dflt_team_nth = 0;
@@ -154,7 +155,8 @@ int __kmp_hier_max_units[kmp_hier_layer_e::LAYER_LAST + 1];
int __kmp_hier_threads_per[kmp_hier_layer_e::LAYER_LAST + 1];
kmp_hier_sched_env_t __kmp_hier_scheds = {0, 0, NULL, NULL, NULL};
#endif
-int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
+int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME; // in microseconds
+char __kmp_blocktime_units = 'm'; // Units specified in KMP_BLOCKTIME
bool __kmp_wpolicy_passive = false;
#if KMP_USE_MONITOR
int __kmp_monitor_wakeups = KMP_MIN_MONITOR_WAKEUPS;
@@ -170,7 +172,7 @@ int __kmp_ncores = 0;
int __kmp_chunk = 0;
int __kmp_force_monotonic = 0;
int __kmp_abort_delay = 0;
-#if KMP_OS_LINUX && defined(KMP_TDATA_GTID)
+#if (KMP_OS_LINUX || KMP_OS_AIX) && defined(KMP_TDATA_GTID)
int __kmp_gtid_mode = 3; /* use __declspec(thread) TLS to store gtid */
int __kmp_adjust_gtid_mode = FALSE;
#elif KMP_OS_WINDOWS
@@ -269,23 +271,20 @@ kmp_SetThreadGroupAffinity_t __kmp_SetThreadGroupAffinity = NULL;
#endif /* KMP_OS_WINDOWS */
size_t __kmp_affin_mask_size = 0;
-enum affinity_type __kmp_affinity_type = affinity_default;
-kmp_hw_t __kmp_affinity_gran = KMP_HW_UNKNOWN;
-int __kmp_affinity_gran_levels = -1;
-int __kmp_affinity_dups = TRUE;
enum affinity_top_method __kmp_affinity_top_method =
affinity_top_method_default;
-int __kmp_affinity_compact = 0;
-int __kmp_affinity_offset = 0;
-int __kmp_affinity_verbose = FALSE;
-int __kmp_affinity_warnings = TRUE;
-int __kmp_affinity_respect_mask = affinity_respect_mask_default;
-char *__kmp_affinity_proclist = NULL;
-kmp_affin_mask_t *__kmp_affinity_masks = NULL;
-unsigned __kmp_affinity_num_masks = 0;
+
+// Regular thread affinity settings from KMP_AFFINITY
+kmp_affinity_t __kmp_affinity = KMP_AFFINITY_INIT("KMP_AFFINITY");
+// Hidden helper thread affinity settings from KMP_HIDDEN_HELPER_AFFINITY
+kmp_affinity_t __kmp_hh_affinity =
+ KMP_AFFINITY_INIT("KMP_HIDDEN_HELPER_AFFINITY");
+kmp_affinity_t *__kmp_affinities[] = {&__kmp_affinity, &__kmp_hh_affinity};
char *__kmp_cpuinfo_file = NULL;
-bool __kmp_affin_reset = 0;
+#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
+int __kmp_first_osid_with_ecore = -1;
+#endif
#endif /* KMP_AFFINITY_SUPPORTED */
@@ -392,7 +391,7 @@ int __kmp_debug_buf_atomic =
char *__kmp_debug_buffer = NULL; /* Debug buffer itself */
std::atomic __kmp_debug_count =
- ATOMIC_VAR_INIT(0); /* number of lines printed in buffer so far */
+ 0; /* number of lines printed in buffer so far */
int __kmp_debug_buf_warn_chars =
0; /* Keep track of char increase recommended in warnings */
/* end rotating debug buffer */
@@ -460,7 +459,7 @@ volatile kmp_info_t *__kmp_thread_pool = NULL;
volatile kmp_team_t *__kmp_team_pool = NULL;
KMP_ALIGN_CACHE
-std::atomic __kmp_thread_pool_active_nth = ATOMIC_VAR_INIT(0);
+std::atomic __kmp_thread_pool_active_nth = 0;
/* -------------------------------------------------
* GLOBAL/ROOT STATE */
@@ -553,13 +552,6 @@ int get_suspend_count_(void) {
void set_suspend_count_(int *value) { __kmp_suspend_count = *value; }
#endif
-// Symbols for MS mutual detection.
-int _You_must_link_with_exactly_one_OpenMP_library = 1;
-int _You_must_link_with_Intel_OpenMP_library = 1;
-#if KMP_OS_WINDOWS && (KMP_VERSION_MAJOR > 4)
-int _You_must_link_with_Microsoft_OpenMP_library = 1;
-#endif
-
kmp_target_offload_kind_t __kmp_target_offload = tgt_default;
// OMP Pause Resources
@@ -570,4 +562,17 @@ int __kmp_nesting_mode = 0;
int __kmp_nesting_mode_nlevels = 1;
int *__kmp_nesting_nth_level;
+#if OMPX_TASKGRAPH
+// TDG record & replay
+int __kmp_tdg_dot = 0;
+kmp_int32 __kmp_max_tdgs = 100;
+kmp_tdg_info_t **__kmp_global_tdgs = NULL;
+kmp_int32 __kmp_curr_tdg_idx =
+ 0; // Id of the current TDG being recorded or executed
+kmp_int32 __kmp_num_tdg = 0;
+kmp_int32 __kmp_successors_size = 10; // Initial succesor size list for
+ // recording
+std::atomic __kmp_tdg_task_id = 0;
+#endif
// end of file //
+
diff --git a/contrib/libs/cxxsupp/openmp/kmp_gsupport.cpp b/contrib/libs/cxxsupp/openmp/kmp_gsupport.cpp
index d77d4809a7e9..86cf16470e14 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_gsupport.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_gsupport.cpp
@@ -12,6 +12,7 @@
#include "kmp.h"
#include "kmp_atomic.h"
+#include "kmp_utils.h"
#if OMPT_SUPPORT
#include "ompt-specific.h"
@@ -143,7 +144,7 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_BARRIER)(void) {
// Mutual exclusion
-// The symbol that icc/ifort generates for unnamed for unnamed critical sections
+// The symbol that icc/ifort generates for unnamed critical sections
// - .gomp_critical_user_ - is defined using .comm in any objects reference it.
// We can't reference it directly here in C code, as the symbol contains a ".".
//
@@ -356,7 +357,8 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_ORDERED_END)(void) {
// They come in two flavors: 64-bit unsigned, and either 32-bit signed
// (IA-32 architecture) or 64-bit signed (Intel(R) 64).
-#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
+#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \
+ KMP_ARCH_PPC || KMP_ARCH_AARCH64_32
#define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4
#define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4
#define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4
@@ -1280,7 +1282,7 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_TASK)(void (*func)(void *), void *data,
KMP_ASSERT(depend);
kmp_gomp_depends_info_t gomp_depends(depend);
kmp_int32 ndeps = gomp_depends.get_num_deps();
- kmp_depend_info_t dep_list[ndeps];
+ SimpleVLA dep_list(ndeps);
for (kmp_int32 i = 0; i < ndeps; i++)
dep_list[i] = gomp_depends.get_kmp_depend(i);
kmp_int32 ndeps_cnv;
@@ -1309,7 +1311,7 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_TASK)(void (*func)(void *), void *data,
KMP_ASSERT(depend);
kmp_gomp_depends_info_t gomp_depends(depend);
kmp_int32 ndeps = gomp_depends.get_num_deps();
- kmp_depend_info_t dep_list[ndeps];
+ SimpleVLA dep_list(ndeps);
for (kmp_int32 i = 0; i < ndeps; i++)
dep_list[i] = gomp_depends.get_kmp_depend(i);
__kmpc_omp_wait_deps(&loc, gtid, ndeps, dep_list, 0, NULL);
@@ -1993,7 +1995,7 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_TASKWAIT_DEPEND)(void **depend) {
KA_TRACE(20, ("GOMP_taskwait_depend: T#%d\n", gtid));
kmp_gomp_depends_info_t gomp_depends(depend);
kmp_int32 ndeps = gomp_depends.get_num_deps();
- kmp_depend_info_t dep_list[ndeps];
+ SimpleVLA dep_list(ndeps);
for (kmp_int32 i = 0; i < ndeps; i++)
dep_list[i] = gomp_depends.get_kmp_depend(i);
#if OMPT_SUPPORT
diff --git a/contrib/libs/cxxsupp/openmp/kmp_i18n_default.inc b/contrib/libs/cxxsupp/openmp/kmp_i18n_default.inc
index 776cca2b66cf..ec0f81d9cf5a 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_i18n_default.inc
+++ b/contrib/libs/cxxsupp/openmp/kmp_i18n_default.inc
@@ -1,5 +1,5 @@
// Do not edit this file! //
-// The file was generated from en_US.txt by message-converter.pl. //
+// The file was generated from en_US.txt by message-converter.py on Fri Jul 11 21:54:37 2025 (fixed date by patch) //
static char const *
__kmp_i18n_default_meta[] =
@@ -414,6 +414,9 @@ __kmp_i18n_default_messages[] =
"KMP_HW_SUBSET ignored: all hardware resources would be filtered, please reduce the filter.",
"KMP_HW_SUBSET ignored: Too many attributes specified. This machine is not a hybrid architecutre.",
"KMP_HW_SUBSET: ignoring %1$s attribute. This machine is not a hybrid architecutre.",
+ "Target memory not available, will use default allocator.",
+ "%1$s ignored: This machine is not a hybrid architecutre. Using \"%2$s\" instead.",
+ "%1$s ignored: %2$s is not available. Using \"%3$s\" instead.",
NULL
};
@@ -421,7 +424,7 @@ static char const *
__kmp_i18n_default_hints[] =
{
NULL,
- "Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources. For information on submitting this issue, please see https://bugs.llvm.org/.",
+ "Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources. For information on submitting this issue, please see https://github.com/llvm/llvm-project/issues/.",
"Check NLSPATH environment variable, its value is \"%1$s\".",
"Please try changing the shell stack limit or adjusting the OMP_STACKSIZE environment variable.",
"Consider unsetting KMP_DEVICE_THREAD_LIMIT (KMP_ALL_THREADS), KMP_TEAMS_THREAD_LIMIT, and OMP_THREAD_LIMIT (if any are set).",
@@ -466,7 +469,7 @@ __kmp_i18n_sections[] =
{ 5, __kmp_i18n_default_meta },
{ 79, __kmp_i18n_default_strings },
{ 6, __kmp_i18n_default_formats },
- { 298, __kmp_i18n_default_messages },
+ { 301, __kmp_i18n_default_messages },
{ 29, __kmp_i18n_default_hints },
{ 0, NULL }
};
diff --git a/contrib/libs/cxxsupp/openmp/kmp_i18n_id.inc b/contrib/libs/cxxsupp/openmp/kmp_i18n_id.inc
index a66f8117c2df..07872f029048 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_i18n_id.inc
+++ b/contrib/libs/cxxsupp/openmp/kmp_i18n_id.inc
@@ -1,5 +1,5 @@
// Do not edit this file! //
-// The file was generated from en_US.txt by message-converter.pl. //
+// The file was generated from en_US.txt by message-converter.py on Fri Jul 11 21:54:37 2025 (fixed date by patch) //
enum kmp_i18n_id {
@@ -408,6 +408,9 @@ enum kmp_i18n_id {
kmp_i18n_msg_AffHWSubsetAllFiltered,
kmp_i18n_msg_AffHWSubsetAttrsNonHybrid,
kmp_i18n_msg_AffHWSubsetIgnoringAttr,
+ kmp_i18n_msg_TargetMemNotAvailable,
+ kmp_i18n_msg_AffIgnoringNonHybrid,
+ kmp_i18n_msg_AffIgnoringNotAvailable,
kmp_i18n_msg_last,
// Set #5, hints.
diff --git a/contrib/libs/cxxsupp/openmp/kmp_io.cpp b/contrib/libs/cxxsupp/openmp/kmp_io.cpp
index 578e6e671cdf..0c52662bc235 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_io.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_io.cpp
@@ -50,24 +50,6 @@ static HANDLE __kmp_stderr = NULL;
static int __kmp_console_exists = FALSE;
static kmp_str_buf_t __kmp_console_buf;
-static int is_console(void) {
- char buffer[128];
- DWORD rc = 0;
- DWORD err = 0;
- // Try to get console title.
- SetLastError(0);
- // GetConsoleTitle does not reset last error in case of success or short
- // buffer, so we need to clear it explicitly.
- rc = GetConsoleTitle(buffer, sizeof(buffer));
- if (rc == 0) {
- // rc == 0 means getting console title failed. Let us find out why.
- err = GetLastError();
- // err == 0 means buffer too short (we suppose console exists).
- // In Window applications we usually have err == 6 (invalid handle).
- }
- return rc > 0 || err == 0;
-}
-
void __kmp_close_console(void) {
/* wait until user presses return before closing window */
/* TODO only close if a window was opened */
@@ -84,7 +66,6 @@ void __kmp_close_console(void) {
static void __kmp_redirect_output(void) {
__kmp_acquire_bootstrap_lock(&__kmp_console_lock);
- (void)is_console;
if (!__kmp_console_exists) {
HANDLE ho;
HANDLE he;
diff --git a/contrib/libs/cxxsupp/openmp/kmp_lock.cpp b/contrib/libs/cxxsupp/openmp/kmp_lock.cpp
index 8fcddc710862..0ad14f862bcb 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_lock.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_lock.cpp
@@ -2689,7 +2689,7 @@ void __kmp_spin_backoff(kmp_backoff_t *boff) {
// lock word.
static void __kmp_init_direct_lock(kmp_dyna_lock_t *lck,
kmp_dyna_lockseq_t seq) {
- TCW_4(*lck, KMP_GET_D_TAG(seq));
+ TCW_4(((kmp_base_tas_lock_t *)lck)->poll, KMP_GET_D_TAG(seq));
KA_TRACE(
20,
("__kmp_init_direct_lock: initialized direct lock with type#%d\n", seq));
@@ -3180,8 +3180,8 @@ kmp_indirect_lock_t *__kmp_allocate_indirect_lock(void **user_lock,
lck->type = tag;
if (OMP_LOCK_T_SIZE < sizeof(void *)) {
- *((kmp_lock_index_t *)user_lock) = idx
- << 1; // indirect lock word must be even
+ *(kmp_lock_index_t *)&(((kmp_base_tas_lock_t *)user_lock)->poll) =
+ idx << 1; // indirect lock word must be even
} else {
*((kmp_indirect_lock_t **)user_lock) = lck;
}
@@ -3809,7 +3809,7 @@ static kmp_lock_index_t __kmp_lock_table_insert(kmp_user_lock_p lck) {
sizeof(kmp_user_lock_p) * (__kmp_user_lock_table.used - 1));
table[0] = (kmp_user_lock_p)__kmp_user_lock_table.table;
// We cannot free the previous table now, since it may be in use by other
- // threads. So save the pointer to the previous table in in the first
+ // threads. So save the pointer to the previous table in the first
// element of the new table. All the tables will be organized into a list,
// and could be freed when library shutting down.
__kmp_user_lock_table.table = table;
diff --git a/contrib/libs/cxxsupp/openmp/kmp_lock.h b/contrib/libs/cxxsupp/openmp/kmp_lock.h
index a19f4ca323b8..6202f3d617cc 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_lock.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_lock.h
@@ -50,7 +50,7 @@ typedef struct ident ident_t;
// recent versions), but we are bounded by the pointer-sized chunks that
// the Intel compiler allocates.
-#if KMP_OS_LINUX && defined(KMP_GOMP_COMPAT)
+#if (KMP_OS_LINUX || KMP_OS_AIX) && defined(KMP_GOMP_COMPAT)
#define OMP_LOCK_T_SIZE sizeof(int)
#define OMP_NEST_LOCK_T_SIZE sizeof(void *)
#else
@@ -120,8 +120,16 @@ extern void __kmp_validate_locks(void);
struct kmp_base_tas_lock {
// KMP_LOCK_FREE(tas) => unlocked; locked: (gtid+1) of owning thread
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) && \
+ __LP64__
+ // Flip the ordering of the high and low 32-bit member to be consistent
+ // with the memory layout of the address in 64-bit big-endian.
+ kmp_int32 depth_locked; // depth locked, for nested locks only
+ std::atomic poll;
+#else
std::atomic poll;
kmp_int32 depth_locked; // depth locked, for nested locks only
+#endif
};
typedef struct kmp_base_tas_lock kmp_base_tas_lock_t;
@@ -138,7 +146,7 @@ typedef union kmp_tas_lock kmp_tas_lock_t;
// kmp_tas_lock_t xlock = KMP_TAS_LOCK_INITIALIZER( xlock );
#define KMP_TAS_LOCK_INITIALIZER(lock) \
{ \
- { ATOMIC_VAR_INIT(KMP_LOCK_FREE(tas)), 0 } \
+ { KMP_LOCK_FREE(tas), 0 } \
}
extern int __kmp_acquire_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid);
@@ -276,11 +284,7 @@ typedef union kmp_ticket_lock kmp_ticket_lock_t;
// Note the macro argument. It is important to make var properly initialized.
#define KMP_TICKET_LOCK_INITIALIZER(lock) \
{ \
- { \
- ATOMIC_VAR_INIT(true) \
- , &(lock), NULL, ATOMIC_VAR_INIT(0U), ATOMIC_VAR_INIT(0U), \
- ATOMIC_VAR_INIT(0), ATOMIC_VAR_INIT(-1) \
- } \
+ { true, &(lock), NULL, 0U, 0U, 0, -1 } \
}
extern int __kmp_acquire_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid);
@@ -1142,11 +1146,13 @@ extern int (**__kmp_indirect_test)(kmp_user_lock_p, kmp_int32);
// Extracts direct lock tag from a user lock pointer
#define KMP_EXTRACT_D_TAG(l) \
- (*((kmp_dyna_lock_t *)(l)) & ((1 << KMP_LOCK_SHIFT) - 1) & \
- -(*((kmp_dyna_lock_t *)(l)) & 1))
+ ((kmp_dyna_lock_t)((kmp_base_tas_lock_t *)(l))->poll & \
+ ((1 << KMP_LOCK_SHIFT) - 1) & \
+ -((kmp_dyna_lock_t)((kmp_tas_lock_t *)(l))->lk.poll & 1))
// Extracts indirect lock index from a user lock pointer
-#define KMP_EXTRACT_I_INDEX(l) (*(kmp_lock_index_t *)(l) >> 1)
+#define KMP_EXTRACT_I_INDEX(l) \
+ ((kmp_lock_index_t)((kmp_base_tas_lock_t *)(l))->poll >> 1)
// Returns function pointer to the direct lock function with l (kmp_dyna_lock_t
// *) and op (operation type).
diff --git a/contrib/libs/cxxsupp/openmp/kmp_os.h b/contrib/libs/cxxsupp/openmp/kmp_os.h
index 02efaa1b2613..29a281f09685 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_os.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_os.h
@@ -75,7 +75,9 @@
#error Unknown compiler
#endif
-#if (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_FREEBSD)
+#if (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
+ KMP_OS_DRAGONFLY || KMP_OS_AIX) && \
+ !KMP_OS_WASI && !KMP_OS_EMSCRIPTEN
#define KMP_AFFINITY_SUPPORTED 1
#if KMP_OS_WINDOWS && KMP_ARCH_X86_64
#define KMP_GROUP_AFFINITY 1
@@ -105,8 +107,9 @@
128-bit extended precision type yet */
typedef long double _Quad;
#elif KMP_COMPILER_GCC
-/* GCC on NetBSD lacks __multc3/__divtc3 builtins needed for quad */
-#if !KMP_OS_NETBSD
+/* GCC on NetBSD lacks __multc3/__divtc3 builtins needed for quad until
+ NetBSD 10.0 which ships with GCC 10.5 */
+#if (!KMP_OS_NETBSD || __GNUC__ >= 10)
typedef __float128 _Quad;
#undef KMP_HAVE_QUAD
#define KMP_HAVE_QUAD 1
@@ -175,16 +178,18 @@ typedef unsigned long long kmp_uint64;
#define KMP_UINT64_SPEC "llu"
#endif /* KMP_OS_UNIX */
-#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
+#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \
+ KMP_ARCH_PPC || KMP_ARCH_AARCH64_32
#define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
#elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \
- KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64
+ KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
+ KMP_ARCH_VE || KMP_ARCH_S390X
#define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
#else
#error "Can't determine size_t printf format specifier."
#endif
-#if KMP_ARCH_X86
+#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_WASM || KMP_ARCH_PPC
#define KMP_SIZE_T_MAX (0xFFFFFFFF)
#else
#define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF)
@@ -213,8 +218,9 @@ typedef kmp_uint32 kmp_uint;
#define KMP_INT_MIN ((kmp_int32)0x80000000)
// stdarg handling
-#if (KMP_ARCH_ARM || KMP_ARCH_X86_64 || KMP_ARCH_AARCH64) && \
- (KMP_OS_FREEBSD || KMP_OS_LINUX)
+#if (KMP_ARCH_ARM || KMP_ARCH_X86_64 || KMP_ARCH_AARCH64 || KMP_ARCH_WASM) && \
+ (KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_OPENBSD || KMP_OS_DRAGONFLY || \
+ KMP_OS_LINUX || KMP_OS_WASI)
typedef va_list *kmp_va_list;
#define kmp_va_deref(ap) (*(ap))
#define kmp_va_addr_of(ap) (&(ap))
@@ -303,6 +309,8 @@ template <> struct traits_t {
!KMP_MIC)
#if KMP_OS_WINDOWS
+// Don't include everything related to NT status code, we'll do that explicitly
+#define WIN32_NO_STATUS
#include
static inline int KMP_GET_PAGE_SIZE(void) {
@@ -456,13 +464,13 @@ enum kmp_mem_fence_type {
// Synchronization primitives
-#if KMP_ASM_INTRINS && KMP_OS_WINDOWS
+#if KMP_ASM_INTRINS && KMP_OS_WINDOWS && !((KMP_ARCH_AARCH64 || KMP_ARCH_ARM) && (KMP_COMPILER_CLANG || KMP_COMPILER_GCC))
#if KMP_MSVC_COMPAT && !KMP_COMPILER_CLANG
#pragma intrinsic(InterlockedExchangeAdd)
#pragma intrinsic(InterlockedCompareExchange)
#pragma intrinsic(InterlockedExchange)
-#if !(KMP_COMPILER_ICX && KMP_32_BIT_ARCH)
+#if !KMP_32_BIT_ARCH
#pragma intrinsic(InterlockedExchange64)
#endif
#endif
@@ -596,27 +604,26 @@ inline kmp_int32 __kmp_compare_and_store_ptr(void *volatile *p, void *cv,
}
// The _RET versions return the value instead of a bool
-/*
+
#define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) \
_InterlockedCompareExchange8((p), (sv), (cv))
#define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) \
_InterlockedCompareExchange16((p), (sv), (cv))
-*/
+
#define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) \
_InterlockedCompareExchange64((volatile kmp_int64 *)(p), (kmp_int64)(sv), \
(kmp_int64)(cv))
-/*
+
#define KMP_XCHG_FIXED8(p, v) \
_InterlockedExchange8((volatile kmp_int8 *)(p), (kmp_int8)(v));
-*/
-// #define KMP_XCHG_FIXED16(p, v) _InterlockedExchange16((p), (v));
-// #define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64((p), (v)));
+#define KMP_XCHG_FIXED16(p, v) _InterlockedExchange16((p), (v));
+#define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64((p), (v));
-// inline kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v) {
-// kmp_int64 tmp = _InterlockedExchange64((volatile kmp_int64 *)p, *(kmp_int64
-// *)&v); return *(kmp_real64 *)&tmp;
-// }
+inline kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v) {
+ kmp_int64 tmp = _InterlockedExchange64((volatile kmp_int64 *)p, *(kmp_int64
+ *)&v); return *(kmp_real64 *)&tmp;
+}
#else // !KMP_ARCH_AARCH64
@@ -1044,7 +1051,8 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
#endif /* KMP_OS_WINDOWS */
#if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || \
- KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64
+ KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
+ KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC || KMP_ARCH_AARCH64_32
#if KMP_OS_WINDOWS
#undef KMP_MB
#define KMP_MB() std::atomic_thread_fence(std::memory_order_seq_cst)
@@ -1058,6 +1066,15 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
#endif
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+#if KMP_MIC
+// fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used.
+// We shouldn't need it, though, since the ABI rules require that
+// * If the compiler generates NGO stores it also generates the fence
+// * If users hand-code NGO stores they should insert the fence
+// therefore no incomplete unordered stores should be visible.
+#define KMP_MFENCE() /* Nothing */
+#define KMP_SFENCE() /* Nothing */
+#else
#if KMP_COMPILER_ICC || KMP_COMPILER_ICX
#define KMP_MFENCE_() _mm_mfence()
#define KMP_SFENCE_() _mm_sfence()
@@ -1076,6 +1093,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
KMP_MFENCE_(); \
}
#define KMP_SFENCE() KMP_SFENCE_()
+#endif
#else
#define KMP_MFENCE() KMP_MB()
#define KMP_SFENCE() KMP_MB()
@@ -1134,7 +1152,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), \
(kmp_int64)(b), (kmp_int64)(c))
-#if KMP_ARCH_X86 || KMP_ARCH_MIPS
+#if KMP_ARCH_X86 || KMP_ARCH_MIPS || KMP_ARCH_WASM || KMP_ARCH_PPC
// What about ARM?
#define TCR_PTR(a) ((void *)TCR_4(a))
#define TCW_PTR(a, b) TCW_4((a), (b))
@@ -1273,12 +1291,29 @@ bool __kmp_atomic_compare_store_rel(std::atomic *p, T expected, T desired) {
// Symbol lookup on Linux/Windows
#if KMP_OS_WINDOWS
-extern void *__kmp_lookup_symbol(const char *name);
+extern void *__kmp_lookup_symbol(const char *name, bool next = false);
#define KMP_DLSYM(name) __kmp_lookup_symbol(name)
+#define KMP_DLSYM_NEXT(name) __kmp_lookup_symbol(name, true)
+#elif KMP_OS_WASI || KMP_OS_EMSCRIPTEN
+#define KMP_DLSYM(name) nullptr
#define KMP_DLSYM_NEXT(name) nullptr
#else
#define KMP_DLSYM(name) dlsym(RTLD_DEFAULT, name)
#define KMP_DLSYM_NEXT(name) dlsym(RTLD_NEXT, name)
#endif
+// MSVC doesn't have this, but clang/clang-cl does.
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
+// Same as LLVM_BUILTIN_UNREACHABLE. States that it is UB to reach this point.
+#if __has_builtin(__builtin_unreachable) || defined(__GNUC__)
+#define KMP_BUILTIN_UNREACHABLE __builtin_unreachable()
+#elif defined(_MSC_VER)
+#define KMP_BUILTIN_UNREACHABLE __assume(false)
+#else
+#define KMP_BUILTIN_UNREACHABLE
+#endif
+
#endif /* KMP_OS_H */
diff --git a/contrib/libs/cxxsupp/openmp/kmp_platform.h b/contrib/libs/cxxsupp/openmp/kmp_platform.h
index bbbd72dd6951..9c2215140467 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_platform.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_platform.h
@@ -23,6 +23,9 @@
#define KMP_OS_DARWIN 0
#define KMP_OS_WINDOWS 0
#define KMP_OS_HURD 0
+#define KMP_OS_SOLARIS 0
+#define KMP_OS_WASI 0
+#define KMP_OS_EMSCRIPTEN 0
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
#ifdef _WIN32
@@ -42,6 +45,11 @@
#elif (defined __linux__)
#undef KMP_OS_LINUX
#define KMP_OS_LINUX 1
+#elif defined(__EMSCRIPTEN__)
+#undef KMP_OS_LINUX
+#undef KMP_OS_EMSCRIPTEN
+#define KMP_OS_LINUX 1
+#define KMP_OS_EMSCRIPTEN 1
#else
#endif
@@ -70,13 +78,30 @@
#define KMP_OS_HURD 1
#endif
+#if (defined __sun__ && defined __svr4__)
+#undef KMP_OS_SOLARIS
+#define KMP_OS_SOLARIS 1
+#endif
+
+#if (defined __wasi__)
+#undef KMP_OS_WASI
+#define KMP_OS_WASI 1
+#endif
+
+#if (defined _AIX)
+#undef KMP_OS_AIX
+#define KMP_OS_AIX 1
+#endif
+
#if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \
- KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD)
+ KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \
+ KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX)
#error Unknown OS
#endif
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
- KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD
+ KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS || \
+ KMP_OS_WASI || KMP_OS_AIX
#undef KMP_OS_UNIX
#define KMP_OS_UNIX 1
#endif
@@ -86,12 +111,17 @@
#define KMP_ARCH_X86 0
#define KMP_ARCH_X86_64 0
#define KMP_ARCH_AARCH64 0
+#define KMP_ARCH_AARCH64_32 0
#define KMP_ARCH_PPC64_ELFv1 0
#define KMP_ARCH_PPC64_ELFv2 0
-#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1)
+#define KMP_ARCH_PPC64_XCOFF 0
+#define KMP_ARCH_PPC_XCOFF 0
#define KMP_ARCH_MIPS 0
#define KMP_ARCH_MIPS64 0
#define KMP_ARCH_RISCV64 0
+#define KMP_ARCH_LOONGARCH64 0
+#define KMP_ARCH_VE 0
+#define KMP_ARCH_S390X 0
#if KMP_OS_WINDOWS
#if defined(_M_AMD64) || defined(__x86_64)
@@ -100,6 +130,9 @@
#elif defined(__aarch64__) || defined(_M_ARM64)
#undef KMP_ARCH_AARCH64
#define KMP_ARCH_AARCH64 1
+#elif defined(__arm__) || defined(_M_ARM)
+#undef KMP_ARCH_ARMV7
+#define KMP_ARCH_ARMV7 1
#else
#undef KMP_ARCH_X86
#define KMP_ARCH_X86 1
@@ -114,13 +147,26 @@
#undef KMP_ARCH_X86
#define KMP_ARCH_X86 1
#elif defined __powerpc64__
-#if defined(_CALL_ELF) && _CALL_ELF == 2
+#if defined(_CALL_ELF)
+#if _CALL_ELF == 2
#undef KMP_ARCH_PPC64_ELFv2
#define KMP_ARCH_PPC64_ELFv2 1
#else
#undef KMP_ARCH_PPC64_ELFv1
#define KMP_ARCH_PPC64_ELFv1 1
#endif
+#elif defined KMP_OS_AIX
+#undef KMP_ARCH_PPC64_XCOFF
+#define KMP_ARCH_PPC64_XCOFF 1
+#endif
+#elif defined(__powerpc__) && defined(KMP_OS_AIX)
+#undef KMP_ARCH_PPC_XCOFF
+#define KMP_ARCH_PPC_XCOFF 1
+#undef KMP_ARCH_PPC
+#define KMP_ARCH_PPC 1
+#elif defined __ARM64_ARCH_8_32__
+#undef KMP_ARCH_AARCH64_32
+#define KMP_ARCH_AARCH64_32 1
#elif defined __aarch64__
#undef KMP_ARCH_AARCH64
#define KMP_ARCH_AARCH64 1
@@ -135,6 +181,15 @@
#elif defined __riscv && __riscv_xlen == 64
#undef KMP_ARCH_RISCV64
#define KMP_ARCH_RISCV64 1
+#elif defined __loongarch__ && __loongarch_grlen == 64
+#undef KMP_ARCH_LOONGARCH64
+#define KMP_ARCH_LOONGARCH64 1
+#elif defined __ve__
+#undef KMP_ARCH_VE
+#define KMP_ARCH_VE 1
+#elif defined __s390x__
+#undef KMP_ARCH_S390X
+#define KMP_ARCH_S390X 1
#endif
#endif
@@ -174,6 +229,13 @@
#define KMP_ARCH_ARM 1
#endif
+#if defined(__wasm32__)
+#define KMP_ARCH_WASM 1
+#endif
+
+#define KMP_ARCH_PPC64 \
+ (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1 || KMP_ARCH_PPC64_XCOFF)
+
#if defined(__MIC__) || defined(__MIC2__)
#define KMP_MIC 1
#if __MIC2__ || __KNC__
@@ -190,7 +252,9 @@
#endif
/* Specify 32 bit architectures here */
-#define KMP_32_BIT_ARCH (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS)
+#define KMP_32_BIT_ARCH \
+ (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \
+ KMP_ARCH_PPC || KMP_ARCH_AARCH64_32)
// Platforms which support Intel(R) Many Integrated Core Architecture
#define KMP_MIC_SUPPORTED \
@@ -199,7 +263,9 @@
// TODO: Fixme - This is clever, but really fugly
#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \
KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \
- KMP_ARCH_RISCV64)
+ KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \
+ KMP_ARCH_S390X + KMP_ARCH_WASM + KMP_ARCH_PPC + \
+ KMP_ARCH_AARCH64_32)
#error Unknown or unsupported architecture
#endif
diff --git a/contrib/libs/cxxsupp/openmp/kmp_runtime.cpp b/contrib/libs/cxxsupp/openmp/kmp_runtime.cpp
index bfbff03bd62c..c26992ab98ba 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_runtime.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_runtime.cpp
@@ -24,6 +24,7 @@
#include "kmp_wait_release.h"
#include "kmp_wrapper_getpid.h"
#include "kmp_dispatch.h"
+#include "kmp_utils.h"
#if KMP_USE_HIER_SCHED
#error #include "kmp_dispatch_hier.h"
#endif
@@ -47,8 +48,9 @@ static char *ProfileTraceFile = nullptr;
#include
#endif
-#if KMP_OS_WINDOWS
-// windows does not need include files as it doesn't use shared memory
+#ifndef KMP_USE_SHM
+// Windows and WASI do not need these include files as they don't use shared
+// memory.
#else
#include
#include
@@ -111,6 +113,21 @@ void __kmp_resize_dist_barrier(kmp_team_t *team, int old_nthreads,
int new_nthreads);
void __kmp_add_threads_to_team(kmp_team_t *team, int new_nthreads);
+static kmp_nested_nthreads_t *__kmp_override_nested_nth(kmp_info_t *thr,
+ int level) {
+ kmp_nested_nthreads_t *new_nested_nth =
+ (kmp_nested_nthreads_t *)KMP_INTERNAL_MALLOC(
+ sizeof(kmp_nested_nthreads_t));
+ int new_size = level + thr->th.th_set_nested_nth_sz;
+ new_nested_nth->nth = (int *)KMP_INTERNAL_MALLOC(new_size * sizeof(int));
+ for (int i = 0; i < level + 1; ++i)
+ new_nested_nth->nth[i] = 0;
+ for (int i = level + 1, j = 1; i < new_size; ++i, ++j)
+ new_nested_nth->nth[i] = thr->th.th_set_nested_nth[j];
+ new_nested_nth->size = new_nested_nth->used = new_size;
+ return new_nested_nth;
+}
+
/* Calculate the identifier of the current thread */
/* fast (and somewhat portable) way to get unique identifier of executing
thread. Returns KMP_GTID_DNE if we haven't been assigned a gtid. */
@@ -178,7 +195,12 @@ int __kmp_get_global_thread_id() {
if (stack_diff <= stack_size) {
/* The only way we can be closer than the allocated */
/* stack size is if we are running on this thread. */
- KMP_DEBUG_ASSERT(__kmp_gtid_get_specific() == i);
+ // __kmp_gtid_get_specific can return negative value because this
+ // function can be called by thread destructor. However, before the
+ // thread destructor is called, the value of the corresponding
+ // thread-specific data will be reset to NULL.
+ KMP_DEBUG_ASSERT(__kmp_gtid_get_specific() < 0 ||
+ __kmp_gtid_get_specific() == i);
return i;
}
}
@@ -196,6 +218,12 @@ int __kmp_get_global_thread_id() {
if (i < 0)
return i;
+ // other_threads[i] can be nullptr at this point because the corresponding
+ // thread could have already been destructed. It can happen when this function
+ // is called in end library routine.
+ if (!TCR_SYNC_PTR(other_threads[i]))
+ return i;
+
/* dynamically updated stack window for uber threads to avoid get_specific
call */
if (!TCR_4(other_threads[i]->th.th_info.ds.ds_stackgrow)) {
@@ -405,6 +433,8 @@ void __kmp_print_storage_map_gtid(int gtid, void *p1, void *p2, size_t size,
}
#endif /* KMP_PRINT_DATA_PLACEMENT */
__kmp_release_bootstrap_lock(&__kmp_stdio_lock);
+
+ va_end(ap);
}
void __kmp_warn(char const *format, ...) {
@@ -433,26 +463,26 @@ void __kmp_abort_process() {
__kmp_dump_debug_buffer();
}
- if (KMP_OS_WINDOWS) {
- // Let other threads know of abnormal termination and prevent deadlock
- // if abort happened during library initialization or shutdown
- __kmp_global.g.g_abort = SIGABRT;
-
- /* On Windows* OS by default abort() causes pop-up error box, which stalls
- nightly testing. Unfortunately, we cannot reliably suppress pop-up error
- boxes. _set_abort_behavior() works well, but this function is not
- available in VS7 (this is not problem for DLL, but it is a problem for
- static OpenMP RTL). SetErrorMode (and so, timelimit utility) does not
- help, at least in some versions of MS C RTL.
-
- It seems following sequence is the only way to simulate abort() and
- avoid pop-up error box. */
- raise(SIGABRT);
- _exit(3); // Just in case, if signal ignored, exit anyway.
- } else {
- __kmp_unregister_library();
- abort();
- }
+#if KMP_OS_WINDOWS
+ // Let other threads know of abnormal termination and prevent deadlock
+ // if abort happened during library initialization or shutdown
+ __kmp_global.g.g_abort = SIGABRT;
+
+ /* On Windows* OS by default abort() causes pop-up error box, which stalls
+ nightly testing. Unfortunately, we cannot reliably suppress pop-up error
+ boxes. _set_abort_behavior() works well, but this function is not
+ available in VS7 (this is not problem for DLL, but it is a problem for
+ static OpenMP RTL). SetErrorMode (and so, timelimit utility) does not
+ help, at least in some versions of MS C RTL.
+
+ It seems following sequence is the only way to simulate abort() and
+ avoid pop-up error box. */
+ raise(SIGABRT);
+ _exit(3); // Just in case, if signal ignored, exit anyway.
+#else
+ __kmp_unregister_library();
+ abort();
+#endif
__kmp_infinite_loop();
__kmp_release_bootstrap_lock(&__kmp_exit_lock);
@@ -553,6 +583,14 @@ static void __kmp_fini_allocator() { __kmp_fini_memkind(); }
/* ------------------------------------------------------------------------ */
+#if ENABLE_LIBOMPTARGET
+static void __kmp_init_omptarget() {
+ __kmp_init_target_task();
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+
#if KMP_DYNAMIC_LIB
#if KMP_OS_WINDOWS
@@ -907,6 +945,11 @@ static int __kmp_reserve_threads(kmp_root_t *root, kmp_team_t *parent_team,
__kmp_get_gtid(), new_nthreads, set_nthreads));
}
#endif // KMP_DEBUG
+
+ if (this_thr->th.th_nt_strict && new_nthreads < set_nthreads) {
+ __kmpc_error(this_thr->th.th_nt_loc, this_thr->th.th_nt_sev,
+ this_thr->th.th_nt_msg);
+ }
return new_nthreads;
}
@@ -1011,6 +1054,47 @@ static void __kmp_fork_team_threads(kmp_root_t *root, kmp_team_t *team,
__kmp_partition_places(team);
}
#endif
+
+ if (team->t.t_nproc > 1 &&
+ __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
+ team->t.b->update_num_threads(team->t.t_nproc);
+ __kmp_add_threads_to_team(team, team->t.t_nproc);
+ }
+ }
+
+ // Take care of primary thread's task state
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ if (use_hot_team) {
+ KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team->t.t_parent, master_th);
+ KA_TRACE(
+ 20,
+ ("__kmp_fork_team_threads: Primary T#%d pushing task_team %p / team "
+ "%p, new task_team %p / team %p\n",
+ __kmp_gtid_from_thread(master_th), master_th->th.th_task_team,
+ team->t.t_parent, team->t.t_task_team[master_th->th.th_task_state],
+ team));
+
+ // Store primary thread's current task state on new team
+ KMP_CHECK_UPDATE(team->t.t_primary_task_state,
+ master_th->th.th_task_state);
+
+ // Restore primary thread's task state to hot team's state
+ // by using thread 1's task state
+ if (team->t.t_nproc > 1) {
+ KMP_DEBUG_ASSERT(team->t.t_threads[1]->th.th_task_state == 0 ||
+ team->t.t_threads[1]->th.th_task_state == 1);
+ KMP_CHECK_UPDATE(master_th->th.th_task_state,
+ team->t.t_threads[1]->th.th_task_state);
+ } else {
+ master_th->th.th_task_state = 0;
+ }
+ } else {
+ // Store primary thread's current task_state on new team
+ KMP_CHECK_UPDATE(team->t.t_primary_task_state,
+ master_th->th.th_task_state);
+ // Are not using hot team, so set task state to 0.
+ master_th->th.th_task_state = 0;
+ }
}
if (__kmp_display_affinity && team->t.t_display_affinity != 1) {
@@ -1116,18 +1200,6 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
KMP_DEBUG_ASSERT(serial_team);
KMP_MB();
- if (__kmp_tasking_mode != tskm_immediate_exec) {
- KMP_DEBUG_ASSERT(
- this_thr->th.th_task_team ==
- this_thr->th.th_team->t.t_task_team[this_thr->th.th_task_state]);
- KMP_DEBUG_ASSERT(serial_team->t.t_task_team[this_thr->th.th_task_state] ==
- NULL);
- KA_TRACE(20, ("__kmpc_serialized_parallel: T#%d pushing task_team %p / "
- "team %p, new task_team = NULL\n",
- global_tid, this_thr->th.th_task_team, this_thr->th.th_team));
- this_thr->th.th_task_team = NULL;
- }
-
kmp_proc_bind_t proc_bind = this_thr->th.th_set_proc_bind;
if (this_thr->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
proc_bind = proc_bind_false;
@@ -1139,6 +1211,9 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
// Reset for next parallel region
this_thr->th.th_set_proc_bind = proc_bind_default;
+ // Reset num_threads for next parallel region
+ this_thr->th.th_set_nproc = 0;
+
#if OMPT_SUPPORT
ompt_data_t ompt_parallel_data = ompt_data_none;
void *codeptr = OMPT_LOAD_RETURN_ADDRESS(global_tid);
@@ -1210,6 +1285,12 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
serial_team->t.t_serialized = 1;
serial_team->t.t_nproc = 1;
serial_team->t.t_parent = this_thr->th.th_team;
+ if (this_thr->th.th_team->t.t_nested_nth)
+ serial_team->t.t_nested_nth = this_thr->th.th_team->t.t_nested_nth;
+ else
+ serial_team->t.t_nested_nth = &__kmp_nested_nth;
+ // Save previous team's task state on serial team structure
+ serial_team->t.t_primary_task_state = this_thr->th.th_task_state;
serial_team->t.t_sched.sched = this_thr->th.th_team->t.t_sched.sched;
this_thr->th.th_team = serial_team;
serial_team->t.t_master_tid = this_thr->th.th_info.ds.ds_tid;
@@ -1229,9 +1310,11 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
// Thread value exists in the nested nthreads array for the next nested
// level
- if (__kmp_nested_nth.used && (level + 1 < __kmp_nested_nth.used)) {
- this_thr->th.th_current_task->td_icvs.nproc =
- __kmp_nested_nth.nth[level + 1];
+ kmp_nested_nthreads_t *nested_nth = &__kmp_nested_nth;
+ if (this_thr->th.th_team->t.t_nested_nth)
+ nested_nth = this_thr->th.th_team->t.t_nested_nth;
+ if (nested_nth->used && (level + 1 < nested_nth->used)) {
+ this_thr->th.th_current_task->td_icvs.nproc = nested_nth->nth[level + 1];
}
if (__kmp_nested_proc_bind.used &&
@@ -1249,6 +1332,8 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
this_thr->th.th_team_nproc = 1;
this_thr->th.th_team_master = this_thr;
this_thr->th.th_team_serialized = 1;
+ this_thr->th.th_task_team = NULL;
+ this_thr->th.th_task_state = 0;
serial_team->t.t_level = serial_team->t.t_parent->t.t_level + 1;
serial_team->t.t_active_level = serial_team->t.t_parent->t.t_active_level;
@@ -1280,10 +1365,14 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
int level = this_thr->th.th_team->t.t_level;
// Thread value exists in the nested nthreads array for the next nested
// level
- if (__kmp_nested_nth.used && (level + 1 < __kmp_nested_nth.used)) {
- this_thr->th.th_current_task->td_icvs.nproc =
- __kmp_nested_nth.nth[level + 1];
+
+ kmp_nested_nthreads_t *nested_nth = &__kmp_nested_nth;
+ if (serial_team->t.t_nested_nth)
+ nested_nth = serial_team->t.t_nested_nth;
+ if (nested_nth->used && (level + 1 < nested_nth->used)) {
+ this_thr->th.th_current_task->td_icvs.nproc = nested_nth->nth[level + 1];
}
+
serial_team->t.t_level++;
KF_TRACE(10, ("__kmpc_serialized_parallel: T#%d increasing nesting level "
"of serial team %p to %d\n",
@@ -1300,6 +1389,9 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
}
this_thr->th.th_dispatch = serial_team->t.t_dispatch;
+ /* allocate/push task team stack */
+ __kmp_push_task_team_node(this_thr, serial_team);
+
KMP_MB();
}
KMP_CHECK_UPDATE(serial_team->t.t_cancel_request, cancel_noreq);
@@ -1350,375 +1442,636 @@ void __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid) {
#endif
}
-/* most of the work for a fork */
-/* return true if we really went parallel, false if serialized */
-int __kmp_fork_call(ident_t *loc, int gtid,
- enum fork_context_e call_context, // Intel, GNU, ...
- kmp_int32 argc, microtask_t microtask, launch_t invoker,
+// Test if this fork is for a team closely nested in a teams construct
+static inline bool __kmp_is_fork_in_teams(kmp_info_t *master_th,
+ microtask_t microtask, int level,
+ int teams_level, kmp_va_list ap) {
+ return (master_th->th.th_teams_microtask && ap &&
+ microtask != (microtask_t)__kmp_teams_master && level == teams_level);
+}
+
+// Test if this fork is for the teams construct, i.e. to form the outer league
+// of teams
+static inline bool __kmp_is_entering_teams(int active_level, int level,
+ int teams_level, kmp_va_list ap) {
+ return ((ap == NULL && active_level == 0) ||
+ (ap && teams_level > 0 && teams_level == level));
+}
+
+// AC: This is start of parallel that is nested inside teams construct.
+// The team is actual (hot), all workers are ready at the fork barrier.
+// No lock needed to initialize the team a bit, then free workers.
+static inline int
+__kmp_fork_in_teams(ident_t *loc, int gtid, kmp_team_t *parent_team,
+ kmp_int32 argc, kmp_info_t *master_th, kmp_root_t *root,
+ enum fork_context_e call_context, microtask_t microtask,
+ launch_t invoker, int master_set_numthreads, int level,
+#if OMPT_SUPPORT
+ ompt_data_t ompt_parallel_data, void *return_address,
+#endif
kmp_va_list ap) {
void **argv;
int i;
- int master_tid;
- int master_this_cons;
- kmp_team_t *team;
- kmp_team_t *parent_team;
- kmp_info_t *master_th;
- kmp_root_t *root;
- int nthreads;
- int master_active;
- int master_set_numthreads;
- int level;
- int active_level;
- int teams_level;
-#if KMP_NESTED_HOT_TEAMS
- kmp_hot_team_ptr_t **p_hot_teams;
-#endif
- { // KMP_TIME_BLOCK
- KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(KMP_fork_call);
- KMP_COUNT_VALUE(OMP_PARALLEL_args, argc);
- KA_TRACE(20, ("__kmp_fork_call: enter T#%d\n", gtid));
- if (__kmp_stkpadding > 0 && __kmp_root[gtid] != NULL) {
- /* Some systems prefer the stack for the root thread(s) to start with */
- /* some gap from the parent stack to prevent false sharing. */
- void *dummy = KMP_ALLOCA(__kmp_stkpadding);
- /* These 2 lines below are so this does not get optimized out */
- if (__kmp_stkpadding > KMP_MAX_STKPADDING)
- __kmp_stkpadding += (short)((kmp_int64)dummy);
- }
+ parent_team->t.t_ident = loc;
+ __kmp_alloc_argv_entries(argc, parent_team, TRUE);
+ parent_team->t.t_argc = argc;
+ argv = (void **)parent_team->t.t_argv;
+ for (i = argc - 1; i >= 0; --i) {
+ *argv++ = va_arg(kmp_va_deref(ap), void *);
+ }
+ // Increment our nested depth levels, but not increase the serialization
+ if (parent_team == master_th->th.th_serial_team) {
+ // AC: we are in serialized parallel
+ __kmpc_serialized_parallel(loc, gtid);
+ KMP_DEBUG_ASSERT(parent_team->t.t_serialized > 1);
- /* initialize if needed */
- KMP_DEBUG_ASSERT(
- __kmp_init_serial); // AC: potentially unsafe, not in sync with shutdown
- if (!TCR_4(__kmp_init_parallel))
- __kmp_parallel_initialize();
- __kmp_resume_if_soft_paused();
+ if (call_context == fork_context_gnu) {
+ // AC: need to decrement t_serialized for enquiry functions to work
+ // correctly, will restore at join time
+ parent_team->t.t_serialized--;
+ return TRUE;
+ }
- /* setup current data */
- master_th = __kmp_threads[gtid]; // AC: potentially unsafe, not in sync with
- // shutdown
- parent_team = master_th->th.th_team;
- master_tid = master_th->th.th_info.ds.ds_tid;
- master_this_cons = master_th->th.th_local.this_construct;
- root = master_th->th.th_root;
- master_active = root->r.r_active;
- master_set_numthreads = master_th->th.th_set_nproc;
+#if OMPD_SUPPORT
+ parent_team->t.t_pkfn = microtask;
+#endif
#if OMPT_SUPPORT
- ompt_data_t ompt_parallel_data = ompt_data_none;
- ompt_data_t *parent_task_data;
- ompt_frame_t *ompt_frame;
+ void *dummy;
+ void **exit_frame_p;
ompt_data_t *implicit_task_data;
- void *return_address = NULL;
+ ompt_lw_taskteam_t lw_taskteam;
if (ompt_enabled.enabled) {
- __ompt_get_task_info_internal(0, NULL, &parent_task_data, &ompt_frame,
- NULL, NULL);
- return_address = OMPT_LOAD_RETURN_ADDRESS(gtid);
+ __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
+ &ompt_parallel_data, return_address);
+ exit_frame_p = &(lw_taskteam.ompt_task_info.frame.exit_frame.ptr);
+
+ __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
+ // Don't use lw_taskteam after linking. Content was swapped.
+
+ /* OMPT implicit task begin */
+ implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th), implicit_task_data,
+ 1, OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
+ }
+
+ /* OMPT state */
+ master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
+ } else {
+ exit_frame_p = &dummy;
}
#endif
- // Assign affinity to root thread if it hasn't happened yet
- __kmp_assign_root_init_mask();
+ // AC: need to decrement t_serialized for enquiry functions to work
+ // correctly, will restore at join time
+ parent_team->t.t_serialized--;
- // Nested level will be an index in the nested nthreads array
- level = parent_team->t.t_level;
- // used to launch non-serial teams even if nested is not allowed
- active_level = parent_team->t.t_active_level;
- // needed to check nesting inside the teams
- teams_level = master_th->th.th_teams_level;
-#if KMP_NESTED_HOT_TEAMS
- p_hot_teams = &master_th->th.th_hot_teams;
- if (*p_hot_teams == NULL && __kmp_hot_teams_max_level > 0) {
- *p_hot_teams = (kmp_hot_team_ptr_t *)__kmp_allocate(
- sizeof(kmp_hot_team_ptr_t) * __kmp_hot_teams_max_level);
- (*p_hot_teams)[0].hot_team = root->r.r_hot_team;
- // it is either actual or not needed (when active_level > 0)
- (*p_hot_teams)[0].hot_team_nth = 1;
- }
+ {
+ KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
+ KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
+ __kmp_invoke_microtask(microtask, gtid, 0, argc, parent_team->t.t_argv
+#if OMPT_SUPPORT
+ ,
+ exit_frame_p
#endif
+ );
+ }
#if OMPT_SUPPORT
if (ompt_enabled.enabled) {
- if (ompt_enabled.ompt_callback_parallel_begin) {
- int team_size = master_set_numthreads
- ? master_set_numthreads
- : get__nproc_2(parent_team, master_tid);
- int flags = OMPT_INVOKER(call_context) |
- ((microtask == (microtask_t)__kmp_teams_master)
- ? ompt_parallel_league
- : ompt_parallel_team);
- ompt_callbacks.ompt_callback(ompt_callback_parallel_begin)(
- parent_task_data, ompt_frame, &ompt_parallel_data, team_size, flags,
- return_address);
+ *exit_frame_p = NULL;
+ OMPT_CUR_TASK_INFO(master_th)->frame.exit_frame = ompt_data_none;
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_end, NULL, implicit_task_data, 1,
+ OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
+ }
+ ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
+ __ompt_lw_taskteam_unlink(master_th);
+ if (ompt_enabled.ompt_callback_parallel_end) {
+ ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
+ &ompt_parallel_data, OMPT_CUR_TASK_DATA(master_th),
+ OMPT_INVOKER(call_context) | ompt_parallel_team, return_address);
}
master_th->th.ompt_thread_info.state = ompt_state_overhead;
}
#endif
+ return TRUE;
+ }
- master_th->th.th_ident = loc;
+ parent_team->t.t_pkfn = microtask;
+ parent_team->t.t_invoke = invoker;
+ KMP_ATOMIC_INC(&root->r.r_in_parallel);
+ parent_team->t.t_active_level++;
+ parent_team->t.t_level++;
+ parent_team->t.t_def_allocator = master_th->th.th_def_allocator; // save
- if (master_th->th.th_teams_microtask && ap &&
- microtask != (microtask_t)__kmp_teams_master && level == teams_level) {
- // AC: This is start of parallel that is nested inside teams construct.
- // The team is actual (hot), all workers are ready at the fork barrier.
- // No lock needed to initialize the team a bit, then free workers.
- parent_team->t.t_ident = loc;
- __kmp_alloc_argv_entries(argc, parent_team, TRUE);
- parent_team->t.t_argc = argc;
- argv = (void **)parent_team->t.t_argv;
- for (i = argc - 1; i >= 0; --i)
- *argv++ = va_arg(kmp_va_deref(ap), void *);
- // Increment our nested depth levels, but not increase the serialization
- if (parent_team == master_th->th.th_serial_team) {
- // AC: we are in serialized parallel
- __kmpc_serialized_parallel(loc, gtid);
- KMP_DEBUG_ASSERT(parent_team->t.t_serialized > 1);
-
- if (call_context == fork_context_gnu) {
- // AC: need to decrement t_serialized for enquiry functions to work
- // correctly, will restore at join time
- parent_team->t.t_serialized--;
- return TRUE;
- }
+ // If the threads allocated to the team are less than the thread limit, update
+ // the thread limit here. th_teams_size.nth is specific to this team nested
+ // in a teams construct, the team is fully created, and we're about to do
+ // the actual fork. Best to do this here so that the subsequent uses below
+ // and in the join have the correct value.
+ master_th->th.th_teams_size.nth = parent_team->t.t_nproc;
-#if OMPD_SUPPORT
- parent_team->t.t_pkfn = microtask;
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ ompt_lw_taskteam_t lw_taskteam;
+ __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid, &ompt_parallel_data,
+ return_address);
+ __ompt_lw_taskteam_link(&lw_taskteam, master_th, 1, true);
+ }
#endif
-#if OMPT_SUPPORT
- void *dummy;
- void **exit_frame_p;
+ /* Change number of threads in the team if requested */
+ if (master_set_numthreads) { // The parallel has num_threads clause
+ if (master_set_numthreads <= master_th->th.th_teams_size.nth) {
+ // AC: only can reduce number of threads dynamically, can't increase
+ kmp_info_t **other_threads = parent_team->t.t_threads;
+ // NOTE: if using distributed barrier, we need to run this code block
+ // even when the team size appears not to have changed from the max.
+ int old_proc = master_th->th.th_teams_size.nth;
+ if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
+ __kmp_resize_dist_barrier(parent_team, old_proc, master_set_numthreads);
+ __kmp_add_threads_to_team(parent_team, master_set_numthreads);
+ }
+ parent_team->t.t_nproc = master_set_numthreads;
+ for (i = 0; i < master_set_numthreads; ++i) {
+ other_threads[i]->th.th_team_nproc = master_set_numthreads;
+ }
+ }
+ // Keep extra threads hot in the team for possible next parallels
+ master_th->th.th_set_nproc = 0;
+ }
- ompt_lw_taskteam_t lw_taskteam;
+#if USE_DEBUGGER
+ if (__kmp_debugging) { // Let debugger override number of threads.
+ int nth = __kmp_omp_num_threads(loc);
+ if (nth > 0) { // 0 means debugger doesn't want to change num threads
+ master_set_numthreads = nth;
+ }
+ }
+#endif
- if (ompt_enabled.enabled) {
- __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
- &ompt_parallel_data, return_address);
- exit_frame_p = &(lw_taskteam.ompt_task_info.frame.exit_frame.ptr);
-
- __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
- // don't use lw_taskteam after linking. content was swaped
-
- /* OMPT implicit task begin */
- implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
- if (ompt_enabled.ompt_callback_implicit_task) {
- OMPT_CUR_TASK_INFO(master_th)->thread_num =
- __kmp_tid_from_gtid(gtid);
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
- implicit_task_data, 1,
- OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
- }
+ // Figure out the proc_bind policy for the nested parallel within teams
+ kmp_proc_bind_t proc_bind = master_th->th.th_set_proc_bind;
+ // proc_bind_default means don't update
+ kmp_proc_bind_t proc_bind_icv = proc_bind_default;
+ if (master_th->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
+ proc_bind = proc_bind_false;
+ } else {
+ // No proc_bind clause specified; use current proc-bind-var
+ if (proc_bind == proc_bind_default) {
+ proc_bind = master_th->th.th_current_task->td_icvs.proc_bind;
+ }
+ /* else: The proc_bind policy was specified explicitly on parallel clause.
+ This overrides proc-bind-var for this parallel region, but does not
+ change proc-bind-var. */
+ // Figure the value of proc-bind-var for the child threads.
+ if ((level + 1 < __kmp_nested_proc_bind.used) &&
+ (__kmp_nested_proc_bind.bind_types[level + 1] !=
+ master_th->th.th_current_task->td_icvs.proc_bind)) {
+ proc_bind_icv = __kmp_nested_proc_bind.bind_types[level + 1];
+ }
+ }
+ KMP_CHECK_UPDATE(parent_team->t.t_proc_bind, proc_bind);
+ // Need to change the bind-var ICV to correct value for each implicit task
+ if (proc_bind_icv != proc_bind_default &&
+ master_th->th.th_current_task->td_icvs.proc_bind != proc_bind_icv) {
+ kmp_info_t **other_threads = parent_team->t.t_threads;
+ for (i = 0; i < master_th->th.th_team_nproc; ++i) {
+ other_threads[i]->th.th_current_task->td_icvs.proc_bind = proc_bind_icv;
+ }
+ }
+ // Reset for next parallel region
+ master_th->th.th_set_proc_bind = proc_bind_default;
- /* OMPT state */
- master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
- } else {
- exit_frame_p = &dummy;
- }
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if (((__itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr) ||
+ KMP_ITT_DEBUG) &&
+ __kmp_forkjoin_frames_mode == 3 &&
+ parent_team->t.t_active_level == 1 // only report frames at level 1
+ && master_th->th.th_teams_size.nteams == 1) {
+ kmp_uint64 tmp_time = __itt_get_timestamp();
+ master_th->th.th_frame_time = tmp_time;
+ parent_team->t.t_region_time = tmp_time;
+ }
+ if (__itt_stack_caller_create_ptr) {
+ KMP_DEBUG_ASSERT(parent_team->t.t_stack_id == NULL);
+ // create new stack stitching id before entering fork barrier
+ parent_team->t.t_stack_id = __kmp_itt_stack_caller_create();
+ }
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+#if KMP_AFFINITY_SUPPORTED
+ __kmp_partition_places(parent_team);
#endif
- // AC: need to decrement t_serialized for enquiry functions to work
- // correctly, will restore at join time
- parent_team->t.t_serialized--;
- {
- KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
- KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
- __kmp_invoke_microtask(microtask, gtid, 0, argc, parent_team->t.t_argv
+ KF_TRACE(10, ("__kmp_fork_in_teams: before internal fork: root=%p, team=%p, "
+ "master_th=%p, gtid=%d\n",
+ root, parent_team, master_th, gtid));
+ __kmp_internal_fork(loc, gtid, parent_team);
+ KF_TRACE(10, ("__kmp_fork_in_teams: after internal fork: root=%p, team=%p, "
+ "master_th=%p, gtid=%d\n",
+ root, parent_team, master_th, gtid));
+
+ if (call_context == fork_context_gnu)
+ return TRUE;
+
+ /* Invoke microtask for PRIMARY thread */
+ KA_TRACE(20, ("__kmp_fork_in_teams: T#%d(%d:0) invoke microtask = %p\n", gtid,
+ parent_team->t.t_id, parent_team->t.t_pkfn));
+
+ if (!parent_team->t.t_invoke(gtid)) {
+ KMP_ASSERT2(0, "cannot invoke microtask for PRIMARY thread");
+ }
+ KA_TRACE(20, ("__kmp_fork_in_teams: T#%d(%d:0) done microtask = %p\n", gtid,
+ parent_team->t.t_id, parent_team->t.t_pkfn));
+ KMP_MB(); /* Flush all pending memory write invalidates. */
+
+ KA_TRACE(20, ("__kmp_fork_in_teams: parallel exit T#%d\n", gtid));
+
+ return TRUE;
+}
+
+// Create a serialized parallel region
+static inline int
+__kmp_serial_fork_call(ident_t *loc, int gtid, enum fork_context_e call_context,
+ kmp_int32 argc, microtask_t microtask, launch_t invoker,
+ kmp_info_t *master_th, kmp_team_t *parent_team,
#if OMPT_SUPPORT
- ,
- exit_frame_p
+ ompt_data_t *ompt_parallel_data, void **return_address,
+ ompt_data_t **parent_task_data,
#endif
- );
- }
+ kmp_va_list ap) {
+ kmp_team_t *team;
+ int i;
+ void **argv;
-#if OMPT_SUPPORT
- if (ompt_enabled.enabled) {
- *exit_frame_p = NULL;
- OMPT_CUR_TASK_INFO(master_th)->frame.exit_frame = ompt_data_none;
- if (ompt_enabled.ompt_callback_implicit_task) {
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_end, NULL, implicit_task_data, 1,
- OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
- }
- ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
- __ompt_lw_taskteam_unlink(master_th);
- if (ompt_enabled.ompt_callback_parallel_end) {
- ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
- &ompt_parallel_data, OMPT_CUR_TASK_DATA(master_th),
- OMPT_INVOKER(call_context) | ompt_parallel_team,
- return_address);
- }
- master_th->th.ompt_thread_info.state = ompt_state_overhead;
- }
+/* josh todo: hypothetical question: what do we do for OS X*? */
+#if KMP_OS_LINUX && \
+ (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64)
+ SimpleVLA args(argc);
+#else
+ void **args = (void **)KMP_ALLOCA(argc * sizeof(void *));
+#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || \
+ KMP_ARCH_AARCH64) */
+
+ KA_TRACE(
+ 20, ("__kmp_serial_fork_call: T#%d serializing parallel region\n", gtid));
+
+ __kmpc_serialized_parallel(loc, gtid);
+
+#if OMPD_SUPPORT
+ master_th->th.th_serial_team->t.t_pkfn = microtask;
#endif
- return TRUE;
- }
- parent_team->t.t_pkfn = microtask;
- parent_team->t.t_invoke = invoker;
- KMP_ATOMIC_INC(&root->r.r_in_parallel);
- parent_team->t.t_active_level++;
- parent_team->t.t_level++;
- parent_team->t.t_def_allocator = master_th->th.th_def_allocator; // save
+ if (call_context == fork_context_intel) {
+ /* TODO this sucks, use the compiler itself to pass args! :) */
+ master_th->th.th_serial_team->t.t_ident = loc;
+ if (!ap) {
+ // revert change made in __kmpc_serialized_parallel()
+ master_th->th.th_serial_team->t.t_level--;
+// Get args from parent team for teams construct
#if OMPT_SUPPORT
+ void *dummy;
+ void **exit_frame_p;
+ ompt_task_info_t *task_info;
+ ompt_lw_taskteam_t lw_taskteam;
+
if (ompt_enabled.enabled) {
- ompt_lw_taskteam_t lw_taskteam;
__ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
- &ompt_parallel_data, return_address);
- __ompt_lw_taskteam_link(&lw_taskteam, master_th, 1, true);
+ ompt_parallel_data, *return_address);
+
+ __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
+ // don't use lw_taskteam after linking. content was swaped
+ task_info = OMPT_CUR_TASK_INFO(master_th);
+ exit_frame_p = &(task_info->frame.exit_frame.ptr);
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
+ &(task_info->task_data), 1,
+ OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
+ }
+
+ /* OMPT state */
+ master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
+ } else {
+ exit_frame_p = &dummy;
}
#endif
- /* Change number of threads in the team if requested */
- if (master_set_numthreads) { // The parallel has num_threads clause
- if (master_set_numthreads <= master_th->th.th_teams_size.nth) {
- // AC: only can reduce number of threads dynamically, can't increase
- kmp_info_t **other_threads = parent_team->t.t_threads;
- // NOTE: if using distributed barrier, we need to run this code block
- // even when the team size appears not to have changed from the max.
- int old_proc = master_th->th.th_teams_size.nth;
- if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] ==
- bp_dist_bar) {
- __kmp_resize_dist_barrier(parent_team, old_proc,
- master_set_numthreads);
- __kmp_add_threads_to_team(parent_team, master_set_numthreads);
- }
- parent_team->t.t_nproc = master_set_numthreads;
- for (i = 0; i < master_set_numthreads; ++i) {
- other_threads[i]->th.th_team_nproc = master_set_numthreads;
- }
- }
- // Keep extra threads hot in the team for possible next parallels
- master_th->th.th_set_nproc = 0;
+ {
+ KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
+ KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
+ __kmp_invoke_microtask(microtask, gtid, 0, argc, parent_team->t.t_argv
+#if OMPT_SUPPORT
+ ,
+ exit_frame_p
+#endif
+ );
}
-#if USE_DEBUGGER
- if (__kmp_debugging) { // Let debugger override number of threads.
- int nth = __kmp_omp_num_threads(loc);
- if (nth > 0) { // 0 means debugger doesn't want to change num threads
- master_set_numthreads = nth;
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ *exit_frame_p = NULL;
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_end, NULL, &(task_info->task_data), 1,
+ OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
}
+ *ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
+ __ompt_lw_taskteam_unlink(master_th);
+ if (ompt_enabled.ompt_callback_parallel_end) {
+ ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
+ ompt_parallel_data, *parent_task_data,
+ OMPT_INVOKER(call_context) | ompt_parallel_team, *return_address);
+ }
+ master_th->th.ompt_thread_info.state = ompt_state_overhead;
}
#endif
-
- // Figure out the proc_bind policy for the nested parallel within teams
- kmp_proc_bind_t proc_bind = master_th->th.th_set_proc_bind;
- // proc_bind_default means don't update
- kmp_proc_bind_t proc_bind_icv = proc_bind_default;
- if (master_th->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
- proc_bind = proc_bind_false;
- } else {
- // No proc_bind clause specified; use current proc-bind-var
- if (proc_bind == proc_bind_default) {
- proc_bind = master_th->th.th_current_task->td_icvs.proc_bind;
+ } else if (microtask == (microtask_t)__kmp_teams_master) {
+ KMP_DEBUG_ASSERT(master_th->th.th_team == master_th->th.th_serial_team);
+ team = master_th->th.th_team;
+ // team->t.t_pkfn = microtask;
+ team->t.t_invoke = invoker;
+ __kmp_alloc_argv_entries(argc, team, TRUE);
+ team->t.t_argc = argc;
+ argv = (void **)team->t.t_argv;
+ for (i = argc - 1; i >= 0; --i)
+ *argv++ = va_arg(kmp_va_deref(ap), void *);
+ // AC: revert change made in __kmpc_serialized_parallel()
+ // because initial code in teams should have level=0
+ team->t.t_level--;
+ // AC: call special invoker for outer "parallel" of teams construct
+ invoker(gtid);
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ ompt_task_info_t *task_info = OMPT_CUR_TASK_INFO(master_th);
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_end, NULL, &(task_info->task_data), 0,
+ OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_initial);
}
- /* else: The proc_bind policy was specified explicitly on parallel
- clause.
- This overrides proc-bind-var for this parallel region, but does not
- change proc-bind-var. */
- // Figure the value of proc-bind-var for the child threads.
- if ((level + 1 < __kmp_nested_proc_bind.used) &&
- (__kmp_nested_proc_bind.bind_types[level + 1] !=
- master_th->th.th_current_task->td_icvs.proc_bind)) {
- proc_bind_icv = __kmp_nested_proc_bind.bind_types[level + 1];
+ if (ompt_enabled.ompt_callback_parallel_end) {
+ ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
+ ompt_parallel_data, *parent_task_data,
+ OMPT_INVOKER(call_context) | ompt_parallel_league,
+ *return_address);
}
+ master_th->th.ompt_thread_info.state = ompt_state_overhead;
}
- KMP_CHECK_UPDATE(parent_team->t.t_proc_bind, proc_bind);
- // Need to change the bind-var ICV to correct value for each implicit task
- if (proc_bind_icv != proc_bind_default &&
- master_th->th.th_current_task->td_icvs.proc_bind != proc_bind_icv) {
- kmp_info_t **other_threads = parent_team->t.t_threads;
- for (i = 0; i < master_th->th.th_team_nproc; ++i) {
- other_threads[i]->th.th_current_task->td_icvs.proc_bind =
- proc_bind_icv;
+#endif
+ } else {
+ argv = args;
+ for (i = argc - 1; i >= 0; --i)
+ *argv++ = va_arg(kmp_va_deref(ap), void *);
+ KMP_MB();
+
+#if OMPT_SUPPORT
+ void *dummy;
+ void **exit_frame_p;
+ ompt_task_info_t *task_info;
+ ompt_lw_taskteam_t lw_taskteam;
+ ompt_data_t *implicit_task_data;
+
+ if (ompt_enabled.enabled) {
+ __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
+ ompt_parallel_data, *return_address);
+ __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
+ // don't use lw_taskteam after linking. content was swaped
+ task_info = OMPT_CUR_TASK_INFO(master_th);
+ exit_frame_p = &(task_info->frame.exit_frame.ptr);
+
+ /* OMPT implicit task begin */
+ implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
+ implicit_task_data, 1, __kmp_tid_from_gtid(gtid),
+ ompt_task_implicit);
+ OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
}
+
+ /* OMPT state */
+ master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
+ } else {
+ exit_frame_p = &dummy;
}
- // Reset for next parallel region
- master_th->th.th_set_proc_bind = proc_bind_default;
+#endif
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- if (((__itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr) ||
- KMP_ITT_DEBUG) &&
- __kmp_forkjoin_frames_mode == 3 &&
- parent_team->t.t_active_level == 1 // only report frames at level 1
- && master_th->th.th_teams_size.nteams == 1) {
- kmp_uint64 tmp_time = __itt_get_timestamp();
- master_th->th.th_frame_time = tmp_time;
- parent_team->t.t_region_time = tmp_time;
+ {
+ KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
+ KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
+ __kmp_invoke_microtask(microtask, gtid, 0, argc, args
+#if OMPT_SUPPORT
+ ,
+ exit_frame_p
+#endif
+ );
}
- if (__itt_stack_caller_create_ptr) {
- KMP_DEBUG_ASSERT(parent_team->t.t_stack_id == NULL);
- // create new stack stitching id before entering fork barrier
- parent_team->t.t_stack_id = __kmp_itt_stack_caller_create();
+
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ *exit_frame_p = NULL;
+ if (ompt_enabled.ompt_callback_implicit_task) {
+ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
+ ompt_scope_end, NULL, &(task_info->task_data), 1,
+ OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
+ }
+
+ *ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
+ __ompt_lw_taskteam_unlink(master_th);
+ if (ompt_enabled.ompt_callback_parallel_end) {
+ ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
+ ompt_parallel_data, *parent_task_data,
+ OMPT_INVOKER(call_context) | ompt_parallel_team, *return_address);
+ }
+ master_th->th.ompt_thread_info.state = ompt_state_overhead;
}
-#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
-#if KMP_AFFINITY_SUPPORTED
- __kmp_partition_places(parent_team);
#endif
+ }
+ } else if (call_context == fork_context_gnu) {
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ ompt_lw_taskteam_t lwt;
+ __ompt_lw_taskteam_init(&lwt, master_th, gtid, ompt_parallel_data,
+ *return_address);
+
+ lwt.ompt_task_info.frame.exit_frame = ompt_data_none;
+ __ompt_lw_taskteam_link(&lwt, master_th, 1);
+ }
+// don't use lw_taskteam after linking. content was swaped
+#endif
+
+ // we were called from GNU native code
+ KA_TRACE(20, ("__kmp_serial_fork_call: T#%d serial exit\n", gtid));
+ return FALSE;
+ } else {
+ KMP_ASSERT2(call_context < fork_context_last,
+ "__kmp_serial_fork_call: unknown fork_context parameter");
+ }
+
+ KA_TRACE(20, ("__kmp_serial_fork_call: T#%d serial exit\n", gtid));
+ KMP_MB();
+ return FALSE;
+}
+
+/* most of the work for a fork */
+/* return true if we really went parallel, false if serialized */
+int __kmp_fork_call(ident_t *loc, int gtid,
+ enum fork_context_e call_context, // Intel, GNU, ...
+ kmp_int32 argc, microtask_t microtask, launch_t invoker,
+ kmp_va_list ap) {
+ void **argv;
+ int i;
+ int master_tid;
+ int master_this_cons;
+ kmp_team_t *team;
+ kmp_team_t *parent_team;
+ kmp_info_t *master_th;
+ kmp_root_t *root;
+ int nthreads;
+ int master_active;
+ int master_set_numthreads;
+ int task_thread_limit = 0;
+ int level;
+ int active_level;
+ int teams_level;
+#if KMP_NESTED_HOT_TEAMS
+ kmp_hot_team_ptr_t **p_hot_teams;
+#endif
+ { // KMP_TIME_BLOCK
+ KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(KMP_fork_call);
+ KMP_COUNT_VALUE(OMP_PARALLEL_args, argc);
+
+ KA_TRACE(20, ("__kmp_fork_call: enter T#%d\n", gtid));
+ if (__kmp_stkpadding > 0 && __kmp_root[gtid] != NULL) {
+ /* Some systems prefer the stack for the root thread(s) to start with */
+ /* some gap from the parent stack to prevent false sharing. */
+ void *dummy = KMP_ALLOCA(__kmp_stkpadding);
+ /* These 2 lines below are so this does not get optimized out */
+ if (__kmp_stkpadding > KMP_MAX_STKPADDING)
+ __kmp_stkpadding += (short)((kmp_int64)dummy);
+ }
+
+ /* initialize if needed */
+ KMP_DEBUG_ASSERT(
+ __kmp_init_serial); // AC: potentially unsafe, not in sync with shutdown
+ if (!TCR_4(__kmp_init_parallel))
+ __kmp_parallel_initialize();
+ __kmp_resume_if_soft_paused();
- KF_TRACE(10, ("__kmp_fork_call: before internal fork: root=%p, team=%p, "
- "master_th=%p, gtid=%d\n",
- root, parent_team, master_th, gtid));
- __kmp_internal_fork(loc, gtid, parent_team);
- KF_TRACE(10, ("__kmp_fork_call: after internal fork: root=%p, team=%p, "
- "master_th=%p, gtid=%d\n",
- root, parent_team, master_th, gtid));
+ /* setup current data */
+ // AC: potentially unsafe, not in sync with library shutdown,
+ // __kmp_threads can be freed
+ master_th = __kmp_threads[gtid];
- if (call_context == fork_context_gnu)
- return TRUE;
+ parent_team = master_th->th.th_team;
+ master_tid = master_th->th.th_info.ds.ds_tid;
+ master_this_cons = master_th->th.th_local.this_construct;
+ root = master_th->th.th_root;
+ master_active = root->r.r_active;
+ master_set_numthreads = master_th->th.th_set_nproc;
+ task_thread_limit =
+ master_th->th.th_current_task->td_icvs.task_thread_limit;
- /* Invoke microtask for PRIMARY thread */
- KA_TRACE(20, ("__kmp_fork_call: T#%d(%d:0) invoke microtask = %p\n", gtid,
- parent_team->t.t_id, parent_team->t.t_pkfn));
+#if OMPT_SUPPORT
+ ompt_data_t ompt_parallel_data = ompt_data_none;
+ ompt_data_t *parent_task_data = NULL;
+ ompt_frame_t *ompt_frame = NULL;
+ void *return_address = NULL;
- if (!parent_team->t.t_invoke(gtid)) {
- KMP_ASSERT2(0, "cannot invoke microtask for PRIMARY thread");
- }
- KA_TRACE(20, ("__kmp_fork_call: T#%d(%d:0) done microtask = %p\n", gtid,
- parent_team->t.t_id, parent_team->t.t_pkfn));
- KMP_MB(); /* Flush all pending memory write invalidates. */
+ if (ompt_enabled.enabled) {
+ __ompt_get_task_info_internal(0, NULL, &parent_task_data, &ompt_frame,
+ NULL, NULL);
+ return_address = OMPT_LOAD_RETURN_ADDRESS(gtid);
+ }
+#endif
- KA_TRACE(20, ("__kmp_fork_call: parallel exit T#%d\n", gtid));
+ // Assign affinity to root thread if it hasn't happened yet
+ __kmp_assign_root_init_mask();
- return TRUE;
- } // Parallel closely nested in teams construct
+ // Nested level will be an index in the nested nthreads array
+ level = parent_team->t.t_level;
+ // used to launch non-serial teams even if nested is not allowed
+ active_level = parent_team->t.t_active_level;
+ // needed to check nesting inside the teams
+ teams_level = master_th->th.th_teams_level;
+#if KMP_NESTED_HOT_TEAMS
+ p_hot_teams = &master_th->th.th_hot_teams;
+ if (*p_hot_teams == NULL && __kmp_hot_teams_max_level > 0) {
+ *p_hot_teams = (kmp_hot_team_ptr_t *)__kmp_allocate(
+ sizeof(kmp_hot_team_ptr_t) * __kmp_hot_teams_max_level);
+ (*p_hot_teams)[0].hot_team = root->r.r_hot_team;
+ // it is either actual or not needed (when active_level > 0)
+ (*p_hot_teams)[0].hot_team_nth = 1;
+ }
+#endif
-#if KMP_DEBUG
- if (__kmp_tasking_mode != tskm_immediate_exec) {
- KMP_DEBUG_ASSERT(master_th->th.th_task_team ==
- parent_team->t.t_task_team[master_th->th.th_task_state]);
+#if OMPT_SUPPORT
+ if (ompt_enabled.enabled) {
+ if (ompt_enabled.ompt_callback_parallel_begin) {
+ int team_size = master_set_numthreads
+ ? master_set_numthreads
+ : get__nproc_2(parent_team, master_tid);
+ int flags = OMPT_INVOKER(call_context) |
+ ((microtask == (microtask_t)__kmp_teams_master)
+ ? ompt_parallel_league
+ : ompt_parallel_team);
+ ompt_callbacks.ompt_callback(ompt_callback_parallel_begin)(
+ parent_task_data, ompt_frame, &ompt_parallel_data, team_size, flags,
+ return_address);
+ }
+ master_th->th.ompt_thread_info.state = ompt_state_overhead;
}
#endif
+ master_th->th.th_ident = loc;
+
+ // Parallel closely nested in teams construct:
+ if (__kmp_is_fork_in_teams(master_th, microtask, level, teams_level, ap)) {
+ return __kmp_fork_in_teams(loc, gtid, parent_team, argc, master_th, root,
+ call_context, microtask, invoker,
+ master_set_numthreads, level,
+#if OMPT_SUPPORT
+ ompt_parallel_data, return_address,
+#endif
+ ap);
+ } // End parallel closely nested in teams construct
+
// Need this to happen before we determine the number of threads, not while
// we are allocating the team
//__kmp_push_current_task_to_thread(master_th, parent_team, 0);
- int enter_teams = 0;
- if (parent_team->t.t_active_level >=
- master_th->th.th_current_task->td_icvs.max_active_levels) {
+
+ KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(parent_team, master_th);
+
+ // Determine the number of threads
+ int enter_teams =
+ __kmp_is_entering_teams(active_level, level, teams_level, ap);
+ if ((!enter_teams &&
+ (parent_team->t.t_active_level >=
+ master_th->th.th_current_task->td_icvs.max_active_levels)) ||
+ (__kmp_library == library_serial)) {
+ KC_TRACE(10, ("__kmp_fork_call: T#%d serializing team\n", gtid));
nthreads = 1;
} else {
- enter_teams = ((ap == NULL && active_level == 0) ||
- (ap && teams_level > 0 && teams_level == level));
nthreads = master_set_numthreads
? master_set_numthreads
// TODO: get nproc directly from current task
: get__nproc_2(parent_team, master_tid);
+ // Use the thread_limit set for the current target task if exists, else go
+ // with the deduced nthreads
+ nthreads = task_thread_limit > 0 && task_thread_limit < nthreads
+ ? task_thread_limit
+ : nthreads;
// Check if we need to take forkjoin lock? (no need for serialized
- // parallel out of teams construct). This code moved here from
- // __kmp_reserve_threads() to speedup nested serialized parallels.
- if (nthreads > 1) {
- if ((get__max_active_levels(master_th) == 1 &&
- (root->r.r_in_parallel && !enter_teams)) ||
- (__kmp_library == library_serial)) {
- KC_TRACE(10, ("__kmp_fork_call: T#%d serializing team; requested %d"
- " threads\n",
- gtid, nthreads));
- nthreads = 1;
- }
- }
+ // parallel out of teams construct).
if (nthreads > 1) {
/* determine how many new threads we can use */
__kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
@@ -1741,232 +2094,14 @@ int __kmp_fork_call(ident_t *loc, int gtid,
// If we temporarily changed the set number of threads then restore it now
master_th->th.th_set_nproc = 0;
- /* create a serialized parallel region? */
if (nthreads == 1) {
-/* josh todo: hypothetical question: what do we do for OS X*? */
-#if KMP_OS_LINUX && \
- (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64)
- void *args[argc];
-#else
- void **args = (void **)KMP_ALLOCA(argc * sizeof(void *));
-#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || \
- KMP_ARCH_AARCH64) */
-
- KA_TRACE(20,
- ("__kmp_fork_call: T#%d serializing parallel region\n", gtid));
-
- __kmpc_serialized_parallel(loc, gtid);
-
-#if OMPD_SUPPORT
- master_th->th.th_serial_team->t.t_pkfn = microtask;
-#endif
-
- if (call_context == fork_context_intel) {
- /* TODO this sucks, use the compiler itself to pass args! :) */
- master_th->th.th_serial_team->t.t_ident = loc;
- if (!ap) {
- // revert change made in __kmpc_serialized_parallel()
- master_th->th.th_serial_team->t.t_level--;
- // Get args from parent team for teams construct
-
-#if OMPT_SUPPORT
- void *dummy;
- void **exit_frame_p;
- ompt_task_info_t *task_info;
-
- ompt_lw_taskteam_t lw_taskteam;
-
- if (ompt_enabled.enabled) {
- __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
- &ompt_parallel_data, return_address);
-
- __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
- // don't use lw_taskteam after linking. content was swaped
-
- task_info = OMPT_CUR_TASK_INFO(master_th);
- exit_frame_p = &(task_info->frame.exit_frame.ptr);
- if (ompt_enabled.ompt_callback_implicit_task) {
- OMPT_CUR_TASK_INFO(master_th)->thread_num =
- __kmp_tid_from_gtid(gtid);
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
- &(task_info->task_data), 1,
- OMPT_CUR_TASK_INFO(master_th)->thread_num,
- ompt_task_implicit);
- }
-
- /* OMPT state */
- master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
- } else {
- exit_frame_p = &dummy;
- }
-#endif
-
- {
- KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
- KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
- __kmp_invoke_microtask(microtask, gtid, 0, argc,
- parent_team->t.t_argv
-#if OMPT_SUPPORT
- ,
- exit_frame_p
-#endif
- );
- }
-
-#if OMPT_SUPPORT
- if (ompt_enabled.enabled) {
- *exit_frame_p = NULL;
- if (ompt_enabled.ompt_callback_implicit_task) {
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_end, NULL, &(task_info->task_data), 1,
- OMPT_CUR_TASK_INFO(master_th)->thread_num,
- ompt_task_implicit);
- }
- ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
- __ompt_lw_taskteam_unlink(master_th);
- if (ompt_enabled.ompt_callback_parallel_end) {
- ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
- &ompt_parallel_data, parent_task_data,
- OMPT_INVOKER(call_context) | ompt_parallel_team,
- return_address);
- }
- master_th->th.ompt_thread_info.state = ompt_state_overhead;
- }
-#endif
- } else if (microtask == (microtask_t)__kmp_teams_master) {
- KMP_DEBUG_ASSERT(master_th->th.th_team ==
- master_th->th.th_serial_team);
- team = master_th->th.th_team;
- // team->t.t_pkfn = microtask;
- team->t.t_invoke = invoker;
- __kmp_alloc_argv_entries(argc, team, TRUE);
- team->t.t_argc = argc;
- argv = (void **)team->t.t_argv;
- if (ap) {
- for (i = argc - 1; i >= 0; --i)
- *argv++ = va_arg(kmp_va_deref(ap), void *);
- } else {
- for (i = 0; i < argc; ++i)
- // Get args from parent team for teams construct
- argv[i] = parent_team->t.t_argv[i];
- }
- // AC: revert change made in __kmpc_serialized_parallel()
- // because initial code in teams should have level=0
- team->t.t_level--;
- // AC: call special invoker for outer "parallel" of teams construct
- invoker(gtid);
-#if OMPT_SUPPORT
- if (ompt_enabled.enabled) {
- ompt_task_info_t *task_info = OMPT_CUR_TASK_INFO(master_th);
- if (ompt_enabled.ompt_callback_implicit_task) {
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_end, NULL, &(task_info->task_data), 0,
- OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_initial);
- }
- if (ompt_enabled.ompt_callback_parallel_end) {
- ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
- &ompt_parallel_data, parent_task_data,
- OMPT_INVOKER(call_context) | ompt_parallel_league,
- return_address);
- }
- master_th->th.ompt_thread_info.state = ompt_state_overhead;
- }
-#endif
- } else {
- argv = args;
- for (i = argc - 1; i >= 0; --i)
- *argv++ = va_arg(kmp_va_deref(ap), void *);
- KMP_MB();
-
-#if OMPT_SUPPORT
- void *dummy;
- void **exit_frame_p;
- ompt_task_info_t *task_info;
-
- ompt_lw_taskteam_t lw_taskteam;
-
- if (ompt_enabled.enabled) {
- __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
- &ompt_parallel_data, return_address);
- __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
- // don't use lw_taskteam after linking. content was swaped
- task_info = OMPT_CUR_TASK_INFO(master_th);
- exit_frame_p = &(task_info->frame.exit_frame.ptr);
-
- /* OMPT implicit task begin */
- implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
- if (ompt_enabled.ompt_callback_implicit_task) {
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
- implicit_task_data, 1, __kmp_tid_from_gtid(gtid),
- ompt_task_implicit);
- OMPT_CUR_TASK_INFO(master_th)->thread_num =
- __kmp_tid_from_gtid(gtid);
- }
-
- /* OMPT state */
- master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
- } else {
- exit_frame_p = &dummy;
- }
-#endif
-
- {
- KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
- KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
- __kmp_invoke_microtask(microtask, gtid, 0, argc, args
+ return __kmp_serial_fork_call(loc, gtid, call_context, argc, microtask,
+ invoker, master_th, parent_team,
#if OMPT_SUPPORT
- ,
- exit_frame_p
+ &ompt_parallel_data, &return_address,
+ &parent_task_data,
#endif
- );
- }
-
-#if OMPT_SUPPORT
- if (ompt_enabled.enabled) {
- *exit_frame_p = NULL;
- if (ompt_enabled.ompt_callback_implicit_task) {
- ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
- ompt_scope_end, NULL, &(task_info->task_data), 1,
- OMPT_CUR_TASK_INFO(master_th)->thread_num,
- ompt_task_implicit);
- }
-
- ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
- __ompt_lw_taskteam_unlink(master_th);
- if (ompt_enabled.ompt_callback_parallel_end) {
- ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
- &ompt_parallel_data, parent_task_data,
- OMPT_INVOKER(call_context) | ompt_parallel_team,
- return_address);
- }
- master_th->th.ompt_thread_info.state = ompt_state_overhead;
- }
-#endif
- }
- } else if (call_context == fork_context_gnu) {
-#if OMPT_SUPPORT
- ompt_lw_taskteam_t lwt;
- __ompt_lw_taskteam_init(&lwt, master_th, gtid, &ompt_parallel_data,
- return_address);
-
- lwt.ompt_task_info.frame.exit_frame = ompt_data_none;
- __ompt_lw_taskteam_link(&lwt, master_th, 1);
-// don't use lw_taskteam after linking. content was swaped
-#endif
-
- // we were called from GNU native code
- KA_TRACE(20, ("__kmp_fork_call: T#%d serial exit\n", gtid));
- return FALSE;
- } else {
- KMP_ASSERT2(call_context < fork_context_last,
- "__kmp_fork_call: unknown fork_context parameter");
- }
-
- KA_TRACE(20, ("__kmp_fork_call: T#%d serial exit\n", gtid));
- KMP_MB();
- return FALSE;
+ ap);
} // if (nthreads == 1)
// GEH: only modify the executing flag in the case when not serialized
@@ -1988,9 +2123,18 @@ int __kmp_fork_call(ident_t *loc, int gtid,
// See if we need to make a copy of the ICVs.
int nthreads_icv = master_th->th.th_current_task->td_icvs.nproc;
- if ((level + 1 < __kmp_nested_nth.used) &&
- (__kmp_nested_nth.nth[level + 1] != nthreads_icv)) {
- nthreads_icv = __kmp_nested_nth.nth[level + 1];
+ kmp_nested_nthreads_t *nested_nth = NULL;
+ if (!master_th->th.th_set_nested_nth &&
+ (level + 1 < parent_team->t.t_nested_nth->used) &&
+ (parent_team->t.t_nested_nth->nth[level + 1] != nthreads_icv)) {
+ nthreads_icv = parent_team->t.t_nested_nth->nth[level + 1];
+ } else if (master_th->th.th_set_nested_nth) {
+ nested_nth = __kmp_override_nested_nth(master_th, level);
+ if ((level + 1 < nested_nth->used) &&
+ (nested_nth->nth[level + 1] != nthreads_icv))
+ nthreads_icv = nested_nth->nth[level + 1];
+ else
+ nthreads_icv = 0; // don't update
} else {
nthreads_icv = 0; // don't update
}
@@ -2099,6 +2243,24 @@ int __kmp_fork_call(ident_t *loc, int gtid,
KMP_CHECK_UPDATE(team->t.t_cancel_request, cancel_noreq);
KMP_CHECK_UPDATE(team->t.t_def_allocator, master_th->th.th_def_allocator);
+ // Check if hot team has potentially outdated list, and if so, free it
+ if (team->t.t_nested_nth &&
+ team->t.t_nested_nth != parent_team->t.t_nested_nth) {
+ KMP_INTERNAL_FREE(team->t.t_nested_nth->nth);
+ KMP_INTERNAL_FREE(team->t.t_nested_nth);
+ team->t.t_nested_nth = NULL;
+ }
+ team->t.t_nested_nth = parent_team->t.t_nested_nth;
+ if (master_th->th.th_set_nested_nth) {
+ if (!nested_nth)
+ nested_nth = __kmp_override_nested_nth(master_th, level);
+ team->t.t_nested_nth = nested_nth;
+ KMP_INTERNAL_FREE(master_th->th.th_set_nested_nth);
+ master_th->th.th_set_nested_nth = NULL;
+ master_th->th.th_set_nested_nth_sz = 0;
+ master_th->th.th_nt_strict = false;
+ }
+
// Update the floating point rounding in the team if required.
propagateFPControl(team);
#if OMPD_SUPPORT
@@ -2106,64 +2268,6 @@ int __kmp_fork_call(ident_t *loc, int gtid,
ompd_bp_parallel_begin();
#endif
- if (__kmp_tasking_mode != tskm_immediate_exec) {
- // Set primary thread's task team to team's task team. Unless this is hot
- // team, it should be NULL.
- KMP_DEBUG_ASSERT(master_th->th.th_task_team ==
- parent_team->t.t_task_team[master_th->th.th_task_state]);
- KA_TRACE(20, ("__kmp_fork_call: Primary T#%d pushing task_team %p / team "
- "%p, new task_team %p / team %p\n",
- __kmp_gtid_from_thread(master_th),
- master_th->th.th_task_team, parent_team,
- team->t.t_task_team[master_th->th.th_task_state], team));
-
- if (active_level || master_th->th.th_task_team) {
- // Take a memo of primary thread's task_state
- KMP_DEBUG_ASSERT(master_th->th.th_task_state_memo_stack);
- if (master_th->th.th_task_state_top >=
- master_th->th.th_task_state_stack_sz) { // increase size
- kmp_uint32 new_size = 2 * master_th->th.th_task_state_stack_sz;
- kmp_uint8 *old_stack, *new_stack;
- kmp_uint32 i;
- new_stack = (kmp_uint8 *)__kmp_allocate(new_size);
- for (i = 0; i < master_th->th.th_task_state_stack_sz; ++i) {
- new_stack[i] = master_th->th.th_task_state_memo_stack[i];
- }
- for (i = master_th->th.th_task_state_stack_sz; i < new_size;
- ++i) { // zero-init rest of stack
- new_stack[i] = 0;
- }
- old_stack = master_th->th.th_task_state_memo_stack;
- master_th->th.th_task_state_memo_stack = new_stack;
- master_th->th.th_task_state_stack_sz = new_size;
- __kmp_free(old_stack);
- }
- // Store primary thread's task_state on stack
- master_th->th
- .th_task_state_memo_stack[master_th->th.th_task_state_top] =
- master_th->th.th_task_state;
- master_th->th.th_task_state_top++;
-#if KMP_NESTED_HOT_TEAMS
- if (master_th->th.th_hot_teams &&
- active_level < __kmp_hot_teams_max_level &&
- team == master_th->th.th_hot_teams[active_level].hot_team) {
- // Restore primary thread's nested state if nested hot team
- master_th->th.th_task_state =
- master_th->th
- .th_task_state_memo_stack[master_th->th.th_task_state_top];
- } else {
-#endif
- master_th->th.th_task_state = 0;
-#if KMP_NESTED_HOT_TEAMS
- }
-#endif
- }
-#if !KMP_NESTED_HOT_TEAMS
- KMP_DEBUG_ASSERT((master_th->th.th_task_team == NULL) ||
- (team == root->r.r_hot_team));
-#endif
- }
-
KA_TRACE(
20,
("__kmp_fork_call: T#%d(%d:%d)->(%d:0) created a team of %d threads\n",
@@ -2371,8 +2475,7 @@ void __kmp_join_call(ident_t *loc, int gtid
__kmp_gtid_from_thread(master_th), team,
team->t.t_task_team[master_th->th.th_task_state],
master_th->th.th_task_team));
- KMP_DEBUG_ASSERT(master_th->th.th_task_team ==
- team->t.t_task_team[master_th->th.th_task_state]);
+ KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team, master_th);
}
#endif
@@ -2396,6 +2499,9 @@ void __kmp_join_call(ident_t *loc, int gtid
#if OMPT_SUPPORT
if (ompt_enabled.enabled) {
+ if (fork_context == fork_context_gnu) {
+ __ompt_lw_taskteam_unlink(master_th);
+ }
__kmp_join_restore_state(master_th, parent_team);
}
#endif
@@ -2430,12 +2536,6 @@ void __kmp_join_call(ident_t *loc, int gtid
parent_team->t.t_stack_id = NULL;
}
#endif
-
- if (team->t.t_nproc > 1 &&
- __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
- team->t.b->update_num_threads(team->t.t_nproc);
- __kmp_add_threads_to_team(team, team->t.t_nproc);
- }
}
KMP_MB();
@@ -2613,18 +2713,11 @@ void __kmp_join_call(ident_t *loc, int gtid
}
if (__kmp_tasking_mode != tskm_immediate_exec) {
- if (master_th->th.th_task_state_top >
- 0) { // Restore task state from memo stack
- KMP_DEBUG_ASSERT(master_th->th.th_task_state_memo_stack);
- // Remember primary thread's state if we re-use this nested hot team
- master_th->th.th_task_state_memo_stack[master_th->th.th_task_state_top] =
- master_th->th.th_task_state;
- --master_th->th.th_task_state_top; // pop
- // Now restore state at this level
- master_th->th.th_task_state =
- master_th->th
- .th_task_state_memo_stack[master_th->th.th_task_state_top];
- }
+ // Restore primary thread's task state from team structure
+ KMP_DEBUG_ASSERT(team->t.t_primary_task_state == 0 ||
+ team->t.t_primary_task_state == 1);
+ master_th->th.th_task_state = (kmp_uint8)team->t.t_primary_task_state;
+
// Copy the task team from the parent team to the primary thread
master_th->th.th_task_team =
parent_team->t.t_task_team[master_th->th.th_task_state];
@@ -2642,7 +2735,7 @@ void __kmp_join_call(ident_t *loc, int gtid
__kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
#if KMP_AFFINITY_SUPPORTED
- if (master_th->th.th_team->t.t_level == 0 && __kmp_affin_reset) {
+ if (master_th->th.th_team->t.t_level == 0 && __kmp_affinity.flags.reset) {
__kmp_reset_root_init_mask(gtid);
}
#endif
@@ -3223,6 +3316,8 @@ static kmp_internal_control_t __kmp_get_global_icvs(void) {
// next parallel region (per thread)
// (use a max ub on value if __kmp_parallel_initialize not called yet)
__kmp_cg_max_nth, // int thread_limit;
+ __kmp_task_max_nth, // int task_thread_limit; // to set the thread_limit
+ // on task. This is used in the case of target thread_limit
__kmp_dflt_max_active_levels, // int max_active_levels; //internal control
// for max_active_levels
r_sched, // kmp_r_sched_t sched; //internal control for runtime schedule
@@ -3299,6 +3394,7 @@ static void __kmp_initialize_root(kmp_root_t *root) {
root_team->t.t_serialized = 1;
// TODO???: root_team->t.t_max_active_levels = __kmp_dflt_max_active_levels;
root_team->t.t_sched.sched = r_sched.sched;
+ root_team->t.t_nested_nth = &__kmp_nested_nth;
KA_TRACE(
20,
("__kmp_initialize_root: init root team %d arrived: join=%u, plain=%u\n",
@@ -3336,6 +3432,7 @@ static void __kmp_initialize_root(kmp_root_t *root) {
// TODO???: hot_team->t.t_max_active_levels = __kmp_dflt_max_active_levels;
hot_team->t.t_sched.sched = r_sched.sched;
hot_team->t.t_size_changed = 0;
+ hot_team->t.t_nested_nth = &__kmp_nested_nth;
}
#ifdef KMP_DEBUG
@@ -3934,7 +4031,7 @@ int __kmp_register_root(int initial_thread) {
__kmp_root_counter++;
#if OMPT_SUPPORT
- if (!initial_thread && ompt_enabled.enabled) {
+ if (ompt_enabled.enabled) {
kmp_info_t *root_thread = ompt_get_thread();
@@ -4202,6 +4299,7 @@ static void __kmp_initialize_info(kmp_info_t *this_thr, kmp_team_t *team,
else // no tasking --> always safe to reap
this_thr->th.th_reap_state = KMP_SAFE_TO_REAP;
this_thr->th.th_set_proc_bind = proc_bind_default;
+
#if KMP_AFFINITY_SUPPORTED
this_thr->th.th_new_place = this_thr->th.th_current_place;
#endif
@@ -4311,17 +4409,6 @@ static void __kmp_initialize_info(kmp_info_t *this_thr, kmp_team_t *team,
this_thr->th.th_next_pool = NULL;
- if (!this_thr->th.th_task_state_memo_stack) {
- size_t i;
- this_thr->th.th_task_state_memo_stack =
- (kmp_uint8 *)__kmp_allocate(4 * sizeof(kmp_uint8));
- this_thr->th.th_task_state_top = 0;
- this_thr->th.th_task_state_stack_sz = 4;
- for (i = 0; i < this_thr->th.th_task_state_stack_sz;
- ++i) // zero init the stack
- this_thr->th.th_task_state_memo_stack[i] = 0;
- }
-
KMP_DEBUG_ASSERT(!this_thr->th.th_spin_here);
KMP_DEBUG_ASSERT(this_thr->th.th_next_waiting == 0);
@@ -4346,8 +4433,10 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
#endif
KMP_MB();
- /* first, try to get one from the thread pool */
- if (__kmp_thread_pool) {
+ /* first, try to get one from the thread pool unless allocating thread is
+ * the main hidden helper thread. The hidden helper team should always
+ * allocate new OS threads. */
+ if (__kmp_thread_pool && !KMP_HIDDEN_HELPER_TEAM(team)) {
new_thr = CCAST(kmp_info_t *, __kmp_thread_pool);
__kmp_thread_pool = (volatile kmp_info_t *)new_thr->th.th_next_pool;
if (new_thr == __kmp_thread_pool_insert_pt) {
@@ -4376,8 +4465,6 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
TCW_4(__kmp_nth, __kmp_nth + 1);
new_thr->th.th_task_state = 0;
- new_thr->th.th_task_state_top = 0;
- new_thr->th.th_task_state_stack_sz = 4;
if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
// Make sure pool thread has transitioned to waiting on own thread struct
@@ -4412,7 +4499,7 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
}
/* no, well fork a new one */
- KMP_ASSERT(__kmp_nth == __kmp_all_nth);
+ KMP_ASSERT(KMP_HIDDEN_HELPER_TEAM(team) || __kmp_nth == __kmp_all_nth);
KMP_ASSERT(__kmp_all_nth < __kmp_threads_capacity);
#if KMP_USE_MONITOR
@@ -4465,6 +4552,11 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
/* allocate space for it. */
new_thr = (kmp_info_t *)__kmp_allocate(sizeof(kmp_info_t));
+ new_thr->th.th_nt_strict = false;
+ new_thr->th.th_nt_loc = NULL;
+ new_thr->th.th_nt_sev = severity_fatal;
+ new_thr->th.th_nt_msg = NULL;
+
TCW_SYNC_PTR(__kmp_threads[new_gtid], new_thr);
#if USE_ITT_BUILD && USE_ITT_NOTIFY && KMP_DEBUG
@@ -4575,6 +4667,9 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
new_thr->th.th_active_in_pool = FALSE;
TCW_4(new_thr->th.th_active, TRUE);
+ new_thr->th.th_set_nested_nth = NULL;
+ new_thr->th.th_set_nested_nth_sz = 0;
+
/* adjust the global counters */
__kmp_all_nth++;
__kmp_nth++;
@@ -4603,6 +4698,11 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
}
#endif /* KMP_ADJUST_BLOCKTIME */
+#if KMP_AFFINITY_SUPPORTED
+ // Set the affinity and topology information for new thread
+ __kmp_affinity_set_init_mask(new_gtid, /*isa_root=*/FALSE);
+#endif
+
/* actually fork it and create the new worker thread */
KF_TRACE(
10, ("__kmp_allocate_thread: before __kmp_create_worker: %p\n", new_thr));
@@ -4695,26 +4795,20 @@ static void __kmp_initialize_team(kmp_team_t *team, int new_nproc,
KF_TRACE(10, ("__kmp_initialize_team: exit: team=%p\n", team));
}
-#if (KMP_OS_LINUX || KMP_OS_FREEBSD) && KMP_AFFINITY_SUPPORTED
-/* Sets full mask for thread and returns old mask, no changes to structures. */
-static void
-__kmp_set_thread_affinity_mask_full_tmp(kmp_affin_mask_t *old_mask) {
- if (KMP_AFFINITY_CAPABLE()) {
- int status;
- if (old_mask != NULL) {
- status = __kmp_get_system_affinity(old_mask, TRUE);
- int error = errno;
- if (status != 0) {
- __kmp_fatal(KMP_MSG(ChangeThreadAffMaskError), KMP_ERR(error),
- __kmp_msg_null);
- }
- }
- __kmp_set_system_affinity(__kmp_affin_fullMask, TRUE);
+#if KMP_AFFINITY_SUPPORTED
+static inline void __kmp_set_thread_place(kmp_team_t *team, kmp_info_t *th,
+ int first, int last, int newp) {
+ th->th.th_first_place = first;
+ th->th.th_last_place = last;
+ th->th.th_new_place = newp;
+ if (newp != th->th.th_current_place) {
+ if (__kmp_display_affinity && team->t.t_display_affinity != 1)
+ team->t.t_display_affinity = 1;
+ // Copy topology information associated with the new place
+ th->th.th_topology_ids = __kmp_affinity.ids[th->th.th_new_place];
+ th->th.th_topology_attrs = __kmp_affinity.attrs[th->th.th_new_place];
}
}
-#endif
-
-#if KMP_AFFINITY_SUPPORTED
// __kmp_partition_places() is the heart of the OpenMP 4.0 affinity mechanism.
// It calculates the worker + primary thread's partition based upon the parent
@@ -4731,6 +4825,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
int first_place = master_th->th.th_first_place;
int last_place = master_th->th.th_last_place;
int masters_place = master_th->th.th_current_place;
+ int num_masks = __kmp_affinity.num_masks;
team->t.t_first_place = first_place;
team->t.t_last_place = last_place;
@@ -4753,13 +4848,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
for (f = 1; f < n_th; f++) {
kmp_info_t *th = team->t.t_threads[f];
KMP_DEBUG_ASSERT(th != NULL);
- th->th.th_first_place = first_place;
- th->th.th_last_place = last_place;
- th->th.th_new_place = masters_place;
- if (__kmp_display_affinity && masters_place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ __kmp_set_thread_place(team, th, first_place, last_place, masters_place);
KA_TRACE(100, ("__kmp_partition_places: primary: T#%d(%d:%d) place %d "
"partition = [%d,%d]\n",
@@ -4775,7 +4864,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
if (first_place <= last_place) {
n_places = last_place - first_place + 1;
} else {
- n_places = __kmp_affinity_num_masks - first_place + last_place + 1;
+ n_places = num_masks - first_place + last_place + 1;
}
if (n_th <= n_places) {
int place = masters_place;
@@ -4785,18 +4874,12 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
}
- th->th.th_first_place = first_place;
- th->th.th_last_place = last_place;
- th->th.th_new_place = place;
- if (__kmp_display_affinity && place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ __kmp_set_thread_place(team, th, first_place, last_place, place);
KA_TRACE(100, ("__kmp_partition_places: close: T#%d(%d:%d) place %d "
"partition = [%d,%d]\n",
@@ -4815,13 +4898,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
kmp_info_t *th = team->t.t_threads[f];
KMP_DEBUG_ASSERT(th != NULL);
- th->th.th_first_place = first_place;
- th->th.th_last_place = last_place;
- th->th.th_new_place = place;
- if (__kmp_display_affinity && place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ __kmp_set_thread_place(team, th, first_place, last_place, place);
s_count++;
if ((s_count == S) && rem && (gap_ct == gap)) {
@@ -4830,7 +4907,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
// we added an extra thread to this place; move to next place
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -4841,7 +4918,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
} else if (s_count == S) { // place full; don't add extra
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -4868,12 +4945,12 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
if (first_place <= last_place) {
n_places = last_place - first_place + 1;
} else {
- n_places = __kmp_affinity_num_masks - first_place + last_place + 1;
+ n_places = num_masks - first_place + last_place + 1;
}
if (n_th <= n_places) {
int place = -1;
- if (n_places != static_cast(__kmp_affinity_num_masks)) {
+ if (n_places != num_masks) {
int S = n_places / n_th;
int s_count, rem, gap, gap_ct;
@@ -4888,17 +4965,12 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
kmp_info_t *th = team->t.t_threads[f];
KMP_DEBUG_ASSERT(th != NULL);
- th->th.th_first_place = place;
- th->th.th_new_place = place;
- if (__kmp_display_affinity && place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ int fplace = place, nplace = place;
s_count = 1;
while (s_count < S) {
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -4908,7 +4980,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
if (rem && (gap_ct == gap)) {
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -4916,12 +4988,12 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
rem--;
gap_ct = 0;
}
- th->th.th_last_place = place;
+ __kmp_set_thread_place(team, th, fplace, place, nplace);
gap_ct++;
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -4929,10 +5001,10 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
KA_TRACE(100,
("__kmp_partition_places: spread: T#%d(%d:%d) place %d "
- "partition = [%d,%d], __kmp_affinity_num_masks: %u\n",
+ "partition = [%d,%d], num_masks: %u\n",
__kmp_gtid_from_thread(team->t.t_threads[f]), team->t.t_id,
f, th->th.th_new_place, th->th.th_first_place,
- th->th.th_last_place, __kmp_affinity_num_masks));
+ th->th.th_last_place, num_masks));
}
} else {
/* Having uniform space of available computation places I can create
@@ -4982,13 +5054,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
KMP_DEBUG_ASSERT(last_place >= first_place);
th = team->t.t_threads[f];
KMP_DEBUG_ASSERT(th);
- th->th.th_first_place = first;
- th->th.th_new_place = place;
- th->th.th_last_place = last;
- if (__kmp_display_affinity && place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ __kmp_set_thread_place(team, th, first, last, place);
KA_TRACE(100,
("__kmp_partition_places: spread: T#%d(%d:%d) place %d "
"partition = [%d,%d], spacing = %.4f\n",
@@ -5014,13 +5080,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
kmp_info_t *th = team->t.t_threads[f];
KMP_DEBUG_ASSERT(th != NULL);
- th->th.th_first_place = place;
- th->th.th_last_place = place;
- th->th.th_new_place = place;
- if (__kmp_display_affinity && place != th->th.th_current_place &&
- team->t.t_display_affinity != 1) {
- team->t.t_display_affinity = 1;
- }
+ __kmp_set_thread_place(team, th, place, place, place);
s_count++;
if ((s_count == S) && rem && (gap_ct == gap)) {
@@ -5029,7 +5089,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
// we added an extra thread to this place; move on to next place
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -5040,7 +5100,7 @@ static void __kmp_partition_places(kmp_team_t *team, int update_master_only) {
} else if (s_count == S) { // place is full; don't add extra thread
if (place == last_place) {
place = first_place;
- } else if (place == (int)(__kmp_affinity_num_masks - 1)) {
+ } else if (place == (num_masks - 1)) {
place = 0;
} else {
place++;
@@ -5210,6 +5270,15 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
// Activate team threads via th_used_in_team
__kmp_add_threads_to_team(team, new_nproc);
}
+ // When decreasing team size, threads no longer in the team should
+ // unref task team.
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ for (f = new_nproc; f < team->t.t_nproc; f++) {
+ kmp_info_t *th = team->t.t_threads[f];
+ KMP_DEBUG_ASSERT(th);
+ th->th.th_task_team = NULL;
+ }
+ }
#if KMP_NESTED_HOT_TEAMS
if (__kmp_hot_teams_mode == 0) {
// AC: saved number of threads should correspond to team's value in this
@@ -5220,11 +5289,6 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
/* release the extra threads we don't need any more */
for (f = new_nproc; f < team->t.t_nproc; f++) {
KMP_DEBUG_ASSERT(team->t.t_threads[f]);
- if (__kmp_tasking_mode != tskm_immediate_exec) {
- // When decreasing team size, threads no longer in the team should
- // unref task team.
- team->t.t_threads[f]->th.th_task_team = NULL;
- }
__kmp_free_thread(team->t.t_threads[f]);
team->t.t_threads[f] = NULL;
}
@@ -5278,12 +5342,6 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
#endif
}
} else { // team->t.t_nproc < new_nproc
-#if (KMP_OS_LINUX || KMP_OS_FREEBSD) && KMP_AFFINITY_SUPPORTED
- kmp_affin_mask_t *old_mask;
- if (KMP_AFFINITY_CAPABLE()) {
- KMP_CPU_ALLOC(old_mask);
- }
-#endif
KA_TRACE(20,
("__kmp_allocate_team: increasing hot team thread count to %d\n",
@@ -5326,13 +5384,14 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
__kmp_reinitialize_team(team, new_icvs, NULL);
}
-#if (KMP_OS_LINUX || KMP_OS_FREEBSD) && KMP_AFFINITY_SUPPORTED
+#if (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY) && \
+ KMP_AFFINITY_SUPPORTED
/* Temporarily set full mask for primary thread before creation of
workers. The reason is that workers inherit the affinity from the
primary thread, so if a lot of workers are created on the single
core quickly, they don't get a chance to set their own affinity for
a long time. */
- __kmp_set_thread_affinity_mask_full_tmp(old_mask);
+ kmp_affinity_raii_t new_temp_affinity{__kmp_affin_fullMask};
#endif
/* allocate new threads for the hot team */
@@ -5362,12 +5421,10 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
}
}
-#if (KMP_OS_LINUX || KMP_OS_FREEBSD) && KMP_AFFINITY_SUPPORTED
- if (KMP_AFFINITY_CAPABLE()) {
- /* Restore initial primary thread's affinity mask */
- __kmp_set_system_affinity(old_mask, TRUE);
- KMP_CPU_FREE(old_mask);
- }
+#if (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY) && \
+ KMP_AFFINITY_SUPPORTED
+ /* Restore initial primary thread's affinity mask */
+ new_temp_affinity.restore();
#endif
#if KMP_NESTED_HOT_TEAMS
} // end of check of t_nproc vs. new_nproc vs. hot_team_nth
@@ -5388,21 +5445,10 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
__kmp_initialize_info(team->t.t_threads[f], team, f,
__kmp_gtid_from_tid(f, team));
- if (level) { // set th_task_state for new threads in nested hot team
- // __kmp_initialize_info() no longer zeroes th_task_state, so we should
- // only need to set the th_task_state for the new threads. th_task_state
- // for primary thread will not be accurate until after this in
- // __kmp_fork_call(), so we look to the primary thread's memo_stack to
- // get the correct value.
- for (f = old_nproc; f < team->t.t_nproc; ++f)
- team->t.t_threads[f]->th.th_task_state =
- team->t.t_threads[0]->th.th_task_state_memo_stack[level];
- } else { // set th_task_state for new threads in non-nested hot team
- // copy primary thread's state
- kmp_uint8 old_state = team->t.t_threads[0]->th.th_task_state;
- for (f = old_nproc; f < team->t.t_nproc; ++f)
- team->t.t_threads[f]->th.th_task_state = old_state;
- }
+ // set th_task_state for new threads in hot team with older thread's state
+ kmp_uint8 old_state = team->t.t_threads[old_nproc - 1]->th.th_task_state;
+ for (f = old_nproc; f < team->t.t_nproc; ++f)
+ team->t.t_threads[f]->th.th_task_state = old_state;
#ifdef KMP_DEBUG
for (f = 0; f < team->t.t_nproc; ++f) {
@@ -5420,7 +5466,6 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
}
} // Check changes in number of threads
- kmp_info_t *master = team->t.t_threads[0];
if (master->th.th_teams_microtask) {
for (f = 1; f < new_nproc; ++f) {
// propagate teams construct specific info to workers
@@ -5526,6 +5571,8 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
__ompt_team_assign_id(team, ompt_parallel_data);
#endif
+ team->t.t_nested_nth = NULL;
+
KMP_MB();
return team;
@@ -5597,6 +5644,8 @@ __kmp_allocate_team(kmp_root_t *root, int new_nproc, int max_nproc,
KMP_MB();
+ team->t.t_nested_nth = NULL;
+
KA_TRACE(20, ("__kmp_allocate_team: done creating a new team %d.\n",
team->t.t_id));
@@ -5672,9 +5721,8 @@ void __kmp_free_team(kmp_root_t *root,
}
#endif
// first check if thread is sleeping
- kmp_flag_64<> fl(&th->th.th_bar[bs_forkjoin_barrier].bb.b_go, th);
- if (fl.is_sleeping())
- fl.resume(__kmp_gtid_from_thread(th));
+ if (th->th.th_sleep_loc)
+ __kmp_null_resume_wrapper(th);
KMP_CPU_PAUSE();
}
}
@@ -5700,6 +5748,14 @@ void __kmp_free_team(kmp_root_t *root,
}
}
+ // Before clearing parent pointer, check if nested_nth list should be freed
+ if (team->t.t_nested_nth && team->t.t_nested_nth != &__kmp_nested_nth &&
+ team->t.t_nested_nth != team->t.t_parent->t.t_nested_nth) {
+ KMP_INTERNAL_FREE(team->t.t_nested_nth->nth);
+ KMP_INTERNAL_FREE(team->t.t_nested_nth);
+ }
+ team->t.t_nested_nth = NULL;
+
// Reset pointer to parent team only for non-hot teams.
team->t.t_parent = NULL;
team->t.t_level = 0;
@@ -5709,8 +5765,8 @@ void __kmp_free_team(kmp_root_t *root,
for (f = 1; f < team->t.t_nproc; ++f) {
KMP_DEBUG_ASSERT(team->t.t_threads[f]);
if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
- KMP_COMPARE_AND_STORE_ACQ32(&(team->t.t_threads[f]->th.th_used_in_team),
- 1, 2);
+ (void)KMP_COMPARE_AND_STORE_ACQ32(
+ &(team->t.t_threads[f]->th.th_used_in_team), 1, 2);
}
__kmp_free_thread(team->t.t_threads[f]);
}
@@ -6047,7 +6103,6 @@ void *__kmp_launch_thread(kmp_info_t *this_thr) {
__kmp_join_barrier(gtid);
}
}
- TCR_SYNC_PTR((intptr_t)__kmp_global.g.g_done);
#if OMPD_SUPPORT
if (ompd_state & OMPD_ENABLE_BP)
@@ -6216,11 +6271,6 @@ static void __kmp_reap_thread(kmp_info_t *thread, int is_root) {
thread->th.th_pri_common = NULL;
}
- if (thread->th.th_task_state_memo_stack != NULL) {
- __kmp_free(thread->th.th_task_state_memo_stack);
- thread->th.th_task_state_memo_stack = NULL;
- }
-
#if KMP_USE_BGET
if (thread->th.th_local.bget_data != NULL) {
__kmp_finalize_bget(thread);
@@ -6683,6 +6733,13 @@ static inline char *__kmp_reg_status_name() {
#endif
} // __kmp_reg_status_get
+#if defined(KMP_USE_SHM)
+bool __kmp_shm_available = false;
+bool __kmp_tmp_available = false;
+// If /dev/shm is not accessible, we will create a temporary file under /tmp.
+char *temp_reg_status_file_name = nullptr;
+#endif
+
void __kmp_register_library_startup(void) {
char *name = __kmp_reg_status_name(); // Name of the environment variable.
@@ -6708,52 +6765,108 @@ void __kmp_register_library_startup(void) {
char *value = NULL; // Actual value of the environment variable.
#if defined(KMP_USE_SHM)
- char *shm_name = __kmp_str_format("/%s", name);
- int shm_preexist = 0;
- char *data1;
- int fd1 = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0666);
- if ((fd1 == -1) && (errno == EEXIST)) {
- // file didn't open because it already exists.
- // try opening existing file
- fd1 = shm_open(shm_name, O_RDWR, 0666);
- if (fd1 == -1) { // file didn't open
- // error out here
- __kmp_fatal(KMP_MSG(FunctionError, "Can't open SHM"), KMP_ERR(0),
- __kmp_msg_null);
- } else {
- // able to open existing file
- shm_preexist = 1;
+ char *shm_name = nullptr;
+ char *data1 = nullptr;
+ __kmp_shm_available = __kmp_detect_shm();
+ if (__kmp_shm_available) {
+ int fd1 = -1;
+ shm_name = __kmp_str_format("/%s", name);
+ int shm_preexist = 0;
+ fd1 = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0600);
+ if ((fd1 == -1) && (errno == EEXIST)) {
+ // file didn't open because it already exists.
+ // try opening existing file
+ fd1 = shm_open(shm_name, O_RDWR, 0600);
+ if (fd1 == -1) { // file didn't open
+ KMP_WARNING(FunctionError, "Can't open SHM");
+ __kmp_shm_available = false;
+ } else { // able to open existing file
+ shm_preexist = 1;
+ }
}
- } else if (fd1 == -1) { // SHM didn't open; it was due to error other than
- // already exists.
- // error out here.
- __kmp_fatal(KMP_MSG(FunctionError, "Can't open SHM2"), KMP_ERR(errno),
- __kmp_msg_null);
- }
- if (shm_preexist == 0) {
- // we created SHM now set size
- if (ftruncate(fd1, SHM_SIZE) == -1) {
- // error occured setting size;
- __kmp_fatal(KMP_MSG(FunctionError, "Can't set size of SHM"),
- KMP_ERR(errno), __kmp_msg_null);
+ if (__kmp_shm_available && shm_preexist == 0) { // SHM created, set size
+ if (ftruncate(fd1, SHM_SIZE) == -1) { // error occured setting size;
+ KMP_WARNING(FunctionError, "Can't set size of SHM");
+ __kmp_shm_available = false;
+ }
}
+ if (__kmp_shm_available) { // SHM exists, now map it
+ data1 = (char *)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
+ fd1, 0);
+ if (data1 == MAP_FAILED) { // failed to map shared memory
+ KMP_WARNING(FunctionError, "Can't map SHM");
+ __kmp_shm_available = false;
+ }
+ }
+ if (__kmp_shm_available) { // SHM mapped
+ if (shm_preexist == 0) { // set data to SHM, set value
+ KMP_STRCPY_S(data1, SHM_SIZE, __kmp_registration_str);
+ }
+ // Read value from either what we just wrote or existing file.
+ value = __kmp_str_format("%s", data1); // read value from SHM
+ munmap(data1, SHM_SIZE);
+ }
+ if (fd1 != -1)
+ close(fd1);
+ }
+ if (!__kmp_shm_available)
+ __kmp_tmp_available = __kmp_detect_tmp();
+ if (!__kmp_shm_available && __kmp_tmp_available) {
+ // SHM failed to work due to an error other than that the file already
+ // exists. Try to create a temp file under /tmp.
+ // If /tmp isn't accessible, fall back to using environment variable.
+ // TODO: /tmp might not always be the temporary directory. For now we will
+ // not consider TMPDIR.
+ int fd1 = -1;
+ temp_reg_status_file_name = __kmp_str_format("/tmp/%s", name);
+ int tmp_preexist = 0;
+ fd1 = open(temp_reg_status_file_name, O_CREAT | O_EXCL | O_RDWR, 0600);
+ if ((fd1 == -1) && (errno == EEXIST)) {
+ // file didn't open because it already exists.
+ // try opening existing file
+ fd1 = open(temp_reg_status_file_name, O_RDWR, 0600);
+ if (fd1 == -1) { // file didn't open if (fd1 == -1) {
+ KMP_WARNING(FunctionError, "Can't open TEMP");
+ __kmp_tmp_available = false;
+ } else {
+ tmp_preexist = 1;
+ }
+ }
+ if (__kmp_tmp_available && tmp_preexist == 0) {
+ // we created /tmp file now set size
+ if (ftruncate(fd1, SHM_SIZE) == -1) { // error occured setting size;
+ KMP_WARNING(FunctionError, "Can't set size of /tmp file");
+ __kmp_tmp_available = false;
+ }
+ }
+ if (__kmp_tmp_available) {
+ data1 = (char *)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
+ fd1, 0);
+ if (data1 == MAP_FAILED) { // failed to map /tmp
+ KMP_WARNING(FunctionError, "Can't map /tmp");
+ __kmp_tmp_available = false;
+ }
+ }
+ if (__kmp_tmp_available) {
+ if (tmp_preexist == 0) { // set data to TMP, set value
+ KMP_STRCPY_S(data1, SHM_SIZE, __kmp_registration_str);
+ }
+ // Read value from either what we just wrote or existing file.
+ value = __kmp_str_format("%s", data1); // read value from SHM
+ munmap(data1, SHM_SIZE);
+ }
+ if (fd1 != -1)
+ close(fd1);
}
- data1 =
- (char *)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);
- if (data1 == MAP_FAILED) {
- // failed to map shared memory
- __kmp_fatal(KMP_MSG(FunctionError, "Can't map SHM"), KMP_ERR(errno),
- __kmp_msg_null);
- }
- if (shm_preexist == 0) { // set data to SHM, set value
- KMP_STRCPY_S(data1, SHM_SIZE, __kmp_registration_str);
+ if (!__kmp_shm_available && !__kmp_tmp_available) {
+ // no /dev/shm and no /tmp -- fall back to environment variable
+ // Set environment variable, but do not overwrite if it exists.
+ __kmp_env_set(name, __kmp_registration_str, 0);
+ // read value to see if it got set
+ value = __kmp_env_get(name);
}
- // Read value from either what we just wrote or existing file.
- value = __kmp_str_format("%s", data1); // read value from SHM
- munmap(data1, SHM_SIZE);
- close(fd1);
#else // Windows and unix with static library
- // Set environment variable, but do not overwrite if it is exist.
+ // Set environment variable, but do not overwrite if it exists.
__kmp_env_set(name, __kmp_registration_str, 0);
// read value to see if it got set
value = __kmp_env_get(name);
@@ -6813,8 +6926,14 @@ void __kmp_register_library_startup(void) {
case 2: { // Neighbor is dead.
#if defined(KMP_USE_SHM)
- // close shared memory.
- shm_unlink(shm_name); // this removes file in /dev/shm
+ if (__kmp_shm_available) { // close shared memory.
+ shm_unlink(shm_name); // this removes file in /dev/shm
+ } else if (__kmp_tmp_available) {
+ unlink(temp_reg_status_file_name); // this removes the temp file
+ } else {
+ // Clear the variable and try to register library again.
+ __kmp_env_unset(name);
+ }
#else
// Clear the variable and try to register library again.
__kmp_env_unset(name);
@@ -6827,7 +6946,8 @@ void __kmp_register_library_startup(void) {
}
KMP_INTERNAL_FREE((void *)value);
#if defined(KMP_USE_SHM)
- KMP_INTERNAL_FREE((void *)shm_name);
+ if (shm_name)
+ KMP_INTERNAL_FREE((void *)shm_name);
#endif
} // while
KMP_INTERNAL_FREE((void *)name);
@@ -6840,18 +6960,32 @@ void __kmp_unregister_library(void) {
char *value = NULL;
#if defined(KMP_USE_SHM)
- char *shm_name = __kmp_str_format("/%s", name);
- int fd1 = shm_open(shm_name, O_RDONLY, 0666);
- if (fd1 == -1) {
- // file did not open. return.
- return;
- }
- char *data1 = (char *)mmap(0, SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0);
- if (data1 != MAP_FAILED) {
- value = __kmp_str_format("%s", data1); // read value from SHM
- munmap(data1, SHM_SIZE);
+ char *shm_name = nullptr;
+ int fd1;
+ if (__kmp_shm_available) {
+ shm_name = __kmp_str_format("/%s", name);
+ fd1 = shm_open(shm_name, O_RDONLY, 0600);
+ if (fd1 != -1) { // File opened successfully
+ char *data1 = (char *)mmap(0, SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0);
+ if (data1 != MAP_FAILED) {
+ value = __kmp_str_format("%s", data1); // read value from SHM
+ munmap(data1, SHM_SIZE);
+ }
+ close(fd1);
+ }
+ } else if (__kmp_tmp_available) { // try /tmp
+ fd1 = open(temp_reg_status_file_name, O_RDONLY);
+ if (fd1 != -1) { // File opened successfully
+ char *data1 = (char *)mmap(0, SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0);
+ if (data1 != MAP_FAILED) {
+ value = __kmp_str_format("%s", data1); // read value from /tmp
+ munmap(data1, SHM_SIZE);
+ }
+ close(fd1);
+ }
+ } else { // fall back to envirable
+ value = __kmp_env_get(name);
}
- close(fd1);
#else
value = __kmp_env_get(name);
#endif
@@ -6861,14 +6995,23 @@ void __kmp_unregister_library(void) {
if (value != NULL && strcmp(value, __kmp_registration_str) == 0) {
// Ok, this is our variable. Delete it.
#if defined(KMP_USE_SHM)
- shm_unlink(shm_name); // this removes file in /dev/shm
+ if (__kmp_shm_available) {
+ shm_unlink(shm_name); // this removes file in /dev/shm
+ } else if (__kmp_tmp_available) {
+ unlink(temp_reg_status_file_name); // this removes the temp file
+ } else {
+ __kmp_env_unset(name);
+ }
#else
__kmp_env_unset(name);
#endif
}
#if defined(KMP_USE_SHM)
- KMP_INTERNAL_FREE(shm_name);
+ if (shm_name)
+ KMP_INTERNAL_FREE(shm_name);
+ if (temp_reg_status_file_name)
+ KMP_INTERNAL_FREE(temp_reg_status_file_name);
#endif
KMP_INTERNAL_FREE(__kmp_registration_str);
@@ -6967,6 +7110,11 @@ static void __kmp_do_serial_initialize(void) {
__kmp_validate_locks();
+#if ENABLE_LIBOMPTARGET
+ /* Initialize functions from libomptarget */
+ __kmp_init_omptarget();
+#endif
+
/* Initialize internal memory allocator */
__kmp_init_allocator();
@@ -7192,10 +7340,12 @@ static void __kmp_do_serial_initialize(void) {
__kmp_register_atfork();
#endif
-#if !KMP_DYNAMIC_LIB
+#if !KMP_DYNAMIC_LIB || \
+ ((KMP_COMPILER_ICC || KMP_COMPILER_ICX) && KMP_OS_DARWIN)
{
/* Invoke the exit handler when the program finishes, only for static
- library. For dynamic library, we already have _fini and DllMain. */
+ library and macOS* dynamic. For other dynamic libraries, we already
+ have _fini and DllMain. */
int rc = atexit(__kmp_internal_end_atexit);
if (rc != 0) {
__kmp_fatal(KMP_MSG(FunctionError, "atexit()"), KMP_ERR(rc),
@@ -7222,6 +7372,10 @@ static void __kmp_do_serial_initialize(void) {
__kmp_init_serial = TRUE;
+ if (__kmp_version) {
+ __kmp_print_version_1();
+ }
+
if (__kmp_settings) {
__kmp_env_print();
}
@@ -7275,7 +7429,7 @@ static void __kmp_do_middle_initialize(void) {
#if KMP_AFFINITY_SUPPORTED
// __kmp_affinity_initialize() will try to set __kmp_ncores to the
// number of cores on the machine.
- __kmp_affinity_initialize();
+ __kmp_affinity_initialize(__kmp_affinity);
#endif /* KMP_AFFINITY_SUPPORTED */
@@ -7461,6 +7615,14 @@ void __kmp_hidden_helper_initialize() {
return;
}
+#if KMP_AFFINITY_SUPPORTED
+ // Initialize hidden helper affinity settings.
+ // The above __kmp_parallel_initialize() will initialize
+ // regular affinity (and topology) if not already done.
+ if (!__kmp_hh_affinity.flags.initialized)
+ __kmp_affinity_initialize(__kmp_hh_affinity);
+#endif
+
// Set the count of hidden helper tasks to be executed to zero
KMP_ATOMIC_ST_REL(&__kmp_unexecuted_hidden_helper_tasks, 0);
@@ -7583,7 +7745,7 @@ int __kmp_invoke_task_func(int gtid) {
);
#if OMPT_SUPPORT
*exit_frame_p = NULL;
- this_thr->th.ompt_thread_info.parallel_flags |= ompt_parallel_team;
+ this_thr->th.ompt_thread_info.parallel_flags = ompt_parallel_team;
#endif
#if KMP_STATS_ENABLED
@@ -7681,7 +7843,7 @@ int __kmp_invoke_teams_master(int gtid) {
#endif
__kmp_teams_master(gtid);
#if OMPT_SUPPORT
- this_thr->th.ompt_thread_info.parallel_flags |= ompt_parallel_league;
+ this_thr->th.ompt_thread_info.parallel_flags = ompt_parallel_league;
#endif
__kmp_run_after_invoked_task(gtid, 0, this_thr, team);
return 1;
@@ -7691,7 +7853,6 @@ int __kmp_invoke_teams_master(int gtid) {
encountered by this team. since this should be enclosed in the forkjoin
critical section it should avoid race conditions with asymmetrical nested
parallelism */
-
void __kmp_push_num_threads(ident_t *id, int gtid, int num_threads) {
kmp_info_t *thr = __kmp_threads[gtid];
@@ -7699,6 +7860,39 @@ void __kmp_push_num_threads(ident_t *id, int gtid, int num_threads) {
thr->th.th_set_nproc = num_threads;
}
+void __kmp_push_num_threads_list(ident_t *id, int gtid, kmp_uint32 list_length,
+ int *num_threads_list) {
+ kmp_info_t *thr = __kmp_threads[gtid];
+
+ KMP_DEBUG_ASSERT(list_length > 1);
+
+ if (num_threads_list[0] > 0)
+ thr->th.th_set_nproc = num_threads_list[0];
+ thr->th.th_set_nested_nth =
+ (int *)KMP_INTERNAL_MALLOC(list_length * sizeof(int));
+ for (kmp_uint32 i = 0; i < list_length; ++i)
+ thr->th.th_set_nested_nth[i] = num_threads_list[i];
+ thr->th.th_set_nested_nth_sz = list_length;
+}
+
+void __kmp_set_strict_num_threads(ident_t *loc, int gtid, int sev,
+ const char *msg) {
+ kmp_info_t *thr = __kmp_threads[gtid];
+ thr->th.th_nt_strict = true;
+ thr->th.th_nt_loc = loc;
+ // if sev is unset make fatal
+ if (sev == severity_warning)
+ thr->th.th_nt_sev = sev;
+ else
+ thr->th.th_nt_sev = severity_fatal;
+ // if msg is unset, use an appropriate message
+ if (msg)
+ thr->th.th_nt_msg = msg;
+ else
+ thr->th.th_nt_msg = "Cannot form team with number of threads specified by "
+ "strict num_threads clause.";
+}
+
static void __kmp_push_thread_limit(kmp_info_t *thr, int num_teams,
int num_threads) {
KMP_DEBUG_ASSERT(thr);
@@ -7932,8 +8126,10 @@ void __kmp_internal_join(ident_t *id, int gtid, kmp_team_t *team) {
__kmp_join_barrier(gtid); /* wait for everyone */
#if OMPT_SUPPORT
+ ompt_state_t ompt_state = this_thr->th.ompt_thread_info.state;
if (ompt_enabled.enabled &&
- this_thr->th.ompt_thread_info.state == ompt_state_wait_barrier_implicit) {
+ (ompt_state == ompt_state_wait_barrier_teams ||
+ ompt_state == ompt_state_wait_barrier_implicit_parallel)) {
int ds_tid = this_thr->th.th_info.ds.ds_tid;
ompt_data_t *task_data = OMPT_CUR_TASK_DATA(this_thr);
this_thr->th.ompt_thread_info.state = ompt_state_overhead;
@@ -7944,15 +8140,16 @@ void __kmp_internal_join(ident_t *id, int gtid, kmp_team_t *team) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region)))
codeptr = OMPT_CUR_TEAM_INFO(this_thr)->master_return_address;
+ ompt_sync_region_t sync_kind = ompt_sync_region_barrier_implicit_parallel;
+ if (this_thr->th.ompt_thread_info.parallel_flags & ompt_parallel_league)
+ sync_kind = ompt_sync_region_barrier_teams;
if (ompt_enabled.ompt_callback_sync_region_wait) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait)(
- ompt_sync_region_barrier_implicit, ompt_scope_end, NULL, task_data,
- codeptr);
+ sync_kind, ompt_scope_end, NULL, task_data, codeptr);
}
if (ompt_enabled.ompt_callback_sync_region) {
ompt_callbacks.ompt_callback(ompt_callback_sync_region)(
- ompt_sync_region_barrier_implicit, ompt_scope_end, NULL, task_data,
- codeptr);
+ sync_kind, ompt_scope_end, NULL, task_data, codeptr);
}
#endif
if (!KMP_MASTER_TID(ds_tid) && ompt_enabled.ompt_callback_implicit_task) {
@@ -8155,6 +8352,7 @@ void __kmp_cleanup(void) {
__kmp_nested_nth.nth = NULL;
__kmp_nested_nth.size = 0;
__kmp_nested_nth.used = 0;
+
KMP_INTERNAL_FREE(__kmp_nested_proc_bind.bind_types);
__kmp_nested_proc_bind.bind_types = NULL;
__kmp_nested_proc_bind.size = 0;
@@ -8652,9 +8850,8 @@ void __kmp_aux_display_affinity(int gtid, const char *format) {
}
/* ------------------------------------------------------------------------ */
-
void __kmp_aux_set_blocktime(int arg, kmp_info_t *thread, int tid) {
- int blocktime = arg; /* argument is in milliseconds */
+ int blocktime = arg; /* argument is in microseconds */
#if KMP_USE_MONITOR
int bt_intervals;
#endif
@@ -8730,7 +8927,6 @@ __kmp_determine_reduction_method(
int team_size;
- KMP_DEBUG_ASSERT(loc); // it would be nice to test ( loc != 0 )
KMP_DEBUG_ASSERT(lck); // it would be nice to test ( lck != 0 )
#define FAST_REDUCTION_ATOMIC_METHOD_GENERATED \
@@ -8751,10 +8947,12 @@ __kmp_determine_reduction_method(
int atomic_available = FAST_REDUCTION_ATOMIC_METHOD_GENERATED;
#if KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \
- KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64
+ KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
+ KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_WASM
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
- KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD
+ KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD || \
+ KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
int teamsize_cutoff = 4;
@@ -8778,11 +8976,15 @@ __kmp_determine_reduction_method(
#else
#error "Unknown or unsupported OS"
#endif // KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||
- // KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD
+ // KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD ||
+ // KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
-#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS
+#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS || \
+ KMP_ARCH_WASM || KMP_ARCH_PPC || KMP_ARCH_AARCH64_32
-#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_HURD
+#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
+ KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HURD || KMP_OS_SOLARIS || \
+ KMP_OS_WASI || KMP_OS_AIX
// basic tuning
@@ -8930,7 +9132,8 @@ int __kmp_pause_resource(kmp_pause_status_t level) {
__kmp_soft_pause();
return 0;
}
- } else if (level == kmp_hard_paused) { // requesting hard pause
+ } else if (level == kmp_hard_paused || level == kmp_stop_tool_paused) {
+ // requesting hard pause or stop_tool pause
if (__kmp_pause_status != kmp_not_paused) {
// error message about already being paused
return 1;
@@ -9018,8 +9221,8 @@ void __kmp_add_threads_to_team(kmp_team_t *team, int new_nthreads) {
// to wake it up.
for (int f = 1; f < new_nthreads; ++f) {
KMP_DEBUG_ASSERT(team->t.t_threads[f]);
- KMP_COMPARE_AND_STORE_ACQ32(&(team->t.t_threads[f]->th.th_used_in_team), 0,
- 3);
+ (void)KMP_COMPARE_AND_STORE_ACQ32(
+ &(team->t.t_threads[f]->th.th_used_in_team), 0, 3);
if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) { // Wake up sleeping threads
__kmp_resume_32(team->t.t_threads[f]->th.th_info.ds.ds_gtid,
(kmp_flag_32 *)NULL);
@@ -9181,3 +9384,20 @@ void __kmp_set_nesting_mode_threads() {
if (__kmp_nesting_mode == 1) // turn on nesting for this case only
set__max_active_levels(thread, __kmp_nesting_mode_nlevels);
}
+
+// Empty symbols to export (see exports_so.txt) when feature is disabled
+extern "C" {
+#if !KMP_STATS_ENABLED
+void __kmp_reset_stats() {}
+#endif
+#if !USE_DEBUGGER
+int __kmp_omp_debug_struct_info = FALSE;
+int __kmp_debugging = FALSE;
+#endif
+#if !USE_ITT_BUILD || !USE_ITT_NOTIFY
+void __kmp_itt_fini_ittlib() {}
+void __kmp_itt_init_ittlib() {}
+#endif
+}
+
+// end of file
diff --git a/contrib/libs/cxxsupp/openmp/kmp_safe_c_api.h b/contrib/libs/cxxsupp/openmp/kmp_safe_c_api.h
index 3db1ada37b07..79f4a7f5732a 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_safe_c_api.h
+++ b/contrib/libs/cxxsupp/openmp/kmp_safe_c_api.h
@@ -30,6 +30,7 @@
#define KMP_SSCANF sscanf_s
#define KMP_STRCPY_S strcpy_s
#define KMP_STRNCPY_S strncpy_s
+#define KMP_STRNCAT_S strncat_s
// Use this only when buffer size is unknown
#define KMP_MEMCPY(dst, src, cnt) memcpy_s(dst, cnt, src, cnt)
@@ -55,12 +56,17 @@ template struct kmp_get_rmax_t {
// For now, these macros use the existing API.
+#if KMP_OS_NETBSD
+#define KMP_ALLOCA __builtin_alloca
+#else
#define KMP_ALLOCA alloca
+#endif
#define KMP_MEMCPY_S(dst, bsz, src, cnt) memcpy(dst, src, cnt)
#define KMP_SNPRINTF snprintf
#define KMP_SSCANF sscanf
#define KMP_STRCPY_S(dst, bsz, src) strcpy(dst, src)
#define KMP_STRNCPY_S(dst, bsz, src, cnt) strncpy(dst, src, cnt)
+#define KMP_STRNCAT_S(dst, bsz, src, cnt) strncat(dst, src, cnt)
#define KMP_VSNPRINTF vsnprintf
#define KMP_STRNCPY strncpy
#define KMP_STRLEN strlen
diff --git a/contrib/libs/cxxsupp/openmp/kmp_sched.cpp b/contrib/libs/cxxsupp/openmp/kmp_sched.cpp
index acd75448d296..2e0dfac6eeb3 100644
--- a/contrib/libs/cxxsupp/openmp/kmp_sched.cpp
+++ b/contrib/libs/cxxsupp/openmp/kmp_sched.cpp
@@ -52,6 +52,7 @@ char const *traits_t::spec = "ld";
} else if (i > 0) { \
t = (u - l) / i + 1; \
} else { \
+ KMP_DEBUG_ASSERT(i != 0); \
t = (l - u) / (-i) + 1; \
} \
KMP_COUNT_VALUE(stat, t); \
@@ -61,11 +62,13 @@ char const *traits_t::spec = "ld";
#define KMP_STATS_LOOP_END(stat) /* Nothing */
#endif
+#if USE_ITT_BUILD || defined KMP_DEBUG
static ident_t loc_stub = {0, KMP_IDENT_KMPC, 0, 0, ";unknown;unknown;0;0;;"};
static inline void check_loc(ident_t *&loc) {
if (loc == NULL)
loc = &loc_stub; // may need to report location info to ittnotify
}
+#endif
template
static void __kmp_for_static_init(ident_t *loc, kmp_int32 global_tid,
@@ -83,6 +86,9 @@ static void __kmp_for_static_init(ident_t *loc, kmp_int32 global_tid,
KMP_PUSH_PARTITIONED_TIMER(OMP_loop_static);
KMP_PUSH_PARTITIONED_TIMER(OMP_loop_static_scheduling);
+ // Clear monotonic/nonmonotonic bits (ignore it)
+ schedtype = SCHEDULE_WITHOUT_MODIFIERS(schedtype);
+
typedef typename traits_t