Create two new modex functions for send/recv of specific OPAL data types - basically, ensure that the values are packed and unpacked appropriately. Provides a convenience function as otherwise anyone wanting to send a value had to do this themselves.
Use it to send the arch. This commit was SVN r21677.
Этот коммит содержится в:
родитель
dcedc99a6a
Коммит
2a1cf2ae81
@ -113,7 +113,7 @@ int ompi_proc_init(void)
|
|||||||
proc->proc_hostname = orte_process_info.nodename;
|
proc->proc_hostname = orte_process_info.nodename;
|
||||||
proc->proc_arch = opal_local_arch;
|
proc->proc_arch = opal_local_arch;
|
||||||
/* add our arch to the modex */
|
/* add our arch to the modex */
|
||||||
if (OMPI_SUCCESS != (ret = ompi_modex_send_string("OMPI_ARCH", &proc->proc_arch, sizeof(proc->proc_arch)))) {
|
if (OMPI_SUCCESS != (ret = ompi_modex_send_key_value("OMPI_ARCH", &proc->proc_arch, OPAL_UINT32))) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -141,8 +141,6 @@ int ompi_proc_set_arch(void)
|
|||||||
{
|
{
|
||||||
ompi_proc_t *proc = NULL;
|
ompi_proc_t *proc = NULL;
|
||||||
opal_list_item_t *item = NULL;
|
opal_list_item_t *item = NULL;
|
||||||
uint32_t *arch;
|
|
||||||
size_t sizearch;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
OPAL_THREAD_LOCK(&ompi_proc_lock);
|
OPAL_THREAD_LOCK(&ompi_proc_lock);
|
||||||
@ -153,12 +151,10 @@ int ompi_proc_set_arch(void)
|
|||||||
proc = (ompi_proc_t*)item;
|
proc = (ompi_proc_t*)item;
|
||||||
|
|
||||||
if (proc->proc_name.vpid != ORTE_PROC_MY_NAME->vpid) {
|
if (proc->proc_name.vpid != ORTE_PROC_MY_NAME->vpid) {
|
||||||
if (OMPI_SUCCESS != (ret = ompi_modex_recv_string("OMPI_ARCH", proc, (void**)&arch, &sizearch))) {
|
if (OMPI_SUCCESS != (ret = ompi_modex_recv_key_value("OMPI_ARCH", proc, (void*)&(proc->proc_arch), OPAL_UINT32))) {
|
||||||
OPAL_THREAD_UNLOCK(&ompi_proc_lock);
|
OPAL_THREAD_UNLOCK(&ompi_proc_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
proc->proc_arch = *arch;
|
|
||||||
free(arch);
|
|
||||||
/* if arch is different than mine, create a new convertor for this proc */
|
/* if arch is different than mine, create a new convertor for this proc */
|
||||||
if (proc->proc_arch != opal_local_arch) {
|
if (proc->proc_arch != opal_local_arch) {
|
||||||
#if OPAL_ENABLE_HETEROGENEOUS_SUPPORT
|
#if OPAL_ENABLE_HETEROGENEOUS_SUPPORT
|
||||||
@ -543,7 +539,6 @@ ompi_proc_unpack(opal_buffer_t* buf,
|
|||||||
|
|
||||||
/* update all the values */
|
/* update all the values */
|
||||||
plist[i]->proc_arch = new_arch;
|
plist[i]->proc_arch = new_arch;
|
||||||
|
|
||||||
/* if arch is different than mine, create a new convertor for this proc */
|
/* if arch is different than mine, create a new convertor for this proc */
|
||||||
if (plist[i]->proc_arch != opal_local_arch) {
|
if (plist[i]->proc_arch != opal_local_arch) {
|
||||||
#if OPAL_ENABLE_HETEROGENEOUS_SUPPORT
|
#if OPAL_ENABLE_HETEROGENEOUS_SUPPORT
|
||||||
|
@ -23,9 +23,13 @@
|
|||||||
|
|
||||||
#include "opal/mca/mca.h"
|
#include "opal/mca/mca.h"
|
||||||
#include "opal/mca/base/base.h"
|
#include "opal/mca/base/base.h"
|
||||||
|
#include "opal/dss/dss.h"
|
||||||
|
|
||||||
#include "orte/mca/grpcomm/grpcomm.h"
|
#include "orte/mca/grpcomm/grpcomm.h"
|
||||||
|
|
||||||
|
#include "orte/util/name_fns.h"
|
||||||
|
#include "orte/runtime/orte_globals.h"
|
||||||
|
|
||||||
#include "ompi/proc/proc.h"
|
#include "ompi/proc/proc.h"
|
||||||
#include "ompi/runtime/ompi_module_exchange.h"
|
#include "ompi/runtime/ompi_module_exchange.h"
|
||||||
|
|
||||||
@ -80,3 +84,56 @@ ompi_modex_recv_string(const char* key,
|
|||||||
{
|
{
|
||||||
return orte_grpcomm.get_proc_attr(source_proc->proc_name, key, buffer, size);
|
return orte_grpcomm.get_proc_attr(source_proc->proc_name, key, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ompi_modex_send_key_value(const char* key,
|
||||||
|
const void *value,
|
||||||
|
opal_data_type_t dtype)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
opal_buffer_t buf;
|
||||||
|
opal_byte_object_t bo;
|
||||||
|
|
||||||
|
OBJ_CONSTRUCT(&buf, opal_buffer_t);
|
||||||
|
if (OPAL_SUCCESS != (rc = opal_dss.pack(&buf, value, 1, dtype))) {
|
||||||
|
OBJ_DESTRUCT(&buf);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
if (OPAL_SUCCESS != (rc = opal_dss.unload(&buf, (void**)&bo.bytes, &bo.size))) {
|
||||||
|
OBJ_DESTRUCT(&buf);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
OBJ_DESTRUCT(&buf);
|
||||||
|
|
||||||
|
return orte_grpcomm.set_proc_attr(key, bo.bytes, bo.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
ompi_modex_recv_key_value(const char* key,
|
||||||
|
struct ompi_proc_t *source_proc,
|
||||||
|
void *value, opal_data_type_t dtype)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
opal_buffer_t buf;
|
||||||
|
opal_byte_object_t bo;
|
||||||
|
int32_t n;
|
||||||
|
size_t bsize;
|
||||||
|
|
||||||
|
bo.bytes = NULL;
|
||||||
|
bo.size = 0;
|
||||||
|
if (OMPI_SUCCESS != (rc = orte_grpcomm.get_proc_attr(source_proc->proc_name, key,
|
||||||
|
(void**)&bo.bytes, &bsize))) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
bo.size = bsize;
|
||||||
|
OBJ_CONSTRUCT(&buf, opal_buffer_t);
|
||||||
|
if (OMPI_SUCCESS != (rc = opal_dss.load(&buf, bo.bytes, bo.size))) {
|
||||||
|
OBJ_DESTRUCT(&buf);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
n = 1;
|
||||||
|
rc = opal_dss.unpack(&buf, value, &n, dtype);
|
||||||
|
OBJ_DESTRUCT(&buf);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
@ -130,6 +130,24 @@ OMPI_DECLSPEC int ompi_modex_send(mca_base_component_t *source_component,
|
|||||||
OMPI_DECLSPEC int ompi_modex_send_string(const char* key,
|
OMPI_DECLSPEC int ompi_modex_send_string(const char* key,
|
||||||
const void *buffer, size_t size);
|
const void *buffer, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a value to all other corresponding peer process
|
||||||
|
*
|
||||||
|
* Similar to ompi_modex_send(), but uses a char* key instead of a
|
||||||
|
* component name for indexing, and performs all required conditioning
|
||||||
|
* to deal with heterogeneity.
|
||||||
|
*
|
||||||
|
* @param[in] key A unique key for data storage / lookup
|
||||||
|
* @param[in] value A pointer to data value
|
||||||
|
* @param[in] dtype Data type of the value
|
||||||
|
*
|
||||||
|
* @retval OMPI_SUCCESS On success
|
||||||
|
* @retval OMPI_ERROR An unspecified error occurred
|
||||||
|
*/
|
||||||
|
OMPI_DECLSPEC int ompi_modex_send_key_value(const char* key,
|
||||||
|
const void *value,
|
||||||
|
opal_data_type_t dtype);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receive a module-specific buffer from a corresponding MCA module
|
* Receive a module-specific buffer from a corresponding MCA module
|
||||||
@ -205,6 +223,29 @@ OMPI_DECLSPEC int ompi_modex_recv_string(const char* key,
|
|||||||
struct ompi_proc_t *source_proc,
|
struct ompi_proc_t *source_proc,
|
||||||
void **buffer, size_t *size);
|
void **buffer, size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recv a value from a given peer
|
||||||
|
*
|
||||||
|
* Similar to ompi_modex_recv(), but uses a char* key instead of a
|
||||||
|
* component name for indexing, and performs all required conditioning
|
||||||
|
* to deal with heterogeneity.
|
||||||
|
*
|
||||||
|
* @param[in] key A unique key for data storage / lookup
|
||||||
|
* @param[in] source_proc Peer process to receive from
|
||||||
|
* @param[in] value A pointer to the address where the data
|
||||||
|
* value will be stored
|
||||||
|
* @param[in] dtype Data type of the value
|
||||||
|
*
|
||||||
|
* @retval OMPI_SUCCESS If a corresponding module value is found and
|
||||||
|
* successfully returned to the caller.
|
||||||
|
* @retval OMPI_ERR_NOT_IMPLEMENTED Modex support is not available in
|
||||||
|
* this build of Open MPI (systems like the Cray XT)
|
||||||
|
*/
|
||||||
|
OMPI_DECLSPEC int ompi_modex_recv_key_value(const char* key,
|
||||||
|
struct ompi_proc_t *source_proc,
|
||||||
|
void *value,
|
||||||
|
opal_data_type_t dtype);
|
||||||
|
|
||||||
|
|
||||||
END_C_DECLS
|
END_C_DECLS
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user