gnu: watchexec: Update to 1.14.1.
[jackhill/guix/guix.git] / gnu / packages / benchmark.scm
index 42c417b..3470f38 100644 (file)
@@ -1,6 +1,15 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016, 2017 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Dave Love <fx@gnu.org>
+;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2019 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2019 Gábor Boskovits <boskovits@gmail.com>
+;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
+;;; Copyright © 2020 malte Frank Gerdes <malte.f.gerdes@gmail.com>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020 Greg Hogan <code@greghogan.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages mpi)
+  #:use-module (gnu packages perl)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-science)
+  #:use-module (gnu packages python-web)
+  #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages storage)
   #:use-module (ice-9 match))
 
 (define-public fio
   (package
     (name "fio")
-    (version "3.2")
+    (version "3.25")
     (source (origin
               (method url-fetch)
-              (uri (string-append
-                       "http://brick.kernel.dk/snaps/"
-                       "fio-" version ".tar.bz2"))
+              (uri (string-append "https://brick.kernel.dk/snaps/"
+                                  "fio-" version ".tar.bz2"))
               (sha256
                (base32
-                "1f5vina9bxn99drda8dhbxng8ypj4ny72xh6mp8rq955d0f8sq0z"))))
+                "16r734an459cz1ax3jyhxc269i3syzdkll4qbv18wqaxpm5y34v6"))))
     (build-system gnu-build-system)
     (arguments
      '(#:test-target "test"
@@ -66,8 +83,9 @@
              ;; The configure script doesn't understand some of the
              ;; GNU options, so we can't use #:configure-flags.
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "./configure"
-                               (string-append "--prefix=" out))))))
+               (invoke "./configure"
+                       (string-append "--prefix=" out))
+               #t)))
          ;; The main `fio` executable is fairly small and self contained.
          ;; Moving the auxiliary python and gnuplot scripts to a separate
          ;; output saves almost 400 MiB on the closure.
@@ -108,19 +126,31 @@ is to write a job file matching the I/O load one wants to simulate.")
                    license:public-domain))))
 
 ;; Parameterized in anticipation of m(va)pich support
-(define (imb mpi)
+(define (intel-mpi-benchmarks mpi)
   (package
-    (name (string-append "imb-" (package-name mpi)))
-    (version "2017.2")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (match (string-split version #\.)
-             ((major minor)
-              (string-append
-               "https://software.intel.com/sites/default/files/managed/76/6c/IMB_"
-               major "_Update" minor ".tgz"))))
-      (sha256 (base32 "11nczxm686rsppmw9gjc2p2sxc0jniv5kv18yxm1lzp5qfh5rqyb"))))
+    (name (string-append "intel-mpi-benchmarks"
+                         (if (string=? (package-name mpi) "openmpi")
+                             ""
+                             (string-append "-" (package-name mpi)))))
+    (version "2019.6")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/intel/mpi-benchmarks")
+                    (commit (string-append "IMB-v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "02hxbk9g9nl59bk5qcfl3djj7b58vsqys340m1xdbyqwcrbnahh9"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  ;; Some source configuration files in the original tarball
+                  ;; have inappropriate execute permissions, which interferes
+                  ;; with the install phase below.
+                  (for-each (lambda (file) (chmod file #o444))
+                            (find-files "WINDOWS" "."))
+                  #t))))
     (build-system gnu-build-system)
     (inputs
      `(("mpi" ,mpi)))
@@ -129,29 +159,25 @@ is to write a job file matching the I/O load one wants to simulate.")
        (modify-phases %standard-phases
          (delete 'configure)
          (delete 'check)
-         (replace 'build
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((mpi-home (assoc-ref inputs "mpi")))
-               (zero?
-                ;; Not safe for parallel build
-                (system* "make" "-C" "imb/src" "-f" "make_mpich" "SHELL=sh"
-                         (string-append "MPI_HOME=" mpi-home))))))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
+             (define (benchmark? file stat)
+               (and (string-prefix? "IMB-" (basename file))
+                    (executable-file? file)))
+
              (let* ((out (assoc-ref outputs "out"))
-                    (doc (string-append out "/share/doc/" ,name))
                     (bin (string-append out "/bin")))
-               (with-directory-excursion "imb/src"
-                 (for-each
-                  (lambda (file)
-                    (install-file file bin))
-                  '("IMB-IO" "IMB-EXT" "IMB-MPI1" "IMB-NBC" "IMB-RMA")))
-               (mkdir-p doc)
-               (with-directory-excursion "imb"
-                 (copy-recursively "license" doc)))
-             #t)))))
+               (for-each (lambda (file)
+                           (install-file file bin))
+                         (find-files "." benchmark?))
+               #t))))
+
+       ;; The makefile doesn't express all the dependencies, it seems.
+       #:parallel-build? #t
+
+       #:make-flags '("CC=mpicc" "CXX=mpicxx")))
     (home-page "https://software.intel.com/en-us/articles/intel-mpi-benchmarks")
-    (synopsis "Intel MPI Benchmarks")
+    (synopsis "Benchmarks for the Message Passing Interface (MPI)")
     (description
      "This package provides benchmarks for implementations of the @dfn{Message
 Passing Interface} (MPI).  It contains MPI performance measurements for
@@ -167,4 +193,153 @@ Efficiency of the MPI implementation.
 @end itemize")
     (license license:cpl1.0)))
 
-(define-public imb-openmpi (imb openmpi))
+(define-public intel-mpi-benchmarks/openmpi
+  (intel-mpi-benchmarks openmpi))
+
+(define-public imb-openmpi
+  (deprecated-package "imb-openmpi" intel-mpi-benchmarks/openmpi))
+
+(define-public multitime
+  (package
+    (name "multitime")
+    (version "1.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://tratt.net/laurie/src/"
+                                  "multitime/releases/"
+                                  "multitime-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0iyfsdrbyqa7a4ifrh19l9a48hgv7ld6m0d8yf9bkl12q0qw91fx"))))
+    (build-system gnu-build-system)
+    (arguments '(#:tests? #f)) ; there are no tests
+    (home-page "https://tratt.net/laurie/src/multitime/")
+    (synopsis "Time command execution over multiple executions")
+    (description
+     "The @code{time} utility is a simple and often effective way of measuring
+how long a command takes to run (wall time).  Unfortunately, running a command
+once can give misleading timings.  @code{multitime} is, in essence, a simple
+extension to @code{time} which runs a command multiple times and prints the
+timing means, standard deviations, mins, medians, and maxes having done so.
+This can give a much better understanding of the command's performance.")
+    (license license:expat)))
+
+(define-public benchmark
+  (package
+    (name "benchmark")
+    (version "1.5.2")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/google/benchmark")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "13rxagpzw6bal6ajlmrxlh9kgfvcixn6j734b2bvfqz7lch8n0pa"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("googletest-source" ,(package-source googletest))
+       ("googletest" ,googletest)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'unpack-googletest
+           (lambda* (#:key inputs #:allow-other-keys)
+             (copy-recursively (assoc-ref inputs "googletest-source")
+                               "googletest")
+             #t)))))
+    (home-page "https://github.com/google/benchmark")
+    (synopsis "Microbenchmark support library")
+    (description
+     "Benchmark is a library to benchmark code snippets, similar to unit
+tests.")
+    (license license:asl2.0)))
+
+(define-public bonnie++
+  (package
+    (name "bonnie++")
+    (version "1.98")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://www.coker.com.au/bonnie++/bonnie++-"
+                                  version ".tgz"))
+              (sha256
+               (base32
+                "010bmlmi0nrlp3aq7p624sfaj5a65lswnyyxk3cnz1bqig0cn2vf"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("perl" ,perl)))
+    (arguments '(#:tests? #f)) ; there are no tests
+    (home-page "https://doc.coker.com.au/projects/bonnie/")
+    (synopsis "Hard drive and file system benchmark suite")
+    (description
+     "Bonnie++ is a benchmark suite that is aimed at performing a number of
+simple tests of hard drive and file system performance.  Bonnie++ allows you to
+benchmark how your file systems perform with respect to data read and write
+speed, the number of seeks that can be performed per second, and the number of
+file metadata operations that can be performed per second.")
+    (license license:gpl2)))   ;GPL 2 only, see copyright.txt
+
+(define-public python-locust
+  (package
+    (name "python-locust")
+    (version "1.4.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "locust" version))
+       (sha256
+        (base32
+         "1q2nza37fwsqf8qdmisfz6bmjpss90shi1bajrclf6gkbslhryxl"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'extend-PATH
+           ;; Add the 'locust' script to PATH, which is used in the test
+           ;; suite.
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (setenv "PATH" (string-append out "/bin:"
+                                             (getenv "PATH"))))
+             #t))
+         (replace 'check
+           (lambda _
+             (invoke "python" "-m" "pytest"
+                     "-k" (string-join
+                           (list
+                            ;; These tests return "non-zero exit status 1".
+                            "not test_default_headless_spawn_options"
+                            "not test_default_headless_spawn_options_with_shape"
+                            "not test_headless_spawn_options_wo_run_time"
+                            ;; This test depends on networking.
+                            "not test_web_options"
+                            ;; This test fails because of the warning "System open
+                            ;; file limit '1024' is below minimum setting '10000'".
+                            "not test_skip_logging") " and "))
+             #t)))))
+    (propagated-inputs
+     `(("python-configargparse" ,python-configargparse)
+       ("python-flask" ,python-flask)
+       ("python-flask-basicauth" ,python-flask-basicauth)
+       ("python-gevent" ,python-gevent)
+       ("python-geventhttpclient" ,python-geventhttpclient)
+       ("python-msgpack" ,python-msgpack)
+       ("python-psutil" ,python-psutil)
+       ("python-pyzmq" ,python-pyzmq)
+       ("python-requests" ,python-requests)
+       ("python-werkzeug" ,python-werkzeug)))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-pyquery" ,python-pyquery)
+       ("python-pytest" ,python-pytest))) ;for more easily skipping tests
+    (home-page "https://locust.io/")
+    (synopsis "Distributed load testing framework")
+    (description "Locust is a performance testing tool that aims to be easy to
+use, scriptable and scalable.  The test scenarios are described in plain
+Python.  It provides a web-based user interface to visualize the results in
+real-time, but can also be run non-interactively.  Locust is primarily geared
+toward testing HTTP-based applications or services, but it can be customized to
+test any system or protocol.")
+    (license license:expat)))