Skip to content

[umbrella] exago / hiop: the packaged build cannot produce a working GPU sparse solver #6649

Description

@huojiangming

Consolidates the five reports I filed on 2026-09-22 — #6598, #6599, #6600, #6601, #6602 —
into one, and closes those. They are all one story, and five separate issues was the wrong
way to tell it. (LLNL/hiop asked me to consolidate on their tracker for the same reason,
llnl/hiop#801; this is the same medicine applied here.)

The story: the packaged ExaGO and HiOp cannot give you a working GPU sparse solver, and
nothing says so.

1. spack install exago with no variants has no OPFLOW solver — was #6598

exago/package.py has variant("hiop", default=False) and variant("ipopt", default=False).
With neither, the binary builds and installs, and then has no solver for OPFLOW at all. A
default install that cannot solve the package's main problem is a surprising default; at the
least the recipe could say so.

2. +sparse forces a licensed dependency — was #6599

hiop/package.py:

95:  variant("sparse", default=False, description="Enable/Disable Sparse linear algebra")
198: depends_on("coinhsl+blas", when="+sparse")
236: self.define_from_variant("HIOP_SPARSE", "sparse"),
237: self.define_from_variant("HIOP_USE_COINHSL", "sparse"),

so asking for HiOp's sparse interface pulls in COINHSL, which needs a licence and a manually
fetched tarball. HiOp itself does not require it. We build upstream HiOp develop
(fc0e881) like this, and it works:

HIOP_SPARSE:BOOL=ON
HIOP_USE_COINHSL:BOOL=OFF

with STRUMPACK and ReSolve as the sparse backends. The coupling is in this recipe, not in
HiOp. A separate coinhsl variant would decouple them:

variant("coinhsl", default=False, description="Use the licensed COINHSL solvers (MA57/MA27)")
depends_on("coinhsl+blas", when="+coinhsl")
...
self.define_from_variant("HIOP_USE_COINHSL", "coinhsl"),

I have not sent that as a pull request because it changes what +sparse resolves to for
people who already depend on it, which is your call rather than mine. Say the word and it
is a five-line change.

3. The GPU sparse solver is off by default and cannot be enabled on its own — was #6600

Following from 2: the combination that gives a GPU sparse solve (+sparse with a GPU
backend, no COINHSL) is not expressible through the variants as they stand.

4. E4S has never shipped a HiOp with any sparse backend — was #6601

A consequence of 2 and 3 rather than a separate defect: because +sparse drags in a
licensed package, the distributed builds leave it off.

5. MA27 cannot stand in for MA57 — was #6602

Where a build does have COINHSL, MA27 does not substitute for MA57 in HiOp's safe mode: the
code asks for MA57 specifically (hiopKKTLinSysSparse.cpp), and a build with only MA27
behaves as a build with neither — see llnl/hiop#810 for what that does.


The recipes list @ryandanehy, @cameronrutherford, @pelesh (exago) and @nychiang, @cnpetra,
@pelesh (hiop) as maintainers — one mention rather than five, and no expectation of a quick
answer. If any of this is intended as it stands, say so and I will close this.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions