sentinel: fix sentinel to proc_name conversion
converting an opal_process_name_t means the loss of one bit, it was decided to restrict the local job id to 15 bits, so the useful information of an opal_process_name_t can fit in 63 bits.
Этот коммит содержится в:
родитель
030a5f2054
Коммит
b55b9e6aee
@ -3,7 +3,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
|
||||
* Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2014 Research Organization for Information Science
|
||||
* Copyright (c) 2014-2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
@ -59,6 +59,10 @@ typedef orte_ns_cmp_bitmask_t ompi_rte_cmp_bitmask_t;
|
||||
#define OMPI_RTE_CMP_JOBID ORTE_NS_CMP_JOBID
|
||||
#define OMPI_RTE_CMP_VPID ORTE_NS_CMP_VPID
|
||||
#define OMPI_RTE_CMP_ALL ORTE_NS_CMP_ALL
|
||||
#define OMPI_LOCAL_JOBID(jobid) ORTE_LOCAL_JOBID(jobid)
|
||||
#define OMPI_JOB_FAMILY(jobid) ORTE_JOB_FAMILY(jobid)
|
||||
#define OMPI_CONSTRUCT_JOBID(family,local) ORTE_CONSTRUCT_JOBID(family,local)
|
||||
|
||||
/* This is the DSS tag to serialize a proc name */
|
||||
#define OMPI_NAME ORTE_NAME
|
||||
#define OMPI_PROCESS_NAME_HTON ORTE_PROCESS_NAME_HTON
|
||||
|
@ -369,15 +369,43 @@ static inline bool ompi_proc_is_sentinel (ompi_proc_t *proc)
|
||||
return (intptr_t) proc & 0x1;
|
||||
}
|
||||
|
||||
/*
|
||||
* we assume an ompi_proc_t is at least aligned on two bytes,
|
||||
* so if the LSB of a pointer to an ompi_proc_t is 1, we have to handle
|
||||
* this pointer as a sentinel instead of a pointer.
|
||||
* a sentinel can be seen as an uint64_t with the following format :
|
||||
* - bit 0 : 1
|
||||
* - bits 1-15 : local jobid
|
||||
* - bits 16-31 : job family
|
||||
* - bits 32-63 : vpid
|
||||
*/
|
||||
static inline uintptr_t ompi_proc_name_to_sentinel (opal_process_name_t name)
|
||||
{
|
||||
return (*((uintptr_t *) &name) << 1) | 0x1;
|
||||
uintptr_t tmp, sentinel = 0;
|
||||
/* local jobid must fit in 15 bits */
|
||||
assert(! (OMPI_LOCAL_JOBID(name.jobid) & 0x8000));
|
||||
sentinel |= 0x1;
|
||||
tmp = (uintptr_t)OMPI_LOCAL_JOBID(name.jobid);
|
||||
sentinel |= ((tmp << 1) & 0xfffe);
|
||||
tmp = (uintptr_t)OMPI_JOB_FAMILY(name.jobid);
|
||||
sentinel |= ((tmp << 16) & 0xffff0000);
|
||||
tmp = (uintptr_t)name.vpid;
|
||||
sentinel |= ((tmp << 32) & 0xffffffff00000000);
|
||||
return sentinel;
|
||||
}
|
||||
|
||||
static inline opal_process_name_t ompi_proc_sentinel_to_name (uintptr_t sentinel)
|
||||
{
|
||||
sentinel >>= 1;
|
||||
return *((opal_process_name_t *) &sentinel);
|
||||
opal_process_name_t name;
|
||||
uint32_t local, family;
|
||||
uint32_t vpid;
|
||||
assert(sentinel & 0x1);
|
||||
local = (sentinel >> 1) & 0x7fff;
|
||||
family = (sentinel >> 16) & 0xffff;
|
||||
vpid = (sentinel >> 32) & 0xffffffff;
|
||||
name.jobid = OMPI_CONSTRUCT_JOBID(family,local);
|
||||
name.vpid = vpid;
|
||||
return name;
|
||||
}
|
||||
|
||||
END_C_DECLS
|
||||
|
@ -97,6 +97,9 @@ ORTE_DECLSPEC char *orte_pretty_print_timing(int64_t secs, int64_t usecs);
|
||||
#define ORTE_CONSTRUCT_LOCAL_JOBID(local, job) \
|
||||
( ((local) & 0xffff0000) | ((job) & 0x0000ffff) )
|
||||
|
||||
#define ORTE_CONSTRUCT_JOBID(family, local) \
|
||||
ORTE_CONSTRUCT_LOCAL_JOBID(ORTE_CONSTRUCT_JOB_FAMILY(family), local)
|
||||
|
||||
/* a macro for identifying that a proc is a daemon */
|
||||
#define ORTE_JOBID_IS_DAEMON(n) \
|
||||
!((n) & 0x0000ffff)
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user