Skip to content
Open
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
6 changes: 0 additions & 6 deletions quest/include/environment.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,6 @@ void initQuESTEnv();
*/
void initCustomQuESTEnv(int useDistrib, int useGpuAccel, int useMultithread);

/** @notyetdoced
* Advanced initialiser which lets the user positively declare that they take responsibility for MPI.
* This means we assume they have called MPI_Init, and that they will call MPI_Finalize.
*/
void initCustomMpiQuESTEnv(int useDistrib, bool userOwnsMpi, int useGpuAccel, int useMultithread);

/// @notyetdoced
void finalizeQuESTEnv();

Expand Down
75 changes: 75 additions & 0 deletions quest/include/experimental.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/** @file
* Experimental functions which are liable to
* API breaks within QuEST minor version releases.
* Some optional functions require compiling this
* file against MPI, despite being outside of /comm/,
* and so require opt-in macros (QUEST_COMPILE_SUBCOMM)
*
* @author Oliver Brown
* @author Tyson Jones (formatting)
*
* @defgroup experimental Experimental
* @ingroup api
* @brief Experimental functions with tentative APIs
* @{
*/

#ifndef EXPERIMENTAL_H
#define EXPERIMENTAL_H

#include "quest/include/config.h"

#if QUEST_COMPILE_SUBCOMM && ! QUEST_COMPILE_MPI
#error "Macro QUEST_COMPILE_SUBCOMM was true, but QUEST_COMPILE_MPI was illegally false."
#endif

#if QUEST_COMPILE_SUBCOMM
#include <mpi.h>
#endif

// enable invocation by both C and C++ binaries
#ifdef __cplusplus
extern "C" {
#endif


/** @notyetdoced
*
* Advanced initialiser which lets the user positively declare that they take responsibility for MPI.
* This means we assume they have called MPI_Init, and that they will call MPI_Finalize.
*
* @author Oliver Brown
*/
void initCustomMpiQuESTEnv(int useDistrib, bool userOwnsMpi, int useGpuAccel, int useMultithread);


#if QUEST_COMPILE_SUBCOMM

/** @notyetdoced
*
* Advanced initialiser which allows the user to provide an MPI communicator for QuEST to use.
* Use of this initialiser implies userOwnsMpi = true, (exposed by initCustomMpiQuESTEnv) and
* therefore that they have already initialised MPI, and they will call MPI_Finalize at the
* appropriate time.
*
* The user-provided MPI communicator undergoes the same validation procedure as any that QuEST
* would use, and so must contain a power-of-2 number of processes.
*
* This function is only compiled and exposed when macro QUEST_COMPILE_SUBCOMM is 1, as is
* defined when providing CMake option QUEST_ENABLE_SUBCOMM during building.
*
* @author Oliver Brown
*/
void initCustomMpiCommQuESTEnv(MPI_Comm questComm, int useGpuAccel, int useMultithread);

#endif // QUEST_COMPILE_SUBCOMM


// end de-mangler
#ifdef __cplusplus
}
#endif

#endif // EXPERIMENTAL_H

/** @} */ // (end file-wide doxygen defgroup)
2 changes: 1 addition & 1 deletion quest/include/quest.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@
#include "quest/include/debug.h"
#include "quest/include/decoherence.h"
#include "quest/include/environment.h"
#include "quest/include/experimental.h"
#include "quest/include/trotterisation.h"
#include "quest/include/initialisations.h"
#include "quest/include/channels.h"
#include "quest/include/multiplication.h"
#include "quest/include/operations.h"
#include "quest/include/paulis.h"
#include "quest/include/qureg.h"
#include "quest/include/subcommunicator.h"
#include "quest/include/matrices.h"
#include "quest/include/wrappers.h"

Expand Down
31 changes: 0 additions & 31 deletions quest/include/subcommunicator.h

This file was deleted.

2 changes: 1 addition & 1 deletion quest/src/api/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ target_sources(QuEST
debug.cpp
decoherence.cpp
environment.cpp
experimental.cpp
initialisations.cpp
matrices.cpp
modes.cpp
multiplication.cpp
operations.cpp
paulis.cpp
qureg.cpp
subcommunicator.cpp
trotterisation.cpp
types.cpp
)
2 changes: 1 addition & 1 deletion quest/src/api/channels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ void freeAllMemoryIfAnyAllocsFailed(T& obj) {

// determine whether any node experienced a failure
bool anyFail = didAnyLocalAllocsFail(obj);
if (comm_isInit())
if (comm_isActive())
anyFail = comm_isTrueOnAllNodes(anyFail);

// if so, free all memory before subsequent validation
Expand Down
6 changes: 1 addition & 5 deletions quest/src/api/environment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,10 +412,6 @@ void initCustomQuESTEnv(int useDistrib, int useGpuAccel, int useMultithread) {
}


void initCustomMpiQuESTEnv(int useDistrib, bool userOwnsMpi, int useGpuAccel, int useMultithread) {
validateAndInitCustomQuESTEnv(useDistrib, userOwnsMpi, useGpuAccel, useMultithread, __func__);
}

void initQuESTEnv() {

const bool userOwnsMpi = false;
Expand Down Expand Up @@ -452,7 +448,7 @@ void finalizeQuESTEnv() {

if (global_envPtr->isDistributed) {
comm_sync();
comm_end(global_envPtr->isMpiUserOwned);
comm_end();
}

// free global env's heap memory and flag it as unallocated
Expand Down
89 changes: 89 additions & 0 deletions quest/src/api/experimental.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/** @file
* Experimental functions which are liable to
* API breaks within QuEST minor version releases.
* Some optional functions require compiling this
* file against MPI, despite being outside of /comm/,
* and so require opt-in macros (QUEST_COMPILE_SUBCOMM)
*
* @author Oliver Brown
*/

#include "quest/include/config.h"
#include "quest/include/environment.h"

#include "quest/src/core/validation.hpp"
#include "quest/src/comm/comm_config.hpp"

#if QUEST_COMPILE_SUBCOMM && ! QUEST_COMPILE_MPI
#error "Macro QUEST_COMPILE_SUBCOMM was true, but QUEST_COMPILE_MPI was illegally false."
#endif

#if QUEST_COMPILE_SUBCOMM
#include <mpi.h>
#endif



/*
* EXTERNAL FUNCTIONS
*
* which we here regretfully 'extern' because we are either
* unsure which header should expose them, or because they
* contain deployment-specific types (like MPI_Comm) which
* we do not wish to expose within internal headers
*/


extern void validateAndInitCustomQuESTEnv(
int useDistrib, bool userOwnsMpi, int useGpuAccel, int useMultithread, const char* caller);


#if QUEST_COMPILE_SUBCOMM // hide MPI_Comm
extern bool comm_setMpiComm(MPI_Comm newComm, bool userOwnsMpi);
#endif



/*
* API FUNCTIONS
*/


// enable invocation by both C and C++ binaries
extern "C" {


void initCustomMpiQuESTEnv(int useDistrib, bool userOwnsMpi, int useGpuAccel, int useMultithread) {
validateAndInitCustomQuESTEnv(useDistrib, userOwnsMpi, useGpuAccel, useMultithread, __func__);
}


#if QUEST_COMPILE_SUBCOMM // hide MPI_Comm

void initCustomMpiCommQuESTEnv(MPI_Comm userQuestComm, int useGpuAccel, int useMultithread) {

// useDistrib and userOwnsMpi are implied by the user of this initialiser
const int useDistrib = 1;
const bool userOwnsMpi = true;

// pre-validate that we are able to set the MPI communicator
validate_mpiInitStatus(useDistrib, userOwnsMpi, __func__);
validate_mpiSubCommIsNonNull(userQuestComm != MPI_COMM_NULL, __func__);

// avoid re-setting the MPI comm (to avoid an internal error), which happens
// if a user illegally re-calls this function, which will be subsequently
// caught by the validation in validateAndInitCustomQuESTEnv() below
if (!comm_isActive()) {
bool success = comm_setMpiComm(userQuestComm, userOwnsMpi);
validate_mpiSubCommSetSucceeded(success, __func__);
}

// perform remaining validation (some is harmlessly repeated) and init QuEST env
validateAndInitCustomQuESTEnv(useDistrib, userOwnsMpi, useGpuAccel, useMultithread, __func__);
}

#endif // QUEST_COMPILE_SUBCOMM


// end de-mangler
}
2 changes: 1 addition & 1 deletion quest/src/api/matrices.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ void freeAllMemoryIfAnyAllocsFailed(T matr) {

// ascertain whether any allocs failed on any node
bool anyFail = didAnyLocalAllocsFail(matr);
if (comm_isInit())
if (comm_isActive())
anyFail = comm_isTrueOnAllNodes(anyFail);

// if so, free all heap fields
Expand Down
2 changes: 1 addition & 1 deletion quest/src/api/paulis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ bool didAnyAllocsFailOnAnyNode(PauliStrSum sum) {
! mem_isAllocated(sum.coeffs) ||
! mem_isAllocated(sum.isApproxHermitian) );

if (comm_isInit())
if (comm_isActive())
anyFail = comm_isTrueOnAllNodes(anyFail);

return anyFail;
Expand Down
2 changes: 1 addition & 1 deletion quest/src/api/qureg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ bool didAnyLocalAllocsFail(Qureg qureg) {
bool didAnyAllocsFailOnAnyNode(Qureg qureg) {

bool anyFail = didAnyLocalAllocsFail(qureg);
if (comm_isInit())
if (comm_isActive())
anyFail = comm_isTrueOnAllNodes(anyFail);

return anyFail;
Expand Down
49 changes: 0 additions & 49 deletions quest/src/api/subcommunicator.cpp

This file was deleted.

Loading