From ddeab9879e434589588f9d12291a4d79d0ee0349 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 7 Feb 2025 19:40:07 +0100 Subject: [PATCH] Improve stability of DAG when using multiple compilers for the same language --- lib/spack/spack/solver/concretize.lp | 17 ++++++++++++++++- .../packages/intel-oneapi-compilers/package.py | 3 +-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 7e9052af779..3ee427c35c7 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -1246,6 +1246,10 @@ error(100, "Cannot propagate the variant '{0}' from the package: {1} because pac % 1. The same flag type is not set on this node % 2. This node has the same compilers as the propagation source +compiler_penalty(PackageNode, C-1) :- + C = #count { CompilerNode : node_compiler(PackageNode, CompilerNode) }, + node_compiler(PackageNode, _). + node_compiler(node(X, Package), node(Y, Compiler)) :- attr("virtual_on_edge", node(X, Package), node(Y, Compiler), Language), attr("version", node(Y, Compiler), Version), @@ -1683,7 +1687,7 @@ opt_criterion(50, "number of non-default variants (non-roots)"). build_priority(PackageNode, Priority) }. -% Minimize the weights of the providers, i.e. use as much as +% Minimize the ids of the providers, i.e. use as much as % possible the first providers opt_criterion(48, "number of duplicate virtuals needed"). #minimize{ 0@248: #true }. @@ -1694,6 +1698,16 @@ opt_criterion(48, "number of duplicate virtuals needed"). build_priority(ProviderNode, Priority) }. +% Minimize the number of compilers used on nodes +opt_criterion(49, "minimize the number of compilers used on the same node"). +#minimize{ 0@249: #true }. +#minimize{ 0@49: #true }. +#minimize{ + Penalty@49+Priority,PackageNode + : compiler_penalty(PackageNode, Penalty), + build_priority(PackageNode, Priority) +}. + % Minimize the weights of the providers, i.e. use as much as % possible the most preferred providers opt_criterion(45, "preferred providers (non-roots)"). @@ -1792,6 +1806,7 @@ opt_criterion(1, "edge wiring"). depends_on(ParentNode, PackageNode) }. + #minimize{ 0@201: #true }. #minimize{ 0@1: #true }. #minimize{ diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py index 5fb644e5c8b..7b0cf15214d 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -356,8 +356,7 @@ class IntelOneapiCompilers(IntelOneApiPackage, CompilerPackage): stdcxx_libs = ("-cxxlib",) - provides("c") - provides("cxx") + provides("c", "cxx") provides("fortran") def _standard_flag(self, *, language, standard):