Fix the load_balance mapper so that it sets the #procs in the job before attempting to compute vpids
This commit was SVN r22812.
Этот коммит содержится в:
родитель
9f1c699f36
Коммит
7fd7b7a8cc
@ -90,86 +90,84 @@ static int switchyard(orte_job_t *jdata)
|
||||
static int npernode(orte_job_t *jdata)
|
||||
{
|
||||
orte_app_context_t *app;
|
||||
int i, j, rc=ORTE_SUCCESS;
|
||||
int j, rc=ORTE_SUCCESS;
|
||||
opal_list_t node_list;
|
||||
opal_list_item_t *item;
|
||||
orte_std_cntr_t num_slots;
|
||||
orte_node_t *node;
|
||||
int total_procs=0, np, nprocs;
|
||||
int np, nprocs;
|
||||
int num_nodes;
|
||||
|
||||
/* setup the node list */
|
||||
OBJ_CONSTRUCT(&node_list, opal_list_t);
|
||||
total_procs = 0;
|
||||
|
||||
/* loop through the app_contexts */
|
||||
for(i=0; i < jdata->apps->size; i++) {
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, i))) {
|
||||
continue;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
num_nodes = opal_list_get_size(&node_list);
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
/* put the specified number of procs on each node */
|
||||
for (j=0; j < orte_rmaps_base.npernode && nprocs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.npernode-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
total_procs++;
|
||||
nprocs++;
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of nodes", num_nodes,
|
||||
"npernode", orte_rmaps_base.npernode);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
/* can only have one app_context here */
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, 0))) {
|
||||
ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND);
|
||||
return ORTE_ERR_NOT_FOUND;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
num_nodes = opal_list_get_size(&node_list);
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
/* put the specified number of procs on each node */
|
||||
for (j=0; j < orte_rmaps_base.npernode && nprocs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.npernode-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
nprocs++;
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of nodes", num_nodes,
|
||||
"npernode", orte_rmaps_base.npernode);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* update the number of procs in the job */
|
||||
jdata->num_procs += nprocs;
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
jdata->num_procs = total_procs;
|
||||
|
||||
error:
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
@ -182,89 +180,87 @@ error:
|
||||
static int nperboard(orte_job_t *jdata)
|
||||
{
|
||||
orte_app_context_t *app;
|
||||
int i, j, k, rc=ORTE_SUCCESS;
|
||||
int j, k, rc=ORTE_SUCCESS;
|
||||
opal_list_t node_list;
|
||||
opal_list_item_t *item;
|
||||
orte_std_cntr_t num_slots;
|
||||
orte_node_t *node;
|
||||
int total_procs=0, np, nprocs;
|
||||
int np, nprocs;
|
||||
int num_boards;
|
||||
|
||||
/* setup the node list */
|
||||
OBJ_CONSTRUCT(&node_list, opal_list_t);
|
||||
total_procs = 0;
|
||||
|
||||
/* loop through the app_contexts */
|
||||
for(i=0; i < jdata->apps->size; i++) {
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, i))) {
|
||||
continue;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
num_boards = node->boards;
|
||||
/* loop through the number of boards in this node */
|
||||
for (k=0; k < node->boards && nprocs < np; k++) {
|
||||
/* put the specified number of procs on each board */
|
||||
for (j=0; j < orte_rmaps_base.nperboard && nprocs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.nperboard-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
total_procs++;
|
||||
nprocs++;
|
||||
}
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of boards", num_boards,
|
||||
"nperboard", orte_rmaps_base.nperboard);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
/* can only have one app_context here */
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, 0))) {
|
||||
ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND);
|
||||
return ORTE_ERR_NOT_FOUND;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
num_boards = node->boards;
|
||||
/* loop through the number of boards in this node */
|
||||
for (k=0; k < node->boards && nprocs < np; k++) {
|
||||
/* put the specified number of procs on each board */
|
||||
for (j=0; j < orte_rmaps_base.nperboard && nprocs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.nperboard-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
nprocs++;
|
||||
}
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of boards", num_boards,
|
||||
"nperboard", orte_rmaps_base.nperboard);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* update the number of procs in the job */
|
||||
jdata->num_procs += nprocs;
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
jdata->num_procs = total_procs;
|
||||
|
||||
error:
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
@ -278,93 +274,91 @@ error:
|
||||
static int npersocket(orte_job_t *jdata)
|
||||
{
|
||||
orte_app_context_t *app;
|
||||
int i, j, k, n, rc=ORTE_SUCCESS;
|
||||
int j, k, n, rc=ORTE_SUCCESS;
|
||||
opal_list_t node_list;
|
||||
opal_list_item_t *item;
|
||||
orte_std_cntr_t num_slots;
|
||||
orte_node_t *node;
|
||||
int total_procs=0, np, nprocs;
|
||||
int np, nprocs;
|
||||
int num_sockets;
|
||||
|
||||
/* setup the node list */
|
||||
OBJ_CONSTRUCT(&node_list, opal_list_t);
|
||||
total_procs = 0;
|
||||
|
||||
/* loop through the app_contexts */
|
||||
for(i=0; i < jdata->apps->size; i++) {
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, i))) {
|
||||
continue;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
num_sockets = node->sockets_per_board;
|
||||
/* loop through the number of boards in this node */
|
||||
for (k=0; k < node->boards && nprocs < np; k++) {
|
||||
/* loop through the number of sockets/board */
|
||||
for (n=0; n < node->sockets_per_board && nprocs < np; n++) {
|
||||
/* put the specified number of procs on each socket */
|
||||
for (j=0; j < orte_rmaps_base.npersocket && total_procs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.npersocket-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
/* can only have one app_context here */
|
||||
if (NULL == (app = (orte_app_context_t*)opal_pointer_array_get_item(jdata->apps, 0))) {
|
||||
ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND);
|
||||
return ORTE_ERR_NOT_FOUND;
|
||||
}
|
||||
/* use the number of procs if one was given */
|
||||
if (0 < app->num_procs) {
|
||||
np = app->num_procs;
|
||||
} else {
|
||||
np = INT_MAX;
|
||||
}
|
||||
/* for each app_context, we have to get the list of nodes that it can
|
||||
* use since that can now be modified with a hostfile and/or -host
|
||||
* option
|
||||
*/
|
||||
if(ORTE_SUCCESS != (rc = orte_rmaps_base_get_target_nodes(&node_list, &num_slots, app,
|
||||
jdata->map->policy))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
goto error;
|
||||
}
|
||||
/* loop through the list of nodes */
|
||||
nprocs = 0;
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
node = (orte_node_t*)item;
|
||||
num_sockets = node->sockets_per_board;
|
||||
/* loop through the number of boards in this node */
|
||||
for (k=0; k < node->boards && nprocs < np; k++) {
|
||||
/* loop through the number of sockets/board */
|
||||
for (n=0; n < node->sockets_per_board && nprocs < np; n++) {
|
||||
/* put the specified number of procs on each socket */
|
||||
for (j=0; j < orte_rmaps_base.npersocket && nprocs < np; j++) {
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_claim_slot(jdata, node,
|
||||
jdata->map->cpus_per_rank, app->idx,
|
||||
&node_list, jdata->map->oversubscribe,
|
||||
false, NULL))) {
|
||||
/** if the code is ORTE_ERR_NODE_FULLY_USED, and we still have
|
||||
* more procs to place, then that is an error
|
||||
*/
|
||||
if (ORTE_ERR_NODE_FULLY_USED != rc ||
|
||||
j < orte_rmaps_base.npersocket-1) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
OBJ_RELEASE(node);
|
||||
goto error;
|
||||
}
|
||||
/* track the number of procs */
|
||||
total_procs++;
|
||||
nprocs++;
|
||||
}
|
||||
/* track the number of procs */
|
||||
nprocs++;
|
||||
}
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of sockets", num_sockets,
|
||||
"npersocket", orte_rmaps_base.npersocket);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
OBJ_RELEASE(node);
|
||||
}
|
||||
/* if the user requested a specific number of procs and
|
||||
* the total number of procs we were able to assign
|
||||
* doesn't equal the number requested, then we have a
|
||||
* problem
|
||||
*/
|
||||
if (0 < app->num_procs && nprocs < app->num_procs) {
|
||||
orte_show_help("help-orte-rmaps-base.txt", "rmaps:too-many-procs", true,
|
||||
app->app, app->num_procs,
|
||||
"number of sockets", num_sockets,
|
||||
"npersocket", orte_rmaps_base.npersocket);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* update the number of procs in the job */
|
||||
jdata->num_procs += nprocs;
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
*/
|
||||
if (ORTE_SUCCESS != (rc = orte_rmaps_base_compute_vpids(jdata))) {
|
||||
ORTE_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
jdata->num_procs = total_procs;
|
||||
|
||||
error:
|
||||
while (NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
@ -385,14 +379,13 @@ static int loadbalance(orte_job_t *jdata)
|
||||
int i, j;
|
||||
opal_list_t node_list;
|
||||
orte_std_cntr_t num_nodes, num_slots;
|
||||
int rc=ORTE_SUCCESS, total_procs, np, nprocs;
|
||||
int rc=ORTE_SUCCESS, np, nprocs;
|
||||
int ppn = 0;
|
||||
opal_list_item_t *item, *start;
|
||||
orte_node_t *node;
|
||||
|
||||
/* setup */
|
||||
OBJ_CONSTRUCT(&node_list, opal_list_t);
|
||||
total_procs = 0;
|
||||
|
||||
/* compute total #procs we are going to add and the total number of nodes available */
|
||||
for(i=0; i < jdata->apps->size; i++) {
|
||||
@ -438,7 +431,6 @@ static int loadbalance(orte_job_t *jdata)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
total_procs++;
|
||||
nprocs++;
|
||||
}
|
||||
/* move to next node */
|
||||
@ -469,7 +461,6 @@ static int loadbalance(orte_job_t *jdata)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
total_procs++;
|
||||
nprocs++;
|
||||
/* move to next node */
|
||||
if (opal_list_get_end(&node_list) == opal_list_get_next(item)) {
|
||||
@ -498,6 +489,8 @@ static int loadbalance(orte_job_t *jdata)
|
||||
"number of nodes", num_nodes);
|
||||
return ORTE_ERR_SILENT;
|
||||
}
|
||||
/* update the number of procs in the job */
|
||||
jdata->num_procs += nprocs;
|
||||
/* compute vpids and add proc objects to the job - this has to be
|
||||
* done after each app_context is mapped in order to keep the
|
||||
* vpids contiguous within an app_context
|
||||
@ -507,8 +500,6 @@ static int loadbalance(orte_job_t *jdata)
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
/* record the number of procs */
|
||||
jdata->num_procs = total_procs;
|
||||
|
||||
error:
|
||||
while(NULL != (item = opal_list_remove_first(&node_list))) {
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user