Example #1
0
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;
}
Example #4
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);
  }
  

}
Example #6
0
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(&currentime1, NULL);
  	
	nanosleep(&interval_100ms, NULL);

  	result1=read_msr(fd1,MSR_PKG_ENERGY_STATUS); 
        result2=read_msr(fd2,MSR_PKG_ENERGY_STATUS); 
  	gettimeofday(&currentime2, 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);
	}

}