103 lines
4.0 KiB
Python
103 lines
4.0 KiB
Python
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
import os
|
|
import platform
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Hpcg(AutotoolsPackage):
|
|
"""HPCG is a software package that performs a fixed number of multigrid
|
|
preconditioned (using a symmetric Gauss-Seidel smoother) conjugate gradient
|
|
(PCG) iterations using double precision (64 bit) floating point values."""
|
|
|
|
homepage = "https://www.hpcg-benchmark.org"
|
|
url = "https://www.hpcg-benchmark.org/downloads/hpcg-3.1.tar.gz"
|
|
git = "https://github.com/hpcg-benchmark/hpcg.git"
|
|
|
|
version("develop", branch="master")
|
|
version("3.1", sha256="33a434e716b79e59e745f77ff72639c32623e7f928eeb7977655ffcaade0f4a4")
|
|
|
|
variant("openmp", default=True, description="Enable OpenMP support")
|
|
|
|
patch(
|
|
"https://github.com/hpcg-benchmark/hpcg/commit/e9e0b7e6cae23e1f30dd983c2ce2d3bd34d56f75.patch?full_index=1",
|
|
sha256="722c13837b287e979442f8372274aa5910a290aa39f1ed1ff646116be08dcae9",
|
|
when="%gcc@9:",
|
|
)
|
|
patch(
|
|
"https://github.com/hpcg-benchmark/hpcg/commit/e9e0b7e6cae23e1f30dd983c2ce2d3bd34d56f75.patch?full_index=1",
|
|
sha256="722c13837b287e979442f8372274aa5910a290aa39f1ed1ff646116be08dcae9",
|
|
when="%aocc",
|
|
)
|
|
patch(
|
|
"https://github.com/hpcg-benchmark/hpcg/commit/e9e0b7e6cae23e1f30dd983c2ce2d3bd34d56f75.patch?full_index=1",
|
|
sha256="722c13837b287e979442f8372274aa5910a290aa39f1ed1ff646116be08dcae9",
|
|
when="%arm",
|
|
)
|
|
|
|
depends_on("mpi@1.1:")
|
|
|
|
arch = "{0}-{1}".format(platform.system(), platform.processor())
|
|
build_targets = ["arch={0}".format(arch)]
|
|
|
|
def configure(self, spec, prefix):
|
|
CXXFLAGS = "-O3 -ffast-math -ftree-vectorize "
|
|
if (
|
|
not spec.satisfies("%aocc")
|
|
and not spec.satisfies("%cce")
|
|
and not spec.satisfies("%arm")
|
|
):
|
|
CXXFLAGS += " -ftree-vectorizer-verbose=0 "
|
|
if spec.satisfies("%cce"):
|
|
CXXFLAGS += " -Rpass=loop-vectorize"
|
|
CXXFLAGS += " -Rpass-missed=loop-vectorize"
|
|
CXXFLAGS += " -Rpass-analysis=loop-vectorize "
|
|
if "+openmp" in self.spec:
|
|
CXXFLAGS += self.compiler.openmp_flag
|
|
config = [
|
|
# Shell
|
|
"SHELL = /bin/sh",
|
|
"CD = cd",
|
|
"CP = cp",
|
|
"LN_S = ln -fs",
|
|
"MKDIR = mkdir -p",
|
|
"RM = /bin/rm -f",
|
|
"TOUCH = touch",
|
|
# Platform identifier
|
|
"ARCH = {0}".format(self.arch),
|
|
# HPCG Directory Structure / HPCG library
|
|
"TOPdir = {0}".format(os.getcwd()),
|
|
"SRCdir = $(TOPdir)/src",
|
|
"INCdir = $(TOPdir)/src",
|
|
"BINdir = $(TOPdir)/bin",
|
|
# Message Passing library (MPI)
|
|
"MPinc = -I{0}".format(spec["mpi"].prefix.include),
|
|
"MPlib = -L{0}".format(spec["mpi"].prefix.lib),
|
|
# HPCG includes / libraries / specifics
|
|
"HPCG_INCLUDES = -I$(INCdir) -I$(INCdir)/$(arch) $(MPinc)",
|
|
"HPCG_LIBS =",
|
|
"HPCG_OPTS =",
|
|
"HPCG_DEFS = $(HPCG_OPTS) $(HPCG_INCLUDES)",
|
|
# Compilers / linkers - Optimization flags
|
|
"CXX = {0}".format(spec["mpi"].mpicxx),
|
|
"CXXFLAGS = $(HPCG_DEFS) {0}".format(CXXFLAGS),
|
|
"LINKER = $(CXX)",
|
|
"LINKFLAGS = $(CXXFLAGS)",
|
|
"ARCHIVER = ar",
|
|
"ARFLAGS = r",
|
|
"RANLIB = echo",
|
|
]
|
|
|
|
# Write configuration options to include file
|
|
with open("setup/Make.{0}".format(self.arch), "w") as makefile:
|
|
for var in config:
|
|
makefile.write("{0}\n".format(var))
|
|
|
|
def install(self, spec, prefix):
|
|
# Manual installation
|
|
install_tree("bin", prefix.bin)
|