uti: Workaround not to share CPU with OpenMP threads
* Assign uti thread to the last idle CPU so that it's not shared with an OpenMP thread Change-Id: Ia42cae056ce81fde9b6dab6286b39a52f3c9e172
This commit is contained in:
@@ -506,6 +506,7 @@ static int process_msg_prepare_process(unsigned long rphys)
|
||||
}
|
||||
|
||||
proc->uti_thread_rank = pn->uti_thread_rank;
|
||||
proc->uti_use_last_cpu = pn->uti_use_last_cpu;
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
proc->profile = pn->profile;
|
||||
@@ -612,7 +613,7 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
||||
case SCD_MSG_SCHEDULE_PROCESS:
|
||||
thread = (struct thread *)packet->arg;
|
||||
|
||||
cpuid = obtain_clone_cpuid(&thread->cpu_set);
|
||||
cpuid = obtain_clone_cpuid(&thread->cpu_set, 0);
|
||||
if (cpuid == -1) {
|
||||
kprintf("No CPU available\n");
|
||||
ret = -1;
|
||||
|
||||
@@ -275,7 +275,7 @@ extern struct list_head resource_set_list;
|
||||
extern mcs_rwlock_lock_t resource_set_lock;
|
||||
extern int idle_halt;
|
||||
extern int allow_oversubscribe;
|
||||
extern ihk_spinlock_t runq_reservation_lock; /* To serialize runq reservations for competeing fork()s */
|
||||
extern ihk_spinlock_t runq_reservation_lock; /* mutex for cpuid reservation (clv->runq_reserved) */
|
||||
|
||||
struct process_hash {
|
||||
struct list_head list[HASH_SIZE];
|
||||
@@ -557,6 +557,7 @@ struct process {
|
||||
unsigned long heap_extension;
|
||||
unsigned long mpol_bind_mask;
|
||||
int uti_thread_rank; /* Spawn on Linux CPU when clone_count reaches this */
|
||||
int uti_use_last_cpu; /* Work-around not to share CPU with OpenMP thread */
|
||||
int clone_count;
|
||||
|
||||
// perf_event
|
||||
|
||||
@@ -201,6 +201,7 @@ struct program_load_desc {
|
||||
long stack_premap;
|
||||
unsigned long mpol_bind_mask;
|
||||
int uti_thread_rank; /* N-th clone() spawns a thread on Linux CPU */
|
||||
int uti_use_last_cpu; /* Work-around not to share CPU with OpenMP thread */
|
||||
int nr_processes;
|
||||
int process_rank;
|
||||
char shell_path[SHELL_PATH_MAX_LEN];
|
||||
@@ -350,7 +351,7 @@ struct syscall_post {
|
||||
#define SYSCALL_FOOTER return do_syscall(&request, ihk_mc_get_processor_id(), 0)
|
||||
|
||||
extern long do_syscall(struct syscall_request *req, int cpu, int pid);
|
||||
int obtain_clone_cpuid(cpu_set_t *cpu_set);
|
||||
int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last);
|
||||
extern long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx);
|
||||
|
||||
#define DECLARATOR(number,name) __NR_##name = number,
|
||||
|
||||
@@ -2445,12 +2445,6 @@ unsigned long do_fork(int clone_flags, unsigned long newsp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cpuid = obtain_clone_cpuid(&old->cpu_set);
|
||||
if (cpuid == -1) {
|
||||
kprintf("do_fork,core not available\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* N-th creation put the new on Linux CPU. It's turned off when zero is
|
||||
set to uti_thread_rank. */
|
||||
if (oldproc->uti_thread_rank) {
|
||||
@@ -2463,6 +2457,12 @@ unsigned long do_fork(int clone_flags, unsigned long newsp,
|
||||
}
|
||||
}
|
||||
|
||||
cpuid = obtain_clone_cpuid(&old->cpu_set, old->mod_clone == SPAWN_TO_REMOTE && oldproc->uti_use_last_cpu);
|
||||
if (cpuid == -1) {
|
||||
kprintf("do_fork,core not available\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
new = clone_thread(old, curpc,
|
||||
newsp ? newsp : cursp, clone_flags);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user