int main(void) { int fd; long long result; double power_units,energy_units,time_units; double package_before,package_after; double pp0_before,pp0_after; double pp1_before=0.0,pp1_after; double dram_before=0.0,dram_after; double thermal_spec_power,minimum_power,maximum_power,time_window; int cpu_model; double power_target = 500; printf("Starting set each package power to %fW\n",power_target); fd=open_msr(0); /* Calculate the units used */ result=read_msr(fd,MSR_RAPL_POWER_UNIT); power_units=pow(0.5,(double)(result&0xf)); // printf("Power units = %.3fW\n",power_units); // printf("\n"); energy_units=pow(0.5,(double)((result>>8)&0x1f)); // printf("Energy units = %.8fJ\n",energy_units); // printf("\n"); time_units=pow(0.5,(double)((result>>16)&0xf)); // printf("Time units = %.8fs, %.8fKs\n",time_units, time_units*1000.0); // printf("\n"); set_power_limit(fd, power_target, power_units); fd=open_msr(8); /* Calculate the units used */ result=read_msr(fd,MSR_RAPL_POWER_UNIT); power_units=pow(0.5,(double)(result&0xf)); energy_units=pow(0.5,(double)((result>>8)&0x1f)); time_units=pow(0.5,(double)((result>>16)&0xf)); set_power_limit(fd, power_target, power_units); return 1; }
/* Enable prefetch on core2 */ static int enable_prefetch_core2(int core) { int fd; uint64_t result; int begin,end,c; printf("Enable all prefetch\n"); if (core==-1) { begin=0; end=1024; } else { begin=core; end=core; } for(c=begin;c<=end;c++) { fd=open_msr(c); if (fd<0) break; /* Read original results */ result=read_msr(fd,CORE2_PREFETCH_MSR); printf("\tCore %d old : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n", c, result&(1ULL<<9)?'N':'Y', result&(1ULL<<19)?'N':'Y', result&(1ULL<<37)?'N':'Y', result&(1ULL<<39)?'N':'Y' ); /* Enable all */ result &= ~((1ULL<<9)|(1ULL<<19)|(1ULL<<37)|(1ULL<<39)); result=write_msr(fd,CORE2_PREFETCH_MSR,result); /* Verify change */ result=read_msr(fd,CORE2_PREFETCH_MSR); printf("\tCore %d new : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n", c, result&(1ULL<<9)?'N':'Y', result&(1ULL<<19)?'N':'Y', result&(1ULL<<37)?'N':'Y', result&(1ULL<<39)?'N':'Y' ); close(fd); } return 0; }
/* Enable prefetch on nehalem and newer */ static int enable_prefetch_nhm(int core) { int fd; int result; int begin,end,c; printf("Enable all prefetch\n"); if (core==-1) { begin=0; end=1024; } else { begin=core; end=core; } for(c=begin;c<=end;c++) { fd=open_msr(c); if (fd<0) break; /* Read original results */ result=read_msr(fd,NHM_PREFETCH_MSR); printf("\tCore %d old : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n", c, result&0x1?'N':'Y', result&0x2?'N':'Y', result&0x4?'N':'Y', result&0x8?'N':'Y' ); /* Enable all */ result=write_msr(fd,NHM_PREFETCH_MSR,0x0); /* Verify change */ result=read_msr(fd,NHM_PREFETCH_MSR); printf("\tCore %d new : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n", c, result&0x1?'N':'Y', result&0x2?'N':'Y', result&0x4?'N':'Y', result&0x8?'N':'Y' ); close(fd); } return 0; }
energy_counters_init_res energy_counters_init(energy_counters_state* state){ #if defined(__linux__) u_int64_t result; memset(state, 0, sizeof(energy_counters_state)); state->cpu_model=detect_cpu(); if(state->cpu_model<0){ return UNSUPPORTED_CPU_TYPE; } FILE *f; int n=0; char command[512]; f = popen("cat /proc/cpuinfo | grep 'physical id' | sort -u | wc -l", "r"); if (!f || fscanf(f, "%d", &n) == EOF) { pclose(f); return NUMBER_OF_SOCKETS_NOT_FOUND;} pclose(f); state->num_sockets=n; state->sockets=(socket_state*)malloc(sizeof(socket_state)*state->num_sockets); memset(state->sockets, 0, sizeof(socket_state)*state->num_sockets); unsigned int i; for(i=0; i<state->num_sockets;i++){ sprintf(command, "cat /proc/cpuinfo | egrep 'processor|physical id' | tr -d '\t' " "| tr -d ' ' | paste -d'|' - - | grep 'physicalid:%d' " "| cut -d '|' -f 1 | cut -d ':' -f 2 | head -1", i); f = popen(command,"r"); if (!f || fscanf(f, "%d", &n) == EOF) { pclose(f); return PROCESSOR_PER_SOCKET_NOT_FOUND;} pclose(f); state->sockets[i].core=n; state->sockets[i].fd=open_msr(n); if(state->sockets[i].fd<0){ return IMPOSSIBLE_TO_OPEN_MSR_FILE; } /* Calculate the units used */ result=read_msr(state->sockets[i].fd,MSR_RAPL_POWER_UNIT); state->sockets[i].power_per_unit=pow(0.5,(double)(result&0xf)); state->sockets[i].energy_per_unit=pow(0.5,(double)((result>>8)&0x1f)); state->sockets[i].time_per_unit=pow(0.5,(double)((result>>16)&0xf)); result=read_msr(state->sockets[i].fd,MSR_PKG_POWER_INFO); state->sockets[i].thermal_spec_power=state->sockets[i].power_per_unit*(double)(result&0x7fff); } return OK; #else return OS_NOT_SUPPORTED; #endif }
int32_t poll_cores ( int32_t cores , struct CoreData * core_data ) { int32_t core_index; int32_t cpu_model; // Collect baseline data per core for ( core_index = 0 ; core_index < cores ; ++core_index ) { core_data[core_index].msr_fd = open_msr(core_index); core_data_baseline ( core_index, core_data ); } //printf("\nSleeping 1 second\n\n"); sleep(1); // Collect after data per core for ( core_index = 0 ; core_index < cores ; ++core_index ) { core_data_elapsed ( core_index, core_data ); close(core_data[core_index].msr_fd); } }
void main( int argc, char **argv ) { int fd1,fd2; long long result1, result2; double power_units,energy_units,time_units; double package1_before,package1_after,package2_before,package2_after; double pp0_before,pp0_after; double pp1_before=0.0,pp1_after; double dram_before=0.0,dram_after; double thermal_spec_power,minimum_power,maximum_power,time_window; int cpu_model; //printf("Starting\n"); struct timeval currentime1,currentime2,beginningtime; struct timespec interval_1s,interval_1ms,interval_10ms, interval_100ms, interval_500ms; long double nowtime, power1, power2,tmp_max; // char *filename; gettimeofday(&beginningtime,NULL); //printf("beginningtime.tv_sec= %ld \n",beginningtime.tv_sec); //printf("beginningtime.tv_usec= %ld \n",beginningtime.tv_usec); interval_500ms.tv_sec = 0; interval_500ms.tv_nsec = 500000000; interval_100ms.tv_sec = 0; interval_100ms.tv_nsec = 100000000; interval_1s.tv_sec = 1; interval_1s.tv_nsec = 0; interval_1ms.tv_sec = 0; interval_1ms.tv_nsec = 1000000; interval_10ms.tv_sec = 0; interval_10ms.tv_nsec = 10000000; fd1=open_msr(0); fd2=open_msr(8); /* Calculate the units used */ result1=read_msr(fd1,MSR_RAPL_POWER_UNIT); power_units=pow(0.5,(double)(result1&0xf)); energy_units=pow(0.5,(double)((result1>>8)&0x1f)); time_units=pow(0.5,(double)((result1>>16)&0xf)); uint64_t currentval, newval, mask = 0, offset = 0; currentval=read_msr(fd1,MSR_PKG_RAPL_POWER_LIMIT); //printf("RAPL power limit1 = %.6fW\n", power_units*(double)(currentval&0x7fff)); currentval=read_msr(fd2,MSR_PKG_RAPL_POWER_LIMIT); //printf("RAPL power limit2 = %.6fW\n", power_units*(double)(currentval&0x7fff)); FILE *PowerFilePointer; PowerFilePointer = fopen("socket_power.txt","w"); fclose(PowerFilePointer); int i; i = 0; while (i<20){ i++; PowerFilePointer = fopen("socket_power.txt","a"); result1=read_msr(fd1,MSR_PKG_ENERGY_STATUS); result2=read_msr(fd2,MSR_PKG_ENERGY_STATUS); package1_before=(double)result1*energy_units; package2_before=(double)result2*energy_units; gettimeofday(¤time1, NULL); nanosleep(&interval_100ms, NULL); result1=read_msr(fd1,MSR_PKG_ENERGY_STATUS); result2=read_msr(fd2,MSR_PKG_ENERGY_STATUS); gettimeofday(¤time2, NULL); package1_after=(double)result1*energy_units; // printf("Package1 energy after: %.6f (%.6fJ consumed)\n", // package1_after,package1_after-package1_before); package2_after=(double)result2*energy_units; // printf("Package2 energy after: %.6f (%.6fJ consumed)\n", // package2_after,package2_after-package2_before); nowtime =((long) ((currentime2.tv_usec - beginningtime.tv_usec) + (currentime2.tv_sec - beginningtime.tv_sec)* 1000000))/1000000.000000; // printf("nowtime =%.6LF\n", nowtime); power1 =((package1_after - package1_before) /((currentime2.tv_usec - currentime1.tv_usec) + (currentime2.tv_sec - currentime1.tv_sec)*1000000))*1000000; // printf("power1 =%LF\n", power1); power2 =((package2_after - package2_before) /((currentime2.tv_usec - currentime1.tv_usec) + (currentime2.tv_sec - currentime1.tv_sec)*1000000))*1000000; long double SocketPower = power1 + power2; fprintf(PowerFilePointer,"%LF\n",SocketPower); // printf("power1 = %lF, power2= %lF, sum = %lF", power1,power2,SocketPower); sleep(1); fclose(PowerFilePointer); } }