LCOV - code coverage report
Current view: top level - src/base - machine_cpuid.c (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 100.0 % 2 2
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 1 1

            Line data    Source code
       1              : /*----------------------------------------------------------------------------*/
       2              : /*  CP2K: A general program to perform molecular dynamics simulations         */
       3              : /*  Copyright 2000-2025 CP2K developers group <https://cp2k.org>              */
       4              : /*                                                                            */
       5              : /*  SPDX-License-Identifier: GPL-2.0-or-later                                 */
       6              : /*----------------------------------------------------------------------------*/
       7              : 
       8              : /* shared between C and Fortran */
       9              : #include "machine_cpuid.h"
      10              : 
      11              : #if defined(__cplusplus)
      12              : extern "C" {
      13              : #endif
      14              : 
      15              : /*******************************************************************************
      16              :  * \brief This routine determines the CPUID according to the given compiler
      17              :  *        flags (expected to be similar to Fortran). Similar to other Fortran
      18              :  *        compilers, "gfortran -E -dM -mavx - < /dev/null | grep AVX" defines a
      19              :  *        variety of predefined macros (also similar to C). However, with a
      20              :  *        Fortran translation unit only a subset of these definitions disappears
      21              :  *        ("gfortran -E -dM -mavx my.F | grep AVX")
      22              :  *        hence an implementation in C is used.
      23              :  ******************************************************************************/
      24              : int m_cpuid_static(void); /* avoid pedantic warning about missing prototype */
      25         5044 : int m_cpuid_static(void) {
      26              : #if (defined(__x86_64__) && 0 != (__x86_64__)) ||                              \
      27              :     (defined(__amd64__) && 0 != (__amd64__)) ||                                \
      28              :     (defined(_M_X64) || defined(_M_AMD64)) ||                                  \
      29              :     (defined(__i386__) && 0 != (__i386__)) || (defined(_M_IX86))
      30              : #if (__AVX512F__ && __AVX512CD__ && __AVX2__ && __FMA__ && __AVX__ &&          \
      31              :      __SSE4_2__ && __SSE4_1__ && __SSE3__)
      32              :   return CP_MACHINE_X86_AVX512;
      33              : #elif (__AVX2__ && __FMA__ && __AVX__ && __SSE4_2__ && __SSE4_1__ && __SSE3__)
      34         5044 :   return CP_MACHINE_X86_AVX2;
      35              : #elif (__AVX__ && __SSE4_2__ && __SSE4_1__ && __SSE3__)
      36              :   return CP_MACHINE_X86_AVX;
      37              : #elif (__SSE4_2__ && __SSE4_1__ && __SSE3__)
      38              :   return CP_MACHINE_X86_SSE4;
      39              : #else
      40              :   return CP_MACHINE_CPU_GENERIC;
      41              : #endif
      42              : #elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)
      43              :   /* only care about SVE, embrace "thermometer approach" like for x86 */
      44              : #if (512 <= __ARM_FEATURE_SVE_BITS)
      45              :   return CP_MACHINE_ARM_SVE512;
      46              : #elif (256 <= __ARM_FEATURE_SVE_BITS)
      47              :   return CP_MACHINE_ARM_SVE256;
      48              : #elif (128 <= __ARM_FEATURE_SVE_BITS)
      49              :   return CP_MACHINE_ARM_SVE128;
      50              : #else
      51              :   return CP_MACHINE_ARM_ARCH64;
      52              : #endif
      53              : #elif defined(__ARM_ARCH)
      54              :   return CP_MACHINE_CPU_GENERIC;
      55              : #else
      56              :   return CP_MACHINE_UNKNOWN;
      57              : #endif
      58              : }
      59              : 
      60              : #if defined(__cplusplus)
      61              : }
      62              : #endif
        

Generated by: LCOV version 2.0-1