mirror of
https://github.com/Dr-Noob/cpufetch.git
synced 2026-03-25 07:50:40 +01:00
[v0.98][PPC] Add altivec detection and peak performance output
This commit is contained in:
@@ -3,8 +3,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "ppc.h"
|
||||
#include "uarch.h"
|
||||
#include "udev.h"
|
||||
#include "../common/udev.h"
|
||||
|
||||
@@ -146,12 +148,54 @@ struct cpuInfo* get_cpu_info() {
|
||||
cpu->cach = get_cache_info(cpu);
|
||||
cpu->topo = get_topology_info(cpu, cpu->cach);
|
||||
|
||||
feat->altivec = has_altivec(cpu->arch);
|
||||
|
||||
if(cpu->cach == NULL || cpu->topo == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return cpu;
|
||||
}
|
||||
|
||||
char* get_str_altivec(struct cpuInfo* cpu) {
|
||||
char* string = calloc(4, sizeof(char));
|
||||
|
||||
if(cpu->feat->altivec) strcpy(string, "Yes");
|
||||
else strcpy(string, "No");
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
char* get_str_peak_performance(struct cpuInfo* cpu, struct topology* topo, int64_t freq) {
|
||||
/*
|
||||
* Not sure about this
|
||||
* PP(SP) = N_CORES * FREQUENCY * 4(If altivec)
|
||||
*/
|
||||
|
||||
//7 for GFLOP/s and 6 for digits,eg 412.14
|
||||
uint32_t size = 7+6+1+1;
|
||||
assert(strlen(STRING_UNKNOWN)+1 <= size);
|
||||
char* string = malloc(sizeof(char)*size);
|
||||
|
||||
//First check we have consistent data
|
||||
if(freq == UNKNOWN_FREQ) {
|
||||
snprintf(string,strlen(STRING_UNKNOWN)+1,STRING_UNKNOWN);
|
||||
return string;
|
||||
}
|
||||
|
||||
struct features* feat = cpu->feat;
|
||||
double flops = topo->physical_cores * topo->sockets * (freq*1000000);
|
||||
if(feat->altivec) flops = flops*4;
|
||||
|
||||
if(flops >= (double)1000000000000.0)
|
||||
snprintf(string,size,"%.2f TFLOP/s",flops/1000000000000);
|
||||
else if(flops >= 1000000000.0)
|
||||
snprintf(string,size,"%.2f GFLOP/s",flops/1000000000);
|
||||
else
|
||||
snprintf(string,size,"%.2f MFLOP/s",flops/1000000);
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket) {
|
||||
char* string;
|
||||
if(topo->smt_supported > 1) {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
struct topology* get_topology_info(struct cpuInfo* cpu, struct cache* cach);
|
||||
struct cpuInfo* get_cpu_info();
|
||||
char* get_str_altivec(struct cpuInfo* cpu);
|
||||
char* get_str_peak_performance(struct cpuInfo* cpu, struct topology* topo, int64_t freq);
|
||||
void print_debug(struct cpuInfo* cpu);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -219,6 +219,23 @@ struct uarch* get_uarch_from_pvr(uint32_t pvr) {
|
||||
return arch;
|
||||
}
|
||||
|
||||
bool has_altivec(struct uarch* arch) {
|
||||
switch(arch->uarch) {
|
||||
case UARCH_PPC970FX:
|
||||
case UARCH_PPC970MP:
|
||||
case UARCH_CELLBE:
|
||||
case UARCH_POWER6:
|
||||
case UARCH_POWER7:
|
||||
case UARCH_POWER7PLUS:
|
||||
case UARCH_POWER8:
|
||||
case UARCH_POWER9:
|
||||
case UARCH_POWER10:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
char* get_str_uarch(struct cpuInfo* cpu) {
|
||||
return cpu->arch->uarch_str;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
struct uarch;
|
||||
|
||||
struct uarch* get_uarch_from_pvr(uint32_t pvr);
|
||||
bool has_altivec(struct uarch* arch);
|
||||
char* get_str_uarch(struct cpuInfo* cpu);
|
||||
char* get_str_process(struct cpuInfo* cpu);
|
||||
void free_uarch_struct(struct uarch* arch);
|
||||
|
||||
Reference in New Issue
Block a user