Skip to content

Commit

Permalink
Identify and arbitrate based on the ARM CPU version
Browse files Browse the repository at this point in the history
  • Loading branch information
amarathe84 authored and slabasan committed Feb 8, 2023
1 parent f7e851a commit 4b59510
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 46 deletions.
25 changes: 0 additions & 25 deletions src/variorum/ARM/ARM.h

This file was deleted.

16 changes: 8 additions & 8 deletions src/variorum/ARM/ARM.c → src/variorum/ARM/ARM_Juno_r2.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
#include <sys/types.h>
#include <sys/stat.h>

#include <ARM.h>
#include <ARM_Juno_r2.h>
#include <config_architecture.h>
#include <variorum_error.h>
#include <power_features.h>

int arm_get_power(int long_ver)
int arm_juno_r2_get_power(int long_ver)
{
int ret = 0;

Expand All @@ -30,7 +30,7 @@ int arm_get_power(int long_ver)
return ret;
}

int arm_get_thermals(int long_ver)
int arm_juno_r2_get_thermals(int long_ver)
{
int ret = 0;

Expand All @@ -45,7 +45,7 @@ int arm_get_thermals(int long_ver)
return ret;
}

int arm_get_clocks(int long_ver)
int arm_juno_r2_get_clocks(int long_ver)
{
int ret = 0;
unsigned iter = 0;
Expand All @@ -66,7 +66,7 @@ int arm_get_clocks(int long_ver)
return ret;
}

int arm_get_frequencies(void)
int arm_juno_r2_get_frequencies(void)
{
int ret = 0;
unsigned iter = 0;
Expand All @@ -87,7 +87,7 @@ int arm_get_frequencies(void)
return ret;
}

int arm_cap_socket_frequency(int cpuid, int freq)
int arm_juno_r2_cap_socket_frequency(int cpuid, int freq)
{
int ret = 0;
unsigned nsockets;
Expand All @@ -109,7 +109,7 @@ int arm_cap_socket_frequency(int cpuid, int freq)
return ret;
}

int arm_get_power_json(char **get_power_obj_str)
int arm_juno_r2_get_power_json(char **get_power_obj_str)
{
int ret = 0;

Expand All @@ -129,7 +129,7 @@ int arm_get_power_json(char **get_power_obj_str)
return ret;
}

int arm_get_power_domain_info_json(char **get_domain_obj_str)
int arm_juno_r2_get_power_domain_info_json(char **get_domain_obj_str)
{
int ret = 0;

Expand Down
25 changes: 25 additions & 0 deletions src/variorum/ARM/ARM_Juno_r2.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other
// Variorum Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: MIT

#ifndef ARM_JUNO_R2_H_INCLUDE
#define ARM_JUNO_R2_H_INCLUDE

#include <jansson.h>

int arm_juno_r2_get_power(int long_ver);

int arm_juno_r2_get_thermals(int long_ver);

int arm_juno_r2_get_clocks(int long_ver);

int arm_juno_r2_get_frequencies(void);

int arm_juno_r2_cap_socket_frequency(int cpuid, int freq);

int arm_juno_r2_get_power_json(char **get_power_obj_str);

int arm_juno_r2_get_power_domain_info_json(char **get_domain_obj_str);

#endif
150 changes: 150 additions & 0 deletions src/variorum/ARM/ARM_Neoverse_N1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other
// Variorum Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: MIT

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <ARM_Neoverse_N1.h>
#include <config_architecture.h>
#include <variorum_error.h>
#include <power_features.h>

int arm_neoverse_n1_get_power(int long_ver)
{
int ret = 0;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

ret = get_power_data(long_ver, stdout);

return ret;
}

int arm_neoverse_n1_get_thermals(int long_ver)
{
int ret = 0;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

ret = get_thermal_data(long_ver, stdout);

return ret;
}

int arm_neoverse_n1_get_clocks(int long_ver)
{
int ret = 0;
unsigned iter = 0;
unsigned nsockets;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX);
for (iter = 0; iter < nsockets; iter++)
{
ret = get_clocks_data(iter, long_ver, stdout);
}

return ret;
}

int arm_neoverse_n1_get_frequencies(void)
{
int ret = 0;
unsigned iter = 0;
unsigned nsockets;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX);
for (iter = 0; iter < nsockets; iter++)
{
ret = get_frequencies(iter, stdout);
}

return ret;
}

int arm_neoverse_n1_cap_socket_frequency(int cpuid, int freq)
{
int ret = 0;
unsigned nsockets;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX);
if (cpuid < 0 || cpuid >= (int)nsockets)
{
fprintf(stdout, "The specified CPU ID does not exist\n");
return -1;
}
ret = cap_socket_frequency(cpuid, freq);

return ret;
}

int arm_neoverse_n1_get_power_json(char **get_power_obj_str)
{
int ret = 0;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

json_t *get_power_obj = json_object();

ret = json_get_power_data(get_power_obj);

*get_power_obj_str = json_dumps(get_power_obj, 0);
json_decref(get_power_obj);

return ret;
}

int arm_neoverse_n1_get_power_domain_info_json(char **get_domain_obj_str)
{
int ret = 0;

char *val = getenv("VARIORUM_LOG");
if (val != NULL && atoi(val) == 1)
{
printf("Running %s\n", __FUNCTION__);
}

json_t *get_domain_obj = json_object();

ret = json_get_power_domain_info(get_domain_obj);

*get_domain_obj_str = json_dumps(get_domain_obj, 0);
json_decref(get_domain_obj);

return ret;
}
25 changes: 25 additions & 0 deletions src/variorum/ARM/ARM_Neoverse_N1.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other
// Variorum Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: MIT

#ifndef ARM_NEOVERSE_N1_H_INCLUDE
#define ARM_NEOVERSE_N1_H_INCLUDE

#include <jansson.h>

int arm_neoverse_n1_get_power(int long_ver);

int arm_neoverse_n1_get_thermals(int long_ver);

int arm_neoverse_n1_get_clocks(int long_ver);

int arm_neoverse_n1_get_frequencies(void);

int arm_neoverse_n1_cap_socket_frequency(int cpuid, int freq);

int arm_neoverse_n1_get_power_json(char **get_power_obj_str);

int arm_neoverse_n1_get_power_domain_info_json(char **get_domain_obj_str);

#endif
6 changes: 4 additions & 2 deletions src/variorum/ARM/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
# SPDX-License-Identifier: MIT

set(variorum_arm_headers
${CMAKE_CURRENT_SOURCE_DIR}/ARM.h
${CMAKE_CURRENT_SOURCE_DIR}/ARM_Juno_r2.h
${CMAKE_CURRENT_SOURCE_DIR}/ARM_Neoverse_N1.h
${CMAKE_CURRENT_SOURCE_DIR}/power_features.h
CACHE INTERNAL "")

set(variorum_arm_sources
${CMAKE_CURRENT_SOURCE_DIR}/ARM.c
${CMAKE_CURRENT_SOURCE_DIR}/ARM_Juno_r2.c
${CMAKE_CURRENT_SOURCE_DIR}/ARM_Neoverse_N1.c
${CMAKE_CURRENT_SOURCE_DIR}/power_features.c
CACHE INTERNAL "")

Expand Down
37 changes: 27 additions & 10 deletions src/variorum/ARM/config_arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,50 @@
#include <config_arm.h>
#include <config_architecture.h>
#include <power_features.h>
#include <ARM.h>
#include <ARM_Juno_r2.h>
#include <ARM_Neoverse_N1.h>
#include <variorum_error.h>

uint64_t *detect_arm_arch(void)
{
// ARM systems come in various flavors. For now, we will use a default model number.
uint64_t *model = (uint64_t *) malloc(sizeof(uint64_t));
*model = ARMV8;
asm volatile(
"mrs %0, MIDR_EL1"
: "=r" (*model));
return model;
}

int set_arm_func_ptrs(int idx)
{
int err = 0;

if (*g_platform[idx].arch_id == ARMV8)
if (*g_platform[idx].arch_id == ARM_JUNO_R2)
{
/* Initialize interfaces */
g_platform[idx].variorum_print_power = arm_get_power;
g_platform[idx].variorum_print_thermals = arm_get_thermals;
g_platform[idx].variorum_print_frequency = arm_get_clocks;
g_platform[idx].variorum_print_available_frequencies = arm_get_frequencies;
g_platform[idx].variorum_print_power = arm_juno_r2_get_power;
g_platform[idx].variorum_print_thermals = arm_juno_r2_get_thermals;
g_platform[idx].variorum_print_frequency = arm_juno_r2_get_clocks;
g_platform[idx].variorum_print_available_frequencies = arm_juno_r2_get_frequencies;
g_platform[idx].variorum_cap_socket_frequency_limit =
arm_cap_socket_frequency;
g_platform[idx].variorum_get_node_power_json = arm_get_power_json;
arm_juno_r2_cap_socket_frequency;
g_platform[idx].variorum_get_node_power_json = arm_juno_r2_get_power_json;
g_platform[idx].variorum_get_node_power_domain_info_json =
arm_get_power_domain_info_json;
arm_juno_r2_get_power_domain_info_json;
}
else if (*g_platform[idx].arch_id == ARM_NEOVERSE_N1)
{
/* Initialize interfaces */
g_platform[idx].variorum_print_power = arm_neoverse_n1_get_power;
g_platform[idx].variorum_print_thermals = arm_neoverse_n1_get_thermals;
g_platform[idx].variorum_print_frequency = arm_neoverse_n1_get_clocks;
g_platform[idx].variorum_print_available_frequencies = arm_neoverse_n1_get_frequencies;
g_platform[idx].variorum_cap_socket_frequency_limit =
arm_neoverse_n1_cap_socket_frequency;
g_platform[idx].variorum_get_node_power_json = arm_neoverse_n1_get_power_json;
g_platform[idx].variorum_get_node_power_domain_info_json =
arm_neoverse_n1_get_power_domain_info_json;

}
else
{
Expand Down
3 changes: 2 additions & 1 deletion src/variorum/config_architecture.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ enum nvidia_gpu_arch_e

enum arm_arch_e
{
ARMV8 = 1, //ARM Juno
ARM_JUNO_R2 = 0x410fd080, //ARM Juno r2
ARM_NEOVERSE_N1 = 0x413fd0c1, //ARM Neoverse N1
};

/// @brief List of AMD GPU family and models.
Expand Down

0 comments on commit 4b59510

Please sign in to comment.