From 6827bb817faecede51838e2fcc8b6283e54fe872 Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Mon, 14 May 2012 16:51:05 -0400 Subject: Final GPUSync implementation. --- include/litmus/gpu_affinity.h | 7 ++----- include/litmus/nvidia_info.h | 1 + include/litmus/rt_param.h | 5 +++-- include/litmus/sched_trace.h | 44 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/include/litmus/gpu_affinity.h b/include/litmus/gpu_affinity.h index d4db2003ad86..6b3fb8b28745 100644 --- a/include/litmus/gpu_affinity.h +++ b/include/litmus/gpu_affinity.h @@ -43,10 +43,7 @@ static inline lt_t get_gpu_estimate(struct task_struct* t, gpu_migration_dist_t val = _fp_to_integer(t->rt_param.gpu_migration_est[i].est); } - // minimum value is 1 (val is 0 if we haven't run with local affinity yet) - // TODO: pick a better default min-value. 1 is too small. perhaps - // task execution time? - return ((val > 0) ? val : 1); + return ((val > 0) ? val : dist+1); } -#endif \ No newline at end of file +#endif diff --git a/include/litmus/nvidia_info.h b/include/litmus/nvidia_info.h index 580728051d4e..97c9577141db 100644 --- a/include/litmus/nvidia_info.h +++ b/include/litmus/nvidia_info.h @@ -12,6 +12,7 @@ #define NV_MAX_SIMULT_USERS CONFIG_NV_MAX_SIMULT_USERS int init_nvidia_info(void); +void shutdown_nvidia_info(void); int is_nvidia_func(void* func_addr); diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index 4553521146cc..0198884eab86 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h @@ -26,6 +26,7 @@ static inline int lt_after_eq(lt_t a, lt_t b) typedef enum { RT_CLASS_HARD, RT_CLASS_SOFT, + RT_CLASS_SOFT_W_SLIP, RT_CLASS_BEST_EFFORT } task_class_t; @@ -189,8 +190,8 @@ struct rt_param { long unsigned int held_gpus; // bitmap of held GPUs. #ifdef CONFIG_LITMUS_AFFINITY_LOCKING - fp_t gpu_fb_param_a; - fp_t gpu_fb_param_b; + fp_t gpu_fb_param_a[MIG_LAST+1]; + fp_t gpu_fb_param_b[MIG_LAST+1]; gpu_migration_dist_t gpu_migration; int last_gpu; diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index 232c7588d103..b1b71f6c5f0c 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -10,7 +10,8 @@ struct st_trace_header { u8 type; /* Of what type is this record? */ u8 cpu; /* On which CPU was it recorded? */ u16 pid; /* PID of the task. */ - u32 job; /* The job sequence number. */ + u32 job:24; /* The job sequence number. */ + u8 extra; } __attribute__((packed)); #define ST_NAME_LEN 16 @@ -136,6 +137,22 @@ struct st_nv_interrupt_end_data { u32 serialNumber; } __attribute__((packed)); +struct st_prediction_err_data { + u64 distance; + u64 rel_err; +} __attribute__((packed)); + +struct st_migration_data { + u64 observed; + u64 estimated; +} __attribute__((packed)); + +struct migration_info { + u64 observed; + u64 estimated; + u8 distance; +} __attribute__((packed)); + #define DATA(x) struct st_ ## x ## _data x; typedef enum { @@ -160,6 +177,9 @@ typedef enum { ST_EFF_PRIO_CHANGE, ST_NV_INTERRUPT_BEGIN, ST_NV_INTERRUPT_END, + + ST_PREDICTION_ERR, + ST_MIGRATION, } st_event_record_type_t; struct st_event_record { @@ -187,6 +207,9 @@ struct st_event_record { DATA(effective_priority_change); DATA(nv_interrupt_begin); DATA(nv_interrupt_end); + + DATA(prediction_err); + DATA(migration); } data; } __attribute__((packed)); @@ -259,6 +282,19 @@ feather_callback void do_sched_trace_nv_interrupt_begin(unsigned long id, feather_callback void do_sched_trace_nv_interrupt_end(unsigned long id, unsigned long unused); +feather_callback void do_sched_trace_prediction_err(unsigned long id, + struct task_struct* task, + gpu_migration_dist_t* distance, + fp_t* rel_err); + + + + + +feather_callback void do_sched_trace_migration(unsigned long id, + struct task_struct* task, + struct migration_info* mig_info); + /* returns true if we're tracing an interrupt on current CPU */ /* int is_interrupt_tracing_active(void); */ @@ -331,6 +367,12 @@ feather_callback void do_sched_trace_nv_interrupt_end(unsigned long id, #define sched_trace_nv_interrupt_end(d) \ SCHED_TRACE(SCHED_TRACE_BASE_ID + 19, do_sched_trace_nv_interrupt_end, d) +#define sched_trace_prediction_err(t, dist, rel_err) \ + SCHED_TRACE3(SCHED_TRACE_BASE_ID + 20, do_sched_trace_prediction_err, t, dist, rel_err) + +#define sched_trace_migration(t, mig_info) \ + SCHED_TRACE2(SCHED_TRACE_BASE_ID + 21, do_sched_trace_migration, t, mig_info) + #define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ #endif /* __KERNEL__ */ -- cgit v1.2.2