OpenBLAS рдХреЗ рд╕рд╛рде HPL рдХрд╛ GPL рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

рд╢реАрд░реНрд╖ 50, 100, 500 рдПрдЪрдкреАрд╕реА (рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ) рдкрд░рд┐рд╕рд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЪрдкреАрдПрд▓ (рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЗрдирдкреИрдХ) рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

Linpack рдмреЗрдВрдЪрдорд╛рд░реНрдХ (рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдкреИрдХреЗрдЬ) рдПрд▓рдпреВ рдЕрдкрдШрдЯрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SLAEs рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреИрдХреЗрдЬ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рд╕реАрдкреАрдпреВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред

рд╣рд░ рдХреЛрдИ рдЬреЛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рддреНрд╡рд░рдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ GPU рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлрд░реНрдореА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП CUDA рдХрд╛ 2011 рд╕рдВрд╕реНрдХрд░рдг рдСрдирд▓рд╛рдЗрди рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдореИрдВ GPU рдХреЗ рд▓рд┐рдП рдПрдЪрдкреАрдПрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ?
CUDA рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?
рдУрдкрд╛рдВрдкреА рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?
рдУрдкрдирдмреНрд▓рд╕ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?
GPU рдХреЗ рд▓рд┐рдП HPL рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?


рдореЙрдбреНрдпреВрд▓ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░реЗрдВред

$ yum install environment-modules
$ mcedit /etc/modulefailes/test/v1.0
  #%Module1.0
  proc ModulesHelp { } {
    global version
      puts stderr "Modulefile for test v1.0"
      }
      set version v1.0
      module-whatis "Modulefile for test v1.0"
      # Our environment
      setenv MAINDIR /nfs/software/test/v1.0
      prepend-path PATH $env(MAINDIR)/bin
      prepend-path C_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path CPLUS_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path LIBRARY_PATH $env(MAINDIR)/lib64
      prepend-path LD_LIBRARY_PATH $env(MAINDIR)/lib64

рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


рдореЙрдбреНрдпреВрд▓ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддреА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдкрдереЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрде рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреИрдпрд╛рд░ рдХреАред рдЕрдЧрд░ 0 рд╣реИ, рддреЛ рд░рд╛рд╕реНрддрд╛ рд╕рд╣реА рд╣реИред

$ cat check-modulefiles
  #!/bin/sh
  ModulePath=$1
  MainDir=$(cat $ModulePath | grep "setenv MAINDIR" | cut -f7 -d " ")
  ListOfPaths=$(cat $ModulePath | grep path | cut -f7 -d " ")
  #Replace MainDir setenv in modulefile
  ListOfPaths=$(echo $ListOfPaths | sed "s@\$env(MAINDIR)@$MainDir@g")
  for u in $ListOfPaths; do
    ls -la $u 1> /dev/null 2> /dev/null;
    printf "%60s %4d\n" $u $?;
  done
$ chmod +x check-modulefiles
$ ./check-modulefiles /etc/modulefiles/test/v1.0
  /nfs/software/test/v1.0/bin            0
  /nfs/software/test/v1.0/include        0
  /nfs/software/test/v1.0/include        0
  /nfs/software/test/v1.0/lib64          0
  /nfs/software/test/v1.0/lib64          0

рдореЙрдбреНрдпреВрд▓ рдкреНрд░рдмрдВрдзрди рдХрдорд╛рдВрдб


$ module avail
$ module add cuda/v10.1
$ nvcc тАУversion
  Cuda compilation tools, release 10.1, V10.1.168
$ module switch cuda/v10.1 cuda/v9.2
$ nvcc тАУversion
  Cuda compilation tools, release 9.2, V9.2.88
$ module list
$ module rm cuda/v9.2


1. рдЖрдЗрдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВ ред 3-4
рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
ред рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
5. рдореЙрдбреНрдпреВрд▓
6-7 рдмрджрд▓реЗрдВ ред рдЪрд▓реЛ рд╕рдВрд╕реНрдХрд░рдг
8 рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдХрдиреЗрдХреНрдЯреЗрдб рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВред рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рд╕реВрдЪреА рд╕реЗ рдореЙрдбреНрдпреВрд▓
рдХреЛ рд╣рдЯрд╛ рджреЗрдВ

CUDA рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдпрд╣рд╛рдБ Centos 7 рдХреЗ рд▓рд┐рдП CUDA 9.2 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред

$ chmod +x cuda_9.2.run
$ ./cuda_9.2.run
  Do you accept the previously read EULA? accept
  Install the CUDA 9.2 Toolkit? yes
  Enter Toolkit Location: /nfs/software/cuda/v9.2
  Do you want to install a symbolic link at /usr/local/cuda? no
  Install the CUDA 9.2 Samples? no
$ cat /etc/modulefiles/cuda/v9.2
  #%Module1.0
  proc ModulesHelp { } {
    global version
      puts stderr "Modulefile for cuda v9.2"
      }
      set version v9.2
      module-whatis "Modulefile for cuda v9.2"
      # Our environment
      setenv MAINDIR /nfs/software/cuda/v9.2
      prepend-path PATH $env(MAINDIR)/bin
      prepend-path C_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path CPLUS_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path LIBRARY_PATH $env(MAINDIR)/lib64/stubs
      prepend-path LIBRARY_PATH $env(MAINDIR)/lib64
      prepend-path LD_LIBRARY_PATH $env(MAINDIR)/lib64/stubs
      prepend-path LD_LIBRARY_PATH $env(MAINDIR)/lib64
  $ module add cuda/v9.2
  $ nvcc --version
  Cuda compilation tools, release 9.2, V9.2.148

OpenBLAS рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


$ wget https://github.com/xianyi/OpenBLAS/archive/v0.3.6.tar.gz
$ tar -xzvf v0.3.6.tar.gz
$ cd OpenBLAS-0.3.6
$ mkdir -p /nfs/software/openblas/v0.3.6
$ make -j4
$ make PREFIX=/nfs/software/openblas/v0.3.6/ install
$ ls -la /nfs/software/openblas/v0.3.6/lib/
$ cat /etc/modulefiles/openblas/v0.3.6
  #%Module1.0
  proc ModulesHelp { } {
    global version
      puts stderr "Modulefile for openblas v0.3.6"
      }
      set version v0.3.6
      module-whatis "Modulefile for openblas v0.3.6"
      # Our environment
      setenv MAINDIR /nfs/software/openblas/v0.3.6
      prepend-path PATH $env(MAINDIR)/bin
      prepend-path C_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path CPLUS_INCLUDE_PATH $env(MAINDIR)/include
      prepend-path LIBRARY_PATH $env(MAINDIR)/lib
      prepend-path LD_LIBRARY_PATH $env(MAINDIR)/lib
$ ls -la /nfs/software/openblas/v0.3.6/lib

OpenMPI рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


wget https://download.open-mpi.org/release/open-mpi/v2.1/openmpi-2.1.6.tar.gz
$ tar -xzvf openmpi-2.1.6.tar.gz
$ cd openmpi-2.1.6
$ mkdir -p /nfs/software/openmpi/v2.1.6
$ module add cuda/v9.2
$ ./configure --prefix=/nfs/software/openmpi/v2.1.6/ --with-cuda --enable-static
$ make
$ make install
$ cat /etc/modulefiles/openmpi/v2.1.6
#%Module1.0
proc ModulesHelp { } {
  global version
    puts stderr "Modulefile for openmpi v2.1.6"
    }
    set version v2.1.6
    module-whatis "Modulefile for openmpi v2.1.6"
    # Our environment
    setenv MAINDIR /nfs/software/openmpi/v2.1.6
    prepend-path PATH $env(MAINDIR)/bin
    prepend-path C_INCLUDE_PATH $env(MAINDIR)/include
    prepend-path CPLUS_INCLUDE_PATH $env(MAINDIR)/include
    prepend-path LIBRARY_PATH $env(MAINDIR)/lib
    prepend-path LD_LIBRARY_PATH $env(MAINDIR)/lib
$ module add openmpi/v2.1.6
$ mpirun --version
mpirun (Open MPI) 2.1.6

GPU рдХреЗ рд▓рд┐рдП HPL рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдЪрдкреАрдПрд▓ 2.0 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

$ module add openmpi/v2.1.6
$ module add cuda/v9.2
$ module add openblas/v0.3.6
$ wget https://developer.download.nvidia.com/assets/cuda/secure/AcceleratedLinpack/hpl-2.0_FERMI_v15.tgz
$ tar -xvf hpl-2.0_FERMI_v15.tgz
$ mv hpl-2.0_FERMI_v15.tgz hpl-2.0
$ cd hpl-2.0

рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд╣рд▓рд╛ Hpl-2.0 рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ Make.CUDA рд╣реИред рдирд┐рдореНрди рдХреЛрдб рдХреЛ Make.CUDA рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:

$ cat Make.CUDA
  SHELL        = /bin/sh
  CD           = cd
  CP           = cp
  LN_S         = ln -fs
  MKDIR        = mkdir -p
  RM           = /bin/rm -f
  TOUCH        = touch
  ARCH         = CUDA
  
  TOPdir       = /home/user/hpl-2.0
  INCdir       = $(TOPdir)/include
  BINdir       = $(TOPdir)/bin/$(ARCH)
  LIBdir       = $(TOPdir)/lib/$(ARCH)
  HPLlib       = $(LIBdir)/libhpl.a
  
  MPdir        = /nfs/software/openmpi/v2.1.6
  MPinc        = -I$(MPdir)/include
  MPlib        = -L$(MPdir)/lib -lmpi
  
  LAdir        = /nfs/software/openblas/v0.3.6
  LAinc        = -I$(LAdir)/include
  LAlib        = -L$(TOPdir)/src/cuda -ldgemm -L/nfs/software/cuda/v9.2/lib64 -lcuda -lcudart -lcublas -L$(LAdir)/lib -lopenblas
  F2CDEFS      = -DAdd__ -DF77_INTEGER=int -DStringSunStyle
  HPL_INCLUDES = -I$(INCdir) -I$(INCdir)/$(ARCH) $(LAinc) $(MPinc)
  HPL_LIBS     = $(HPLlib) $(LAlib) $(MPlib)
  HPL_OPTS     =  -DCUDA
  HPL_DEFS     = $(F2CDEFS) $(HPL_OPTS) $(HPL_INCLUDES)
  CC           = mpicc
  CCFLAGS      = -fopenmp -lpthread -fomit-frame-pointer -O3 -funroll-loops $(HPL_DEFS)
  CCNOOPT      = $(HPL_DEFS) -O0 -w
  LINKER       = $(CC)
  LINKFLAGS    = $(CCFLAGS)
  ARCHIVER     = ar
  ARFLAGS      = r
  RANLIB       = echo
  MAKE         = make TOPdir=$(TOPdir)

11. hpl-2.0 рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ
рд▓рд┐рдП рдкрде 17ред
OpenMPI 21 рдХреЗ рд▓рд┐рдП рдкрдеред OpenBLAS рдХреЗ рд▓рд┐рдП рдкрде
23ред CUDA lib64 рдХреЗ рд▓рд┐рдП рдкрде

ред hpl-2.0 / src / cuda / cuda_dgemm рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:

$ mcedit src/cuda/cuda_dgemm.c
  тАж
  // handle2 = dlopen ("libmkl_intel_lp64.so", RTLD_LAZY);
  handle2 = dlopen ("libopenblas.so", RTLD_LAZY);
  тАж
  // dgemm_mkl = (void(*)())dlsym(handle, "dgemm");
  dgemm_mkl = (void(*)())dlsym(handle, "dgemm_");
  тАж
  // handle = dlopen ("libmkl_intel_lp64.so", RTLD_LAZY);
  handle = dlopen ("libopenblas.so", RTLD_LAZY);
  тАж
  // mkl_dtrsm = (void(*)())dlsym(handle2, "dtrsm");
  mkl_dtrsm = (void(*)())dlsym(handle2, "dtrsm_");

4x рдЬреАрдкреАрдпреВ рдкрд░ рдПрдЪрдкреАрдПрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:

$ make arch=CUDA
$ cd bin/CUDA
$ export LD_LIBRARY_PATH=/home/user/hpl-2.0/src/cuda/:$LD_LIBRARY_PATH
$ mpirun -np 4 ./xhpl
  ================================================================================
  HPLinpack 2.0  --  High-Performance Linpack benchmark  --   September 10, 2008
  Written by A. Petitet and R. Clint Whaley,  Innovative Computing Laboratory, UTK
  Modified by Piotr Luszczek, Innovative Computing Laboratory, UTK
  Modified by Julien Langou, University of Colorado Denver
  ================================================================================

  An explanation of the input/output parameters follows:
  T/V    : Wall time / encoded variant.
  N      : The order of the coefficient matrix A.
  NB     : The partitioning blocking factor.
  P      : The number of process rows.
  Q      : The number of process columns.
  Time   : Time in seconds to solve the linear system.
  Gflops : Rate of execution for solving the linear system.

  The following parameter values will be used:

  N      :   25000
  NB     :     768
  PMAP   : Row-major process mapping
  P      :       2
  Q      :       2
  PFACT  :    Left
  NBMIN  :       2
  NDIV   :       2
  RFACT  :    Left
  BCAST  :   1ring
  DEPTH  :       1
  SWAP   : Spread-roll (long)
  L1     : no-transposed form
  U      : no-transposed form
  EQUIL  : yes
  ALIGN  : 8 double precision words

  --------------------------------------------------------------------------------

  - The matrix A is randomly generated for each test.
  - The following scaled residual check will be computed:
        ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
  - The relative machine precision (eps) is taken to be               1.110223e-16
  - Computational tests pass if scaled residuals are less than                16.0

  ================================================================================
  T/V                N    NB     P     Q               Time                 Gflops
  --------------------------------------------------------------------------------
  WR10L2L2       25000   768     2     2              16.72              6.232e+02
  --------------------------------------------------------------------------------
  ||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0019019 ...... PASSED
  ================================================================================

  Finished      1 tests with the following results:
                1 tests completed and passed residual checks,
                0 tests completed and failed residual checks,
                0 tests skipped because of illegal input values.
  --------------------------------------------------------------------------------

  End of Tests.
  ================================================================================

рдкрд░реАрдХреНрд╖рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, hpl-2.0 / bin / CUDA / HPL.dat рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

All Articles