|  |  |  | #define _GNU_SOURCE
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <sched.h>
 | 
					
						
							|  |  |  | #include <arm_neon.h>
 | 
					
						
							|  |  |  | #include <sys/prctl.h>
 | 
					
						
							|  |  |  | #include <sys/syscall.h>
 | 
					
						
							|  |  |  | #include "../../../common/util.h"
 | 
					
						
							|  |  |  | #include "../../../common/timing.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define CORES 3
 | 
					
						
							|  |  |  | double ttime[CORES];
 | 
					
						
							|  |  |  | double oout[CORES];
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void waste(int core) {
 | 
					
						
							|  |  |  |   prctl(PR_SET_NAME, (unsigned long)"waste", 0, 0, 0);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cpu_set_t my_set;
 | 
					
						
							|  |  |  |   CPU_ZERO(&my_set);
 | 
					
						
							|  |  |  |   CPU_SET(core, &my_set);
 | 
					
						
							|  |  |  |   int ret = sched_setaffinity(0, sizeof(cpu_set_t), &my_set);
 | 
					
						
							|  |  |  |   printf("set affinity to %d: %d\n", core, ret);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //struct sched_param sa;
 | 
					
						
							|  |  |  |   //memset(&sa, 0, sizeof(sa));
 | 
					
						
							|  |  |  |   //sa.sched_priority = 51;
 | 
					
						
							|  |  |  |   //sched_setscheduler(syscall(SYS_gettid), SCHED_FIFO, &sa);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   float32x4_t *tmp = (float32x4_t *)malloc(0x1000008*sizeof(float32x4_t));
 | 
					
						
							|  |  |  |   float32x4_t out;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   uint64_t i = 0;
 | 
					
						
							|  |  |  |   double sec = seconds_since_boot();
 | 
					
						
							|  |  |  |   while(1) {
 | 
					
						
							|  |  |  |     int j;
 | 
					
						
							|  |  |  |     for (j = 0; j < 0x1000000; j++) {
 | 
					
						
							|  |  |  |       out = vmlaq_f32(out, tmp[j], tmp[j+1]);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     if (i == 0x8) {
 | 
					
						
							|  |  |  |       double nsec = seconds_since_boot();
 | 
					
						
							|  |  |  |       ttime[core] = nsec-sec;
 | 
					
						
							|  |  |  |       oout[core] = out[0] + out[1] + out[2] + out[3];
 | 
					
						
							|  |  |  |       i = 0;
 | 
					
						
							|  |  |  |       sec = nsec;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     i++;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() {
 | 
					
						
							|  |  |  |   pthread_t waster[CORES];
 | 
					
						
							|  |  |  |   for (int i = 0 ; i < CORES; i++) {
 | 
					
						
							|  |  |  |     pthread_create(&waster[i], NULL, waste, (void*)i);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   while (1) {
 | 
					
						
							|  |  |  |     for (int i = 0 ; i < CORES; i++) {
 | 
					
						
							|  |  |  |       printf("%.2f ", ttime[i]);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     printf("\n");
 | 
					
						
							|  |  |  |     sleep(1);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 |