summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--var/spack/repos/builtin/packages/mpich/mpich34_yaksa_hindexed.patch131
-rw-r--r--var/spack/repos/builtin/packages/mpich/package.py14
2 files changed, 144 insertions, 1 deletions
diff --git a/var/spack/repos/builtin/packages/mpich/mpich34_yaksa_hindexed.patch b/var/spack/repos/builtin/packages/mpich/mpich34_yaksa_hindexed.patch
new file mode 100644
index 0000000000..6306eab5d3
--- /dev/null
+++ b/var/spack/repos/builtin/packages/mpich/mpich34_yaksa_hindexed.patch
@@ -0,0 +1,131 @@
+--- a/modules/yaksa/src/frontend/types/yaksa_blkindx.c
++++ b/modules/yaksa/src/frontend/types/yaksa_blkindx.c
+@@ -74,7 +74,7 @@ int yaksi_type_create_hindexed_block(int count, int blocklength, const intptr_t
+ if (intype->is_contig && ((outtype->ub - outtype->lb) == outtype->size)) {
+ outtype->is_contig = true;
+ for (int i = 1; i < count; i++) {
+- if (array_of_displs[i] <= array_of_displs[i - 1]) {
++ if (array_of_displs[i] != array_of_displs[i - 1] + intype->extent * blocklength) {
+ outtype->is_contig = false;
+ break;
+ }
+--- a/modules/yaksa/src/frontend/types/yaksa_indexed.c
++++ b/modules/yaksa/src/frontend/types/yaksa_indexed.c
+@@ -44,8 +44,12 @@ int yaksi_type_create_hindexed(int count, const int *array_of_blocklengths,
+ outtype->alignment = intype->alignment;
+
+ int is_set;
++ intptr_t last_ub;
++ int is_noncontig;
+ is_set = 0;
+- for (int idx = 0; idx < count; idx++) {
++ last_ub = 0;
++ is_noncontig = 0;
++ for (intptr_t idx = 0; idx < count; idx++) {
+ if (array_of_blocklengths[idx] == 0)
+ continue;
+
+@@ -60,6 +64,11 @@ int yaksi_type_create_hindexed(int count, const int *array_of_blocklengths,
+ ub = array_of_displs[idx] + intype->ub;
+ }
+
++ if (idx > 0 && lb != last_ub) {
++ is_noncontig = 1;
++ }
++ last_ub = ub;
++
+ intptr_t true_lb = lb - intype->lb + intype->true_lb;
+ intptr_t true_ub = ub - intype->ub + intype->true_ub;
+
+@@ -90,26 +99,8 @@ int yaksi_type_create_hindexed(int count, const int *array_of_blocklengths,
+ outtype->u.hindexed.child = intype;
+
+ /* detect if the outtype is contiguous */
+- if (intype->is_contig && ((outtype->ub - outtype->lb) == outtype->size)) {
++ if (!is_noncontig && intype->is_contig && (outtype->ub - outtype->lb) == outtype->size) {
+ outtype->is_contig = true;
+-
+- int left = 0;
+- while (array_of_blocklengths[left] == 0)
+- left++;
+- int right = left + 1;
+- while (right < count && array_of_blocklengths[right] == 0)
+- right++;
+- while (right < count) {
+- if (array_of_displs[right] <= array_of_displs[left]) {
+- outtype->is_contig = false;
+- break;
+- } else {
+- left = right;
+- right++;
+- while (right < count && array_of_blocklengths[right] == 0)
+- right++;
+- }
+- }
+ } else {
+ outtype->is_contig = false;
+ }
+--- a/modules/yaksa/src/frontend/types/yaksa_struct.c
++++ b/modules/yaksa/src/frontend/types/yaksa_struct.c
+@@ -42,9 +42,13 @@ int yaksi_type_create_struct(int count, const int *array_of_blocklengths,
+ }
+
+ int is_set;
++ intptr_t last_ub;
++ int is_noncontig;
+ is_set = 0;
++ last_ub = 0;
++ is_noncontig = 0;
+ outtype->alignment = 0;
+- for (int idx = 0; idx < count; idx++) {
++ for (intptr_t idx = 0; idx < count; idx++) {
+ if (array_of_blocklengths[idx] == 0)
+ continue;
+
+@@ -61,6 +65,12 @@ int yaksi_type_create_struct(int count, const int *array_of_blocklengths,
+
+ intptr_t true_lb = lb - array_of_intypes[idx]->lb + array_of_intypes[idx]->true_lb;
+ intptr_t true_ub = ub - array_of_intypes[idx]->ub + array_of_intypes[idx]->true_ub;
++
++ if (idx > 0 && true_lb != last_ub) {
++ is_noncontig = 1;
++ }
++ last_ub = true_ub;
++
+ int tree_depth = array_of_intypes[idx]->tree_depth;
+ if (outtype->alignment < array_of_intypes[idx]->alignment)
+ outtype->alignment = array_of_intypes[idx]->alignment;
+@@ -94,7 +104,7 @@ int yaksi_type_create_struct(int count, const int *array_of_blocklengths,
+ outtype->extent = outtype->ub - outtype->lb;
+
+ /* detect if the outtype is contiguous */
+- if ((outtype->ub - outtype->lb) == outtype->size) {
++ if (!is_noncontig && (outtype->ub - outtype->lb) == outtype->size) {
+ outtype->is_contig = true;
+
+ for (int i = 0; i < count; i++) {
+@@ -103,24 +113,6 @@ int yaksi_type_create_struct(int count, const int *array_of_blocklengths,
+ break;
+ }
+ }
+-
+- int left = 0;
+- while (array_of_blocklengths[left] == 0)
+- left++;
+- int right = left + 1;
+- while (right < count && array_of_blocklengths[right] == 0)
+- right++;
+- while (right < count) {
+- if (array_of_displs[right] <= array_of_displs[left]) {
+- outtype->is_contig = false;
+- break;
+- } else {
+- left = right;
+- right++;
+- while (right < count && array_of_blocklengths[right] == 0)
+- right++;
+- }
+- }
+ } else {
+ outtype->is_contig = false;
+ }
diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py
index 8604903f32..552f313989 100644
--- a/var/spack/repos/builtin/packages/mpich/package.py
+++ b/var/spack/repos/builtin/packages/mpich/package.py
@@ -194,6 +194,18 @@ with '-Wl,-commons,use_dylibs' and without
when="@4.0:4.0.2",
)
+ # Fix checking whether the datatype is contiguous
+ # https://github.com/pmodels/yaksa/pull/189
+ # https://github.com/pmodels/mpich/issues/5391
+ # The problem has been fixed starting version 4.0 by updating the yaksa git submodule, which
+ # has not been done for the 3.4.x branch. The following patch is a backport of the
+ # aforementioned pull request for the unreleased version of yaksa that is vendored with MPICH.
+ # Note that Spack builds MPICH against a non-vendored yaksa only starting version 4.0.
+ with when("@3.4"):
+ # Apply the patch only when yaksa is used:
+ patch("mpich34_yaksa_hindexed.patch", when="datatype-engine=yaksa")
+ patch("mpich34_yaksa_hindexed.patch", when="datatype-engine=auto device=ch4")
+
depends_on("findutils", type="build")
depends_on("pkgconfig", type="build")
@@ -571,7 +583,7 @@ with '-Wl,-commons,use_dylibs' and without
elif "datatype-engine=dataloop" in spec:
config_args.append("--with-datatype-engine=dataloop")
elif "datatype-engine=auto" in spec:
- config_args.append("--with-datatye-engine=auto")
+ config_args.append("--with-datatype-engine=auto")
if "+hcoll" in spec:
config_args.append("--with-hcoll=" + spec["hcoll"].prefix)