blob: be5f52ca960f567b483a1e78e6bb044ac79e3ef2 [file] [log] [blame]
Javi Merino034e7cc2015-04-22 18:39:21 +01001# $Copyright:
2# ----------------------------------------------------------------
3# This confidential and proprietary software may be used only as
4# authorised by a licensing agreement from ARM Limited
5# (C) COPYRIGHT 2015 ARM Limited
6# ALL RIGHTS RESERVED
7# The entire notice above must be reproduced on all authorised
8# copies and copies may only be made to the extent permitted
9# by a licensing agreement from ARM Limited.
10# ----------------------------------------------------------------
Javi Merino2cfd1e82015-04-21 17:22:28 +010011# File: test_cpu_power.py
Javi Merino034e7cc2015-04-22 18:39:21 +010012# ----------------------------------------------------------------
13# $
14#
Javi Merinoe4c1d452014-04-01 17:00:47 +010015
Javi Merino86f3bb92014-08-11 17:07:35 +010016import matplotlib
Javi Merinofff33672014-06-18 16:56:34 +010017import pandas as pd
18
Javi Merino076277d2014-07-02 18:48:18 +010019from test_thermal import BaseTestThermal
Javi Merino9d6dabd2014-08-14 15:32:36 +010020import cr2
Javi Merino2cfd1e82015-04-21 17:22:28 +010021import cpu_power
Javi Merinoe4c1d452014-04-01 17:00:47 +010022
Javi Merino2cfd1e82015-04-21 17:22:28 +010023class TestCpuPower(BaseTestThermal):
Javi Merino34f9da12014-06-19 15:48:16 +010024 def __init__(self, *args, **kwargs):
Javi Merino2cfd1e82015-04-21 17:22:28 +010025 super(TestCpuPower, self).__init__(*args, **kwargs)
Javi Merinod721b272015-04-20 15:37:53 +010026 self.map_label = {"00000000,00000039": "A53", "00000000,00000006": "A57"}
Javi Merino34f9da12014-06-19 15:48:16 +010027
Javi Merinofff33672014-06-18 16:56:34 +010028 def test_pivot_with_labels(self):
29 """Test pivot_with_labels()"""
Javi Merinoc68e3792014-07-02 18:14:33 +010030 map_label = {"000000f0": "A15", "0000000f": "A7"}
Javi Merinofff33672014-06-18 16:56:34 +010031 dfr_in = pd.DataFrame({'cpus': ["000000f0", "0000000f", "000000f0", "0000000f"],
32 'freq': [1, 3, 2, 6]})
Javi Merinofff33672014-06-18 16:56:34 +010033
Javi Merino2cfd1e82015-04-21 17:22:28 +010034 dfr_out = cpu_power.pivot_with_labels(dfr_in, "freq", "cpus", map_label)
Javi Merinofff33672014-06-18 16:56:34 +010035
36 self.assertEquals(dfr_out["A15"].iloc[0], 1)
37 self.assertEquals(dfr_out["A15"].iloc[1], 1)
38 self.assertEquals(dfr_out["A15"].iloc[2], 2)
39 self.assertEquals(dfr_out["A7"].iloc[1], 3)
40
Javi Merino221d44a2015-06-17 17:53:34 +010041 def test_num_cpus_in_mask(self):
42 """num_cpus_in_mask() works with the masks we usually use"""
43 mask = "000000f0"
44 self.assertEquals(cpu_power.num_cpus_in_mask(mask), 4)
45
46 mask = sorted(self.map_label)[0]
47 self.assertEquals(cpu_power.num_cpus_in_mask(mask), 2)
48
49 mask = sorted(self.map_label)[1]
50 self.assertEquals(cpu_power.num_cpus_in_mask(mask), 4)
51
Javi Merino2cfd1e82015-04-21 17:22:28 +010052 def test_cpuoutpower_dataframe(self):
53 """Test that CpuOutPower() creates a proper data_frame"""
54 outp = cr2.Run().cpu_out_power
Javi Merinoe4c1d452014-04-01 17:00:47 +010055
Javi Merinod721b272015-04-20 15:37:53 +010056 self.assertEquals(outp.data_frame["power"].iloc[0], 1344)
Javi Merino92f4d012014-08-08 17:55:32 +010057 self.assertTrue("cdev_state" in outp.data_frame.columns)
Javi Merino62c56dc2014-05-07 17:41:12 +010058
Javi Merino2cfd1e82015-04-21 17:22:28 +010059 def test_cpuoutpower_get_all_freqs(self):
60 """Test CpuOutPower.get_all_freqs()"""
61 dfr = cr2.Run().cpu_out_power.get_all_freqs(self.map_label)
Javi Merino73234c12014-06-18 17:27:16 +010062
Javi Merinod721b272015-04-20 15:37:53 +010063 self.assertEquals(dfr["A57"].iloc[0], 1100)
64 self.assertEquals(dfr["A53"].iloc[1], 850)
Javi Merino73234c12014-06-18 17:27:16 +010065
Javi Merino2cfd1e82015-04-21 17:22:28 +010066 def test_cpuinpower_get_dataframe(self):
67 """Test that CpuInPower() creates a proper data_frame()"""
68 inp = cr2.Run().cpu_in_power
Javi Merino62c56dc2014-05-07 17:41:12 +010069
Javi Merino92f4d012014-08-08 17:55:32 +010070 self.assertTrue("load0" in inp.data_frame.columns)
Javi Merinod721b272015-04-20 15:37:53 +010071 self.assertEquals(inp.data_frame["load0"].iloc[0], 24)
Javi Merino8a79fb32014-05-07 17:56:23 +010072
Javi Merino2cfd1e82015-04-21 17:22:28 +010073 def test_cpuinpower_big_cpumask(self):
74 """CpuInPower()'s data_frame is not confused by 64-bit cpumasks"""
Javi Merino66492492015-01-12 15:43:43 +000075 in_data = """ kworker/2:2-679 [002] 676.256284: thermal_power_cpu_get: cpus=00000000,0000000f freq=261888 cdev_state=5 power=12
76 kworker/2:2-679 [002] 676.276200: thermal_power_cpu_get: cpus=00000000,00000030 freq=261888 cdev_state=5 power=0
77 kworker/2:2-679 [002] 676.416202: thermal_power_cpu_get: cpus=00000000,0000000f freq=261888 cdev_state=5 power=0
Javi Merino35c1ac72014-07-04 10:29:04 +010078 """
79 with open("trace.txt", "w") as fout:
80 fout.write(in_data)
81
Javi Merino2cfd1e82015-04-21 17:22:28 +010082 inp = cr2.Run(normalize_time=False).cpu_in_power
Javi Merino92f4d012014-08-08 17:55:32 +010083 self.assertEquals(round(inp.data_frame.index[0], 6), 676.256284)
Javi Merinod6284da2014-08-14 12:12:13 +010084 self.assertEquals(inp.data_frame["cpus"].iloc[1], "00000000,00000030")
Javi Merino35c1ac72014-07-04 10:29:04 +010085
Javi Merino2cfd1e82015-04-21 17:22:28 +010086 def test_cpuinpower_data_frame_asymmetric_clusters(self):
87 """Test that CpuInPower()'s data_frame can handle asymmetric clusters
Javi Merino9ce2fb62014-07-04 20:02:13 +010088
89 That is 2 cpus in one cluster and 4 in another, like Juno
90 """
Javi Merino978ebfb2015-02-17 15:30:38 +000091 in_data = """
92 kworker/2:2-679 [002] 676.256261: thermal_power_cpu_get: cpus=00000000,00000030 freq=1900000 raw_cpu_power=1259 load={74 49} power=451
93 kworker/2:2-679 [002] 676.256271: thermal_power_cpu_get: cpus=00000000,0000000f freq=450000 raw_cpu_power=36 load={1 2 1 3} power=9
Javi Merino9ce2fb62014-07-04 20:02:13 +010094"""
95
96 with open("trace.txt", "w") as fout:
97 fout.write(in_data)
98
Javi Merino2cfd1e82015-04-21 17:22:28 +010099 inp = cr2.Run(normalize_time=False).cpu_in_power
Javi Merino9ce2fb62014-07-04 20:02:13 +0100100
Javi Merino978ebfb2015-02-17 15:30:38 +0000101 self.assertEquals(inp.data_frame["load0"].iloc[0], 74)
102 self.assertEquals(inp.data_frame["load1"].iloc[0], 49)
103 self.assertEquals(inp.data_frame["load2"].iloc[0], 0)
104 self.assertEquals(inp.data_frame["load3"].iloc[0], 0)
105 self.assertEquals(inp.data_frame["load0"].iloc[1], 1)
106 self.assertEquals(inp.data_frame["load1"].iloc[1], 2)
107 self.assertEquals(inp.data_frame["load2"].iloc[1], 1)
108 self.assertEquals(inp.data_frame["load3"].iloc[1], 3)
Javi Merino35c1ac72014-07-04 10:29:04 +0100109
Javi Merino2cfd1e82015-04-21 17:22:28 +0100110 def test_cpuinpower_get_all_freqs(self):
111 """Test CpuInPower.get_all_freqs()"""
112 dfr = cr2.Run().cpu_in_power.get_all_freqs(self.map_label)
Javi Merino73234c12014-06-18 17:27:16 +0100113
Javi Merinod721b272015-04-20 15:37:53 +0100114 self.assertEquals(dfr["A57"].iloc[0], 1100)
115 self.assertEquals(dfr["A53"].iloc[1], 850)
116 self.assertEquals(dfr["A57"].iloc[5], 1100)
Javi Merino73234c12014-06-18 17:27:16 +0100117
Javi Merino2cfd1e82015-04-21 17:22:28 +0100118 def test_cpuinpower_get_load_data(self):
119 """Test CpuInPower.get_load_data()"""
Javi Merino7ad9ce02015-06-16 16:34:10 +0100120 run = cr2.Run()
121 first_load = run.cpu_in_power.data_frame["load0"].iloc[0]
122 load_data = run.cpu_in_power.get_load_data(self.map_label)
Javi Merino9237a3c2014-06-18 12:18:51 +0100123
Javi Merinod721b272015-04-20 15:37:53 +0100124 self.assertEquals(load_data["A57"].iloc[0], 24 + 19)
125 self.assertEquals(load_data["A53"].iloc[3], 32 + 28 + 46 + 44)
126 self.assertEquals(load_data["A57"].iloc[0], load_data["A57"].iloc[1])
Javi Merino7ad9ce02015-06-16 16:34:10 +0100127
128 self.assertEquals(run.cpu_in_power.data_frame["load0"].iloc[0],
129 first_load)
Javi Merino86abee12015-06-16 17:22:06 +0100130
131 def test_cpuinpower_get_normalized_load_data(self):
132 """Test CpuInPower.get_normalized_load_data()"""
133 run = cr2.Run()
134 first_load = run.cpu_in_power.data_frame["load0"].iloc[0]
135 load_data = run.cpu_in_power.get_normalized_load_data(self.map_label)
136
137 # Ideally the trace should have an event in which the cpus are
138 # not running at maximum frequency
139 self.assertEquals(load_data["A57"].iloc[0],
140 (24. + 19) * 1100000 / (1100000 * 2))
141 self.assertEquals(load_data["A53"].iloc[1],
142 (36. + 49 + 48 + 7) * 850000 / (850000 * 4))
143 self.assertEquals(run.cpu_in_power.data_frame["load0"].iloc[0],
144 first_load)