#include #include "genlib.h" #include "log.h" #include "memory.h" #define IM1 2147483563 #define IM2 2147483399 #define AM (1.0 / IM1) #define IMM1 (IM1 - 1) #define IA1 40014 #define IA2 40692 #define IQ1 53668 #define IQ2 52774 #define IR1 12211 #define IR2 3791 #define NTAB 32 #define NDIV (1 + IMM1 / NTAB) #define EPS 1.2e-7 #define RNMX (1.0 - EPS) double ran2(long* idum, long* idum2, long* iy, long iv[NTAB], int cores) { double* used_ram_t0 = malloc(sizeof(double)); getVirtualMemUsed(used_ram_t0); clock_t t = clock(); int j; long k; double temp; log_info("RESULT = in progress, idum = %f, idum2 = %f, iy = %f", *idum, *idum2, *iy); struct cpustat initial[cores]; struct cpustat final[cores]; for (int i = 0; i < cores; i++) { get_stats(&initial[i], i - 1); } if (*idum <= 0) { if (-(*idum) < 1) *idum = 1; else *idum = -(*idum); *idum2 = (*idum); for (j = NTAB + 7; j >= 0; j--) { k = (*idum) / IQ1; *idum = IA1 * (*idum - k * IQ1) - k * IR1; if (*idum < 0) *idum += IM1; if (j < NTAB) iv[j] = *idum; } *iy = iv[0]; } k = (*idum) / IQ1; *idum = IA1 * (*idum - k * IQ1) - k * IR1; if (*idum < 0) *idum += IM1; k = *idum2 / IQ2; *idum2 = IA2 * (*idum2 - k * IQ2) - k * IR2; if (*idum2 < 0) *idum2 += IM2; j = (*iy) / NDIV; *iy = iv[j] - (*idum2); iv[j] = *idum; if (*iy < 1) (*iy) += IMM1; t = clock() - t; double time_taken = ((double)t)/CLOCKS_PER_SEC; // calculate the elapsed time for (int i = 0; i < cores; i++) { get_stats(&final[i], i - 1); } for (int i = 0; i < cores; i++) { log_info("CPU %d: %lf%%", i, calculate_load(&initial[i], &final[i])); } double* used_ram_tf = malloc(sizeof(double)); getVirtualMemUsed(used_ram_tf); if ((temp = AM * (*iy)) > RNMX) { log_info("RESULT = success, RNMX = %f, ELAPSED = %f, DIF USED VIRTUAL MEM = %5.1f MB", RNMX, time_taken, *used_ram_tf - *used_ram_t0); free(used_ram_t0); free(used_ram_tf); return (RNMX); } else { log_info("RESULT = success, RNMX = %f, ELAPSED = %f, DIF USED VIRTUAL MEM = %5.1f MB", RNMX, time_taken, *used_ram_tf - *used_ram_t0); free(used_ram_t0); free(used_ram_tf); return temp; } }