1
1

coll/libnbc: Implement MPI_STARTALL

Signed-off-by: KAWASHIMA Takahiro <t-kawashima@jp.fujitsu.com>
Этот коммит содержится в:
KAWASHIMA Takahiro 2018-02-20 09:52:25 +09:00
родитель ed0144bad4
Коммит 0b8b0f8393
3 изменённых файлов: 40 добавлений и 67 удалений

Просмотреть файл

@ -410,8 +410,6 @@ int ompi_coll_libnbc_neighbor_alltoallw_init(const void *sbuf, const int *scount
struct ompi_communicator_t *comm, MPI_Info info, ompi_request_t ** request,
struct mca_coll_base_module_2_2_0_t *module);
int ompi_coll_libnbc_start(size_t count, ompi_request_t ** request);
END_C_DECLS

Просмотреть файл

@ -29,6 +29,7 @@
#include "ompi_config.h"
#include "coll_libnbc.h"
#include "nbc_internal.h"
#include "mpi.h"
#include "ompi/mca/coll/coll.h"
@ -384,6 +385,44 @@ OBJ_CLASS_INSTANCE(ompi_coll_libnbc_module_t,
libnbc_module_destruct);
static int
request_start(size_t count, ompi_request_t ** requests)
{
int i, res;
NBC_DEBUG(5, " ** request_start **\n");
for (i = 0; i < count; i++) {
NBC_Handle *handle = (NBC_Handle *) requests[i];
NBC_Schedule *schedule = handle->schedule;
NBC_DEBUG(5, "--------------------------------\n");
NBC_DEBUG(5, "schedule %p size %u\n", &schedule, sizeof(schedule));
NBC_DEBUG(5, "handle %p size %u\n", &handle, sizeof(handle));
NBC_DEBUG(5, "data %p size %u\n", &schedule->data, sizeof(schedule->data));
NBC_DEBUG(5, "req_array %p size %u\n", &handle->req_array, sizeof(handle->req_array));
NBC_DEBUG(5, "row_offset=%u address=%p size=%u\n", handle->row_offset, &handle->row_offset, sizeof(handle->row_offset));
NBC_DEBUG(5, "req_count=%u address=%p size=%u\n", handle->req_count, &handle->req_count, sizeof(handle->req_count));
NBC_DEBUG(5, "tmpbuf address=%p size=%u\n", handle->tmpbuf, sizeof(handle->tmpbuf));
NBC_DEBUG(5, "--------------------------------\n");
handle->super.req_complete = REQUEST_PENDING;
handle->nbc_complete = false;
res = NBC_Start(handle);
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
NBC_DEBUG(5, " ** bad result from NBC_Start **\n");
return res;
}
}
NBC_DEBUG(5, " ** LEAVING request_start **\n");
return OMPI_SUCCESS;
}
static int
request_cancel(struct ompi_request_t *request, int complete)
{
@ -413,7 +452,7 @@ request_construct(ompi_coll_libnbc_request_t *request)
{
request->super.req_type = OMPI_REQUEST_COLL;
request->super.req_status._cancelled = 0;
request->super.req_start = ompi_coll_libnbc_start;
request->super.req_start = request_start;
request->super.req_free = request_free;
request->super.req_cancel = request_cancel;
}

Просмотреть файл

@ -761,67 +761,3 @@ void NBC_SchedCache_args_delete(void *entry) {
free(entry);
}
#endif
static int NBC_Start_internal(NBC_Handle *handle) {
/* kick off first round */
int res = NBC_Start_round(handle);
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
return res;
}
/*
* FIXME - The request may already be complete/inactive now
* if so, it should not be added to the active list
* Must add param to provide the status of request,
* because the user could have already freed it and
* it could already be in use by another operation!
*/
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
opal_list_append(&mca_coll_libnbc_component.active_requests, &(handle->super.super.super));
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
return OMPI_SUCCESS;
}
int ompi_coll_libnbc_start(size_t count, ompi_request_t ** request) {
NBC_DEBUG(5, " ** ompi_coll_libnbc_start **\n");
/* FIXME */
assert (1 == count);
NBC_Handle *handle;
NBC_Schedule *schedule;
int res;
handle = (NBC_Handle *) *request;
NBC_DEBUG(5, "--------------------------------\n");
NBC_DEBUG(5, "schedule %p size %u\n", &schedule, sizeof(schedule));
NBC_DEBUG(5, "handle %p size %u\n", &handle, sizeof(handle));
NBC_DEBUG(5, "data %p size %u\n", &schedule->data, sizeof(schedule->data));
NBC_DEBUG(5, "req_array %p size %u\n", &handle->req_array, sizeof(handle->req_array));
NBC_DEBUG(5, "row_offset=%u address=%p size=%u\n", handle->row_offset, &handle->row_offset, sizeof(handle->row_offset));
NBC_DEBUG(5, "req_count=%u address=%p size=%u\n", handle->req_count, &handle->req_count, sizeof(handle->req_count));
NBC_DEBUG(5, "tmpbuf address=%p size=%u\n", handle->tmpbuf, sizeof(handle->tmpbuf));
NBC_DEBUG(5, "--------------------------------\n");
handle->super.req_complete = REQUEST_PENDING;
handle->super.req_state = OMPI_REQUEST_ACTIVE;
handle->nbc_complete = false;
res = NBC_Start_internal(handle);
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
NBC_DEBUG(5, " ** bad result from NBC_Start_internal **\n");
NBC_Return_handle (handle);
return res;
}
NBC_DEBUG(5, " ** LEAVING ompi_coll_libnbc_start **\n");
return OMPI_SUCCESS;
}