1
1
openmpi/ompi/mca/bcol/iboffload/bcol_iboffload_task.c
Pavel Shamis b89f8fabc9 Adding Hierarchical Collectives project to the Open MPI trunk.
The project includes following components and frameworks: 
- ML Collective component
- NETPATTERNS and COMMPATTERNS common components
- BCOL framework
- SBGP framework

Note: By default the ML collective component is disabled. In order to enable
new collectives user should bump up the priority of ml component (coll_ml_priority)

=============================================

Primary Contributors (in alphabetical order):

Ishai Rabinovich (Mellanox)
Joshua S. Ladd (ORNL / Mellanox)
Manjunath Gorentla Venkata (ORNL)
Mike Dubman (Mellanox)
Noam Bloch (Mellanox)
Pavel (Pasha) Shamis (ORNL / Mellanox)
Richard Graham (ORNL / Mellanox)
Vasily Filipov (Mellanox)

This commit was SVN r27078.
2012-08-16 19:11:35 +00:00

82 строки
2.1 KiB
C

/*
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include "bcol_iboffload.h"
#include "bcol_iboffload_frag.h"
#include "bcol_iboffload_task.h"
static void task_constructor(mca_bcol_iboffload_task_t *task)
{
task->frag = NULL;
task->collfrag = NULL;
task->endpoint = NULL;
task->next_task = NULL;
task->sg_entries = NULL;
task->sg_entries_num = 0;
task->task_list = NULL;
memset(&task->wr, 0, sizeof(task->wr));
memset(&task->element, 0, sizeof(struct mqe_task));
memset(&task->task_mqe_qp_entry, 0, sizeof(struct mqe_qp_entry));
}
static void task_destructor(mca_bcol_iboffload_task_t *task)
{
if (NULL != task->sg_entries) {
free(task->sg_entries);
}
}
OBJ_CLASS_INSTANCE(
mca_bcol_iboffload_task_t,
ompi_free_list_item_t,
task_constructor,
task_destructor);
void
mca_bcol_iboffload_calc_task_init(ompi_free_list_item_t* item, void* ctx)
{
mca_bcol_iboffload_task_t *calc_task =
(mca_bcol_iboffload_task_t *) item;
calc_task->task_list = (ompi_free_list_t *) ctx;
calc_task->sg_entries_num = 2;
calc_task->sg_entries = (struct ibv_sge *) malloc (2 * sizeof(struct ibv_sge));
}
void
mca_bcol_iboffload_iovec_task_init(ompi_free_list_item_t* item, void* ctx)
{
mca_bcol_iboffload_task_t *iovec_task =
(mca_bcol_iboffload_task_t *) item;
mca_bcol_iboffload_module_t *iboffload_module =
(mca_bcol_iboffload_module_t *) ctx;
int nitems, group_size = iboffload_module->group_size;
nitems = group_size / 2 + group_size % 2;
if (nitems > iboffload_module->device->ib_dev_attr.max_sge) {
nitems = iboffload_module->device->ib_dev_attr.max_sge;
}
iovec_task->sg_entries_num = nitems;
iovec_task->task_list = &iboffload_module->iovec_tasks_free;
iovec_task->sg_entries = (struct ibv_sge *)
malloc(nitems * sizeof(struct ibv_sge));
}