Exemple #1
0
                sel_cluster_freq[cluster] = MAX_THERMAL_FREQ_INDICES[cluster]
                #print("Tripped load limit. ({} > {})".format(max(cpu_loads[cluster:(cluster+CLUSTER_SIZE)]), CLUSTER_UP_THRESH))
            else:
                # find a frequency that will maintain no more than LOAD_TARGET usage on any core.
                Fs[cluster] = sysfs_utils.getClusterFreq(cluster)
                Fs_new[cluster] = min( Fs[cluster], target_frequency(max(cpu_loads[cluster:(cluster+CLUSTER_SIZE)]),\
                         avail_freqs[cluster][0], avail_freqs[cluster][-1]) )
                # Search up to and including the current frequency for one that maintains the
                # desired load:
                for index, frequency in enumerate(avail_freqs[cluster]):
                    if frequency == Fs_new[cluster]:
                        sel_cluster_freq[cluster] = index
                        break
                    elif frequency > Fs_new[cluster]:
                        sel_cluster_freq[cluster] = max(index - 1, 0)
                        break
                    elif index >= MAX_THERMAL_FREQ_INDICES[cluster]:
                        sel_cluster_freq[cluster] = MAX_THERMAL_FREQ_INDICES[
                            cluster]
                        break
            selected_index = int(sel_cluster_freq[cluster])
            try:
                sysfs_utils.setClusterFreq(cluster, \
                       avail_freqs[cluster][selected_index])
            except:
                print("ERROR: tried to access {} for cluster {}".format(
                    selected_index, cluster))
                print(avail_freqs[cluster])
        time.sleep(max(0, REFRESH_PERIOD - (time.time() - last_time)))
        #print("period {} s".format( time.time() - last_time ) )
Exemple #2
0
    Fs = {x: 0 for x in clusters}
    Fs_new = {x: 0 for x in clusters}
    U = {x: 0.0 for x in clusters}
    while True:
        last_time = time.time()
        # Get the latest cpu usages
        cpu_loads = sysfs_utils.getCpuLoad(n=-1, interval=0.0)
        for cluster in clusters:
            if max(cpu_loads[cluster:(cluster +
                                      CLUSTER_SIZE)]) > CLUSTER_UP_THRESH:
                # increase the cluster frequency to max
                sel_cluster_freq[cluster] = len(avail_freqs[cluster]) - 1
            else:
                # find a frequency that will maintain no more than LOAD_TARGET usage on any core.
                Fs[cluster] = sysfs_utils.getClusterFreq(cluster)
                Fs_new[cluster] = min( Fs[cluster], target_frequency(max(cpu_loads[cluster:(cluster+CLUSTER_SIZE)]),\
                         avail_freqs[cluster][0], avail_freqs[cluster][-1]) )
                # Search up to and including the current frequency for one that maintains the
                # desired load:
                for index, frequency in enumerate(avail_freqs[cluster]):
                    if frequency == Fs_new[cluster]:
                        sel_cluster_freq[cluster] = index
                        break
                    elif frequency > Fs_new[cluster]:
                        sel_cluster_freq[cluster] = max(index - 1, 0)
                        break
            sysfs_utils.setClusterFreq(cluster, \
                   avail_freqs[cluster][sel_cluster_freq[cluster]])
        time.sleep(max(0, REFRESH_PERIOD - (time.time() - last_time)))
        #print("period {} s".format( time.time() - last_time ) )
Exemple #3
0
def ondemand_power(clusters, POWER_THRESH):
    # Setup output and making sure system is in userspace gov
    SP2_tel = setup(clusters, POWER_THRESH)
    # Setup runtime vars:
    avail_freqs = {x: list() for x in clusters}
    sel_cluster_freq = {x: 0 for x in clusters}
    for cluster in clusters:
        avail_freqs[cluster] = sysfs_utils.getAvailFreqs(cluster)
    Fs = {x: 0 for x in clusters}
    Fs_new = {x: 0 for x in clusters}
    U = {x: 0.0 for x in clusters}
    total_power = 0
    MAX_FREQ_INDICES = {x: 0 for x in clusters}
    # Run the governor:
    while True:
        last_time = time.time()
        # Get the latest cpu usages
        cpu_loads = sysfs_utils.getCpuLoad(n=-1, interval=0.0)
        for cluster in clusters:
            # Code to handle power limits ********************************************************
            if cluster == 4:
                T = sysfs_utils.getTemps()[0:4]
                F = float(sysfs_utils.getClusterFreq(cluster)) / 1000000
                total_power = getTelnetPower(SP2_tel, total_power)
                leakage_power = leakagePower(c1, c2, Igate, big_f_to_v[F],
                                             max(T) + 273.15)
                dynamic_power = (total_power - peripheral_power -
                                 leakage_power)
                if logfile is not None:
                    logfile.write("{}\t{}\t{}\n".format(
                        total_power, leakage_power, dynamic_power))
                remaining_power = POWER_THRESH - (total_power -
                                                  peripheral_power)
                if remaining_power <= 0:
                    MAX_FREQ_INDICES[cluster] = max(
                        MAX_FREQ_INDICES[cluster] - 1, 0)
                    print("Tripped power limit. ({} > {})".format(
                        total_power - peripheral_power, POWER_THRESH))
                else:
                    MAX_FREQ_INDICES[cluster] += math.floor(remaining_power *
                                                            P)
                    MAX_FREQ_INDICES[cluster] = min(
                        len(avail_freqs[cluster]) - 1,
                        MAX_FREQ_INDICES[cluster])
            else:  # Else if the little cluster, just proceed as ondemand would normally
                MAX_FREQ_INDICES[cluster] = len(avail_freqs[cluster]) - 1
            # End code to handle power limits ****************************************************

            # In the case of either cluster, apply the ondemand algorithm, but with upper freq limit
            if max(cpu_loads[cluster:(cluster +
                                      CLUSTER_SIZE)]) > CLUSTER_UP_THRESH:
                # increase the cluster frequency to maximum allowed
                sel_cluster_freq[cluster] = MAX_FREQ_INDICES[cluster]
            else:
                # find a frequency that will maintain no more than LOAD_TARGET usage on any core.
                Fs[cluster] = sysfs_utils.getClusterFreq(cluster)
                Fs_new[cluster] = min( Fs[cluster], target_frequency(max(cpu_loads[cluster:(cluster+CLUSTER_SIZE)]),\
                         avail_freqs[cluster][0], avail_freqs[cluster][-1]) )
                # Search up to and including the current frequency for one that maintains the
                # desired load:
                for index, frequency in enumerate(avail_freqs[cluster]):
                    if frequency == Fs_new[cluster]:
                        sel_cluster_freq[cluster] = index
                        break
                    elif frequency > Fs_new[cluster]:
                        sel_cluster_freq[cluster] = max(index - 1, 0)
                        break
                    elif index >= MAX_FREQ_INDICES[cluster]:
                        sel_cluster_freq[cluster] = MAX_FREQ_INDICES[cluster]
                        break
            selected_index = int(sel_cluster_freq[cluster])
            try:
                sysfs_utils.setClusterFreq(cluster, \
                       avail_freqs[cluster][selected_index] )
            except:
                print(sys.exc_info()[0])
                print("ERROR: tried to access {} for cluster {}".format(
                    selected_index, cluster))
                print(avail_freqs[cluster])
        time.sleep(max(0, REFRESH_PERIOD - (time.time() - last_time)))
Exemple #4
0
import cpu_usage

print("Make sure system is running userspace before trying to set frequency!")
while True:
	freq = float(raw_input("Enter frequency in GHz: "))
	cpu_usage.setClusterFreq(0, int(freq*1000000))
	cpu_usage.setClusterFreq(4, int(freq*1000000))
Exemple #5
0
	def tick(self):
		for cluster in self.clusters:
			self.sel_cluster_freq[cluster] = random.randint(0, \
								len(self.avail_freqs[cluster])-1 )
			sysfs_utils.setClusterFreq(cluster, \
								self.avail_freqs[cluster][self.sel_cluster_freq[cluster]])