18 USE iso_c_binding,
ONLY: c_char, &
23 USE iso_fortran_env,
ONLY: input_unit, &
25 USE omp_lib,
ONLY: omp_get_wtime
31 USE libxs,
ONLY: libxs_timer_tick, libxs_timer_duration, libxs_cpuid, &
32 libxs_target_arch_generic, libxs_x86_sse42, libxs_x86_avx, libxs_x86_avx2, &
33 libxs_x86_avx512, libxs_aarch64, libxs_aarch64_sve128, &
34 libxs_aarch64_sve256, libxs_aarch64_sve512, &
50#include "machine_cpuid.h"
57 INTEGER,
PUBLIC,
PARAMETER :: &
124 INTEGER,
INTENT(IN) :: lunit
144 wt = libxs_timer_duration(0_int_8, libxs_timer_tick())
155 CHARACTER(LEN=default_string_length),
INTENT(OUT) :: model_name
157 INTEGER,
PARAMETER :: bufferlen = 2048
159 CHARACTER(LEN=bufferlen) :: buffer
160 INTEGER :: i, icol, iline, stat
162 model_name =
"UNKNOWN"
164 OPEN (121245, file=
"/proc/cpuinfo", action=
"READ", status=
"OLD", access=
"STREAM", iostat=stat)
167 READ (121245,
END=999) buffer(I:I)
170 i = index(buffer,
"model name")
172 icol = i - 1 + index(buffer(i:),
":")
173 iline = icol - 1 + index(buffer(icol:), new_line(
'A'))
174 IF (iline == icol - 1) iline = bufferlen + 1
175 model_name = buffer(icol + 1:iline - 1)
195 archid = libxs_cpuid(c_null_ptr)
196 IF (libxs_x86_sse42 <= archid .AND. archid < libxs_x86_avx)
THEN
198 ELSE IF (libxs_x86_avx <= archid .AND. archid < libxs_x86_avx2)
THEN
200 ELSE IF (libxs_x86_avx2 <= archid .AND. archid < libxs_x86_avx512)
THEN
202 ELSE IF (libxs_x86_avx512 <= archid .AND. archid <= 1999)
THEN
207 IF (libxs_aarch64 <= archid .AND. archid < libxs_aarch64_sve128)
THEN
209 ELSE IF (libxs_aarch64_sve128 <= archid .AND. archid < libxs_aarch64_sve256)
THEN
211 ELSE IF (libxs_aarch64_sve256 <= archid .AND. archid < libxs_aarch64_sve512)
THEN
213 ELSE IF (libxs_aarch64_sve512 <= archid .AND. archid <= 2999)
THEN
233 INTEGER,
INTENT(IN),
OPTIONAL :: cpuid
238 IF (
PRESENT(cpuid))
THEN
277 INTEGER,
INTENT(IN),
OPTIONAL :: cpuid, typesize
280 INTEGER :: isa, nbytes
282 IF (
PRESENT(typesize))
THEN
288 IF (0 < nbytes .AND. nbytes <= 16)
THEN
289 IF (
PRESENT(cpuid))
THEN
331#if defined(__CRAY_PM_ENERGY)
332 wt = read_energy(
"/sys/cray/pm_counters/energy")
333#elif defined(__CRAY_PM_ACCEL_ENERGY)
334 wt = read_energy(
"/sys/cray/pm_counters/accel_energy")
341#if defined(__CRAY_PM_ACCEL_ENERGY) || defined(__CRAY_PM_ENERGY)
349 FUNCTION read_energy(filename)
RESULT(wt)
350 CHARACTER(LEN=*) :: filename
353 CHARACTER(LEN=80) :: data
355 INTEGER(KIND=int_8) :: raw
357 OPEN (121245, file=filename, action=
"READ", status=
"OLD", access=
"STREAM")
359 READ (121245,
END=999) DATA(I:I)
363 READ (
DATA, *, iostat=iostat) raw
364 IF (iostat /= 0)
THEN
370 END FUNCTION read_energy
381 CHARACTER(len=timestamp_length),
INTENT(OUT) :: timestamp
383 CHARACTER(len=10) :: time
384 CHARACTER(len=8) :: date
386 CALL date_and_time(date=date, time=time)
387 timestamp = date(1:4)//
"-"//date(5:6)//
"-"//date(7:8)//
" "// &
388 time(1:2)//
":"//time(3:4)//
":"//time(5:10)
397 SUBROUTINE abort()
BIND(C, name="abort")
411 INTEGER,
INTENT(IN) :: pid
416 FUNCTION kill(pid, sig)
RESULT(errno)
BIND(C, name="kill")
418 INTEGER(KIND=C_INT),
VALUE :: pid, sig
419 INTEGER(KIND=C_INT) :: errno
427 istat = kill(pid=pid, sig=0)
441 INTEGER(KIND=int_8),
OPTIONAL,
INTENT(OUT) :: mem
442 INTEGER(KIND=int_8) :: mem_local
447#if defined(__NO_STATM_ACCESS)
450 INTEGER(KIND=int_8) :: m1, m2, m3
451 CHARACTER(LEN=80) :: data
456 FUNCTION getpagesize()
BIND(C, name="getpagesize") RESULT(RES)
458 INTEGER(C_INT) :: res
459 END FUNCTION getpagesize
466 OPEN (121245, file=
"/proc/self/statm", action=
"READ", status=
"OLD", access=
"STREAM")
468 READ (121245,
END=999) DATA(I:I)
475 READ (
DATA, *, iostat=iostat) m1, m2, m3
476 IF (iostat /= 0)
THEN
480#if defined(__STATM_TOTAL)
483#if defined(__STATM_RESIDENT)
486 mem_local = mem_local*getpagesize()
491 IF (
PRESENT(mem)) mem = mem_local
509 SUBROUTINE m_memory_details(MemTotal, MemFree, Buffers, Cached, Slab, SReclaimable, MemLikelyFree)
511 INTEGER(kind=int_8),
OPTIONAL :: memtotal, memfree, buffers, cached, slab, sreclaimable, memlikelyfree
513 INTEGER,
PARAMETER :: nbuffer = 10000
514 CHARACTER(LEN=Nbuffer) :: meminfo
527 OPEN (unit=8123, file=
"/proc/meminfo", access=
"STREAM", err=901)
531 IF (i > nbuffer)
EXIT
532 READ (8123,
END=900, ERR=900) meminfo(i:i)
535 meminfo(i:nbuffer) =
""
537 CLOSE (8123, err=902)
539 memtotal = get_field_value_in_bytes(
'MemTotal:')
540 memfree = get_field_value_in_bytes(
'MemFree:')
541 buffers = get_field_value_in_bytes(
'Buffers:')
542 cached = get_field_value_in_bytes(
'Cached:')
543 slab = get_field_value_in_bytes(
'Slab:')
544 sreclaimable = get_field_value_in_bytes(
'SReclaimable:')
546 memlikelyfree = memfree + buffers + cached + sreclaimable
555 INTEGER(int_8) FUNCTION get_field_value_in_bytes(field)
556 CHARACTER(LEN=*) :: field
559 INTEGER(KIND=int_8) :: value
561 get_field_value_in_bytes = 0
562 start = index(meminfo, field)
564 start = start + len_trim(field)
565 IF (start < nbuffer)
THEN
566 READ (meminfo(start:), *, err=999,
END=999) value
568 get_field_value_in_bytes =
value*1024
572 END FUNCTION get_field_value_in_bytes
580 CHARACTER(len=*),
INTENT(OUT) :: hname
582 CHARACTER(len=default_path_length) :: buf
585 FUNCTION gethostname(buf, buflen)
BIND(C, name="gethostname") RESULT(errno)
587 CHARACTER(KIND=C_CHAR),
DIMENSION(*) :: buf
588 INTEGER(KIND=C_INT),
VALUE :: buflen
589 INTEGER(KIND=C_INT) :: errno
590 END FUNCTION gethostname
593 istat = gethostname(buf, len(buf))
595 WRITE (*, *)
"m_hostnm failed"
598 i = index(buf, c_null_char) - 1
607 CHARACTER(len=*),
INTENT(OUT) :: curdir
610 CHARACTER(len=default_path_length),
TARGET :: tmp
613 FUNCTION getcwd(buf, buflen)
BIND(C, name="getcwd") RESULT(stat)
615 CHARACTER(KIND=C_CHAR),
DIMENSION(*) :: buf
616 INTEGER(KIND=C_INT),
VALUE :: buflen
621 stat = getcwd(tmp, len(tmp))
622 IF (.NOT. c_associated(stat))
THEN
623 WRITE (*, *)
"m_getcwd failed"
626 i = index(tmp, c_null_char) - 1
636 CHARACTER(len=*),
INTENT(IN) :: dir
637 INTEGER,
INTENT(OUT) :: ierror
640 FUNCTION chdir(path)
BIND(C, name="chdir") RESULT(errno)
642 CHARACTER(KIND=C_CHAR),
DIMENSION(*) :: path
643 INTEGER(KIND=C_INT) :: errno
647 ierror = chdir(trim(dir)//c_null_char)
655 INTEGER,
INTENT(OUT) :: pid
658 FUNCTION getpid()
BIND(C, name="getpid") RESULT(pid)
660 INTEGER(KIND=C_INT) :: pid
672 FUNCTION m_unlink(path)
RESULT(istat)
674 CHARACTER(LEN=*),
INTENT(IN) :: path
679 FUNCTION unlink(path)
BIND(C, name="unlink") RESULT(errno)
681 CHARACTER(KIND=C_CHAR),
DIMENSION(*) :: path
682 INTEGER(KIND=C_INT) :: errno
686 istat = unlink(trim(path)//c_null_char)
687 END FUNCTION m_unlink
696 CHARACTER(LEN=*),
INTENT(IN) :: source, target
699 LOGICAL :: src_exists
702 FUNCTION rename(src, dest)
BIND(C, name="rename") RESULT(errno)
704 CHARACTER(KIND=C_CHAR),
DIMENSION(*) :: src, dest
705 INTEGER(KIND=C_INT) :: errno
709 IF (
TARGET == source)
THEN
710 WRITE (*, *)
"Warning: m_mov ", trim(
TARGET),
" equals ", trim(source)
715 istat = m_unlink(
TARGET)
719 istat = rename(trim(source)//c_null_char, trim(
TARGET)//c_null_char)
722 INQUIRE (file=source, exist=src_exists)
723 IF (.NOT. src_exists)
RETURN
724 WRITE (*, *)
"Trying to move "//trim(source)//
" to "//trim(
TARGET)//
"."
725 WRITE (*, *)
"rename returned status: ", istat
726 WRITE (*, *)
"Problem moving file"
737 CHARACTER(LEN=*),
INTENT(OUT) :: user
742 CALL get_environment_variable(
"LOGNAME",
value=user, status=istat)
745 CALL get_environment_variable(
"USER",
value=user, status=istat)
748 CALL get_environment_variable(
"USERNAME",
value=user, status=istat)
760 CHARACTER(LEN=*),
INTENT(OUT) :: omp_stacksize
765 CALL get_environment_variable(
"OMP_STACKSIZE",
value=omp_stacksize, status=istat)
767 IF (istat /= 0) omp_stacksize =
"default"
Target architecture or instruction set extension according to compiler target flags.
Trace OpenMP constructs if ennvironment variable CP2K_OMP_TRACE=1.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public machine_x86_avx
logical, save, public flush_should_flush
subroutine, public m_getpid(pid)
...
integer, parameter, public machine_arm_sve512
integer, parameter, public default_output_unit
integer, parameter, public machine_x86_sse4
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
integer, parameter, public machine_cpu_generic
integer, parameter, public default_input_unit
integer, parameter, public timestamp_length
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
integer, parameter, public machine_arm_sve256
integer, parameter, public machine_x86_avx2
subroutine, public m_abort()
Can be used to get a nice core.
subroutine, public m_timestamp(timestamp)
Returns a human readable timestamp.
integer function, public m_procrun(pid)
Returns if a process is running on the local machine 1 if yes and 0 if not.
subroutine, public m_memory_details(memtotal, memfree, buffers, cached, slab, sreclaimable, memlikelyfree)
get more detailed memory info, all units are bytes. the only 'useful' option is MemLikelyFree which i...
pure integer function, public m_cpuid()
Target architecture or instruction set extension according to CPU-check at runtime.
subroutine, public m_getcwd(curdir)
...
integer, parameter, public machine_x86
subroutine, public m_chdir(dir, ierror)
...
pure integer function, public m_cpuid_vlen(cpuid, typesize)
Determine vector-length for a given CPUID.
real(kind=dp) function, public m_energy()
returns the energy used since some time in the past. The precise meaning depends on the infrastructur...
integer, parameter, public machine_arm
subroutine, public m_cpuinfo(model_name)
reads /proc/cpuinfo if it exists (i.e. Linux) to return relevant info
subroutine, public m_mov(source, target)
...
pure character(len=default_string_length) function, public m_cpuid_name(cpuid)
Determine name of target architecture for a given CPUID.
integer, parameter, public machine_x86_avx512
integer, parameter, public machine_arm_arch64
subroutine, public m_omp_get_stacksize(omp_stacksize)
Retrieve environment variable OMP_STACKSIZE.
integer, parameter, public machine_cpu_unknown
integer(kind=int_8), save, public m_memory_max
integer, parameter, public machine_arm_sve128
subroutine, public m_getlog(user)
...
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
subroutine, public m_hostnm(hname)
...