Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pthread gather/scatter/split support MkI #273

Merged
merged 1 commit into from
Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions include/quo-vadis-pthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@
extern "C" {
#endif

/**
* Mapping policies types.
*/
typedef enum qv_policy_s {
QV_POLICY_PACKED = 1,
QV_POLICY_COMPACT = 1,
QV_POLICY_CLOSE = 1,
QV_POLICY_SPREAD = 2,
QV_POLICY_DISTRIBUTE = 3,
QV_POLICY_ALTERNATE = 3,
QV_POLICY_CORESFIRST = 3,
QV_POLICY_SCATTER = 4,
QV_POLICY_CHOOSE = 5,
} qv_policy_t;

/**
* Similar to pthread_create(3).
*/
Expand Down Expand Up @@ -66,6 +81,16 @@ qv_pthread_scopes_free(
qv_scope_t **scopes
);

/**
* Fills color array used in qv_pthread_scope_split*.
*/
int
qv_pthread_colors_fill(
int *color_array,
int array_size,
qv_policy_t policy
);

#ifdef __cplusplus
}
#endif
Expand Down
14 changes: 12 additions & 2 deletions src/quo-vadis-pthread.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* -*- Mode: C++; c-basic-offset:4; indent-tabs-mode:nil -*- */
/*
/*qv_policy_t
* Copyright (c) 2022-2024 Triad National Security, LLC
* All rights reserved.
*
Expand Down Expand Up @@ -116,7 +116,7 @@ qv_pthread_create(
return ENOMEM;
}
return pthread_create(
thread, attr, qvi_pthread_group_s::call_first_from_pthread_create, cargs
thread, attr, qvi_pthread_group::call_first_from_pthread_create, cargs
);
}

Expand All @@ -135,6 +135,16 @@ qv_pthread_scopes_free(
qvi_catch_and_return();
}

int
qv_pthread_colors_fill(
int *,//color_array,
int, // array_size,
qv_policy_t //policy
){
//TODO(GM) implement
return QV_ERR_NOT_SUPPORTED;
}

/*
* vim: ft=cpp ts=4 sts=4 sw=4 expandtab
*/
1 change: 1 addition & 0 deletions src/quo-vadis.cc
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ qv_scope_split(
// We use the sentinel value QV_HW_OBJ_LAST to differentiate between
// calls from split() and split_at(). Since this call doesn't have a
// hardware type argument, we use QV_HW_OBJ_LAST as the hardware type.
// return
return scope->split(npieces, color, QV_HW_OBJ_LAST, subscope);
}
qvi_catch_and_return();
Expand Down
8 changes: 8 additions & 0 deletions src/qvi-bbuff.cc
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ qvi_bbuff_dup(
return qvi_dup(src, buff);
}

int
qvi_bbuff_copy(
const qvi_bbuff &src,
qvi_bbuff *buff
) {
return qvi_copy(src, buff);
}

void
qvi_bbuff_delete(
qvi_bbuff **buff
Expand Down
14 changes: 14 additions & 0 deletions src/qvi-bbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,25 @@ qvi_bbuff_dup(
qvi_bbuff **buff
);

int
qvi_bbuff_copy(
const qvi_bbuff &src,
qvi_bbuff *buff
);

void
qvi_bbuff_delete(
qvi_bbuff **buff
);

enum qvi_alloc_s {
ALLOC_SHARED = 0,
ALLOC_SHARED_GLOBAL,
ALLOC_PRIVATE,
};

typedef enum qvi_alloc_s qvi_alloc_type_t;

#endif

/*
Expand Down
1 change: 1 addition & 0 deletions src/qvi-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include <chrono>
#include <map>
#include <mutex>
#include <condition_variable>
#include <new>
#include <numeric>
#include <set>
Expand Down
3 changes: 2 additions & 1 deletion src/qvi-group-mpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "qvi-common.h"
#include "qvi-group.h"
#include "qvi-mpi.h"
#include "qvi-bbuff.h"

struct qvi_group_mpi : public qvi_group {
protected:
Expand Down Expand Up @@ -84,7 +85,7 @@ struct qvi_group_mpi : public qvi_group {
gather(
qvi_bbuff *txbuff,
int root,
bool *shared,
qvi_alloc_type_t *shared,
qvi_bbuff ***rxbuffs
) {
return qvi_mpi_group_gather_bbuffs(
Expand Down
3 changes: 2 additions & 1 deletion src/qvi-group-omp.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "qvi-common.h"
#include "qvi-group.h"
#include "qvi-omp.h"
#include "qvi-bbuff.h"

struct qvi_group_omp : public qvi_group {
private:
Expand Down Expand Up @@ -90,7 +91,7 @@ struct qvi_group_omp : public qvi_group {
gather(
qvi_bbuff *txbuff,
int root,
bool *shared,
qvi_alloc_type_t *shared,
qvi_bbuff ***rxbuffs
) {
return m_ompgroup->gather(txbuff, root, shared, rxbuffs);
Expand Down
3 changes: 2 additions & 1 deletion src/qvi-group-process.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "qvi-common.h"
#include "qvi-group.h"
#include "qvi-process.h"
#include "qvi-bbuff.h"

struct qvi_group_process : public qvi_group {
protected:
Expand Down Expand Up @@ -85,7 +86,7 @@ struct qvi_group_process : public qvi_group {
gather(
qvi_bbuff *txbuff,
int root,
bool *shared,
qvi_alloc_type_t *shared,
qvi_bbuff ***rxbuffs
) {
return qvi_process_group_gather_bbuffs(
Expand Down
21 changes: 15 additions & 6 deletions src/qvi-group-pthread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
qvi_group_pthread::qvi_group_pthread(
int group_size
) {
const int rc = qvi_new(&thgroup, group_size);
const int rc = qvi_new(&thgroup, group_size, 0);
if (qvi_unlikely(rc != QV_SUCCESS)) throw qvi_runtime_error();
}

Expand All @@ -36,12 +36,21 @@ qvi_group_pthread::self(

int
qvi_group_pthread::split(
int,
int,
qvi_group **
int color ,
int key,
qvi_group ** child
) {
// TODO(skg)
return QV_ERR_NOT_SUPPORTED;
qvi_group_pthread *ichild = nullptr;
int rc = qvi_new(&ichild);
if (qvi_unlikely(rc != QV_SUCCESS)) goto out;

rc = thgroup->split(color, key, &ichild->thgroup);
out:
if (qvi_unlikely(rc != QV_SUCCESS)) {
qvi_delete(&ichild);
}
*child = ichild;
return rc;
}

/*
Expand Down
5 changes: 3 additions & 2 deletions src/qvi-group-pthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@
#include "qvi-common.h"
#include "qvi-group.h"
#include "qvi-pthread.h"
#include "qvi-bbuff.h"

struct qvi_group_pthread : public qvi_group {
/** Underlying group instance. */
qvi_pthread_group_t *thgroup = nullptr;
/** Constructor. */
qvi_group_pthread(void) = delete;
qvi_group_pthread(void) = default;
/** Constructor. */
qvi_group_pthread(
int group_size
Expand Down Expand Up @@ -87,7 +88,7 @@ struct qvi_group_pthread : public qvi_group {
gather(
qvi_bbuff *txbuff,
int root,
bool *shared,
qvi_alloc_type_t *shared,
qvi_bbuff ***rxbuffs
) {
return thgroup->gather(
Expand Down
3 changes: 2 additions & 1 deletion src/qvi-group.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include "qvi-common.h"
#include "qvi-utils.h"
#include "qvi-bbuff.h"

/** Group ID type. */
using qvi_group_id_t = uint64_t;
Expand Down Expand Up @@ -82,7 +83,7 @@ struct qvi_group : qvi_refc {
gather(
qvi_bbuff *txbuff,
int root,
bool *shared,
qvi_alloc_type_t *shared,
qvi_bbuff ***rxbuffs
) = 0;
/** Scatters bbuffs from specified root. */
Expand Down
16 changes: 10 additions & 6 deletions src/qvi-hwsplit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,9 @@ qvi_hwsplit_coll::scatter_values(
}

rc = group->scatter(txbuffs.data(), rootid, &rxbuff);
if (qvi_unlikely(rc != QV_SUCCESS)) goto out;
if (qvi_unlikely(rc != QV_SUCCESS)) {
goto out;
}

*value = *(TYPE *)rxbuff->data();
out:
Expand Down Expand Up @@ -692,7 +694,7 @@ qvi_hwsplit_coll::gather_values(
return rc;
}
// Gather the values to the root.
bool shared = false;
qvi_alloc_type_t shared = ALLOC_PRIVATE;
qvi_bbuff **bbuffs = nullptr;
rc = group->gather(txbuff, rootid, &shared, &bbuffs);
if (qvi_unlikely(rc != QV_SUCCESS)) goto out;
Expand All @@ -705,14 +707,15 @@ qvi_hwsplit_coll::gather_values(
}
}
out:
if (!shared || (shared && (group->rank() == rootid))) {
if ((ALLOC_PRIVATE == shared) || ((ALLOC_SHARED == shared) && (group->rank() == rootid))) {
if (bbuffs) {
for (uint_t i = 0; i < group_size; ++i) {
for (uint_t i = 0; i < group_size; ++i) {
qvi_bbuff_delete(&bbuffs[i]);
}
delete[] bbuffs;
}
}

qvi_bbuff_delete(&txbuff);
if (qvi_unlikely(rc != QV_SUCCESS)) {
// If something went wrong, just zero-initialize the values.
Expand All @@ -733,7 +736,7 @@ qvi_hwsplit_coll::gather_hwpools(
int rc = txpool->packinto(&txbuff);
if (qvi_unlikely(rc != QV_SUCCESS)) return rc;
// Gather the values to the root.
bool shared = false;
qvi_alloc_type_t shared = ALLOC_PRIVATE;
qvi_bbuff **bbuffs = nullptr;
rc = group->gather(&txbuff, rootid, &shared, &bbuffs);
if (rc != QV_SUCCESS) goto out;
Expand All @@ -749,14 +752,15 @@ qvi_hwsplit_coll::gather_hwpools(
}
}
out:
if (!shared || (shared && (group->rank() == rootid))) {
if ((ALLOC_PRIVATE == shared) || ((ALLOC_SHARED == shared) && (group->rank() == rootid))) {
if (bbuffs) {
for (uint_t i = 0; i < group_size; ++i) {
qvi_bbuff_delete(&bbuffs[i]);
}
delete[] bbuffs;
}
}

if (rc != QV_SUCCESS) {
// If something went wrong, just zero-initialize the pools.
rxpools = {};
Expand Down
4 changes: 2 additions & 2 deletions src/qvi-mpi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ qvi_mpi_group_gather_bbuffs(
qvi_mpi_group_t *group,
qvi_bbuff *txbuff,
int root,
bool *shared_alloc,
qvi_alloc_type_t *shared_alloc,
qvi_bbuff ***rxbuffs
) {
const int send_count = (int)txbuff->size();
Expand Down Expand Up @@ -434,7 +434,7 @@ qvi_mpi_group_gather_bbuffs(
bbuffs = nullptr;
}
*rxbuffs = bbuffs;
*shared_alloc = false;
*shared_alloc = ALLOC_PRIVATE;
return rc;
}

Expand Down
3 changes: 2 additions & 1 deletion src/qvi-mpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "qvi-common.h"
#include "qvi-group.h"
#include "quo-vadis-mpi.h" // IWYU pragma: keep
#include "qvi-bbuff.h"

// Forward declarations.
struct qvi_mpi_s;
Expand Down Expand Up @@ -151,7 +152,7 @@ qvi_mpi_group_gather_bbuffs(
qvi_mpi_group_t *group,
qvi_bbuff *txbuff,
int root,
bool *shared_alloc,
qvi_alloc_type_t *shared_alloc,
qvi_bbuff ***rxbuffs
);

Expand Down
Loading
Loading