Skip to content
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
11 changes: 11 additions & 0 deletions ompi/mpi/java/c/mpi_Intracomm.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -66,6 +68,15 @@ JNIEXPORT jlong JNICALL Java_mpi_Intracomm_split(
return (jlong)newcomm;
}

JNIEXPORT jlong JNICALL Java_mpi_Intracomm_splitType(
JNIEnv *env, jobject jthis, jlong comm, jint splitType, jint key, jlong info)
{
MPI_Comm newcomm;
int rc = MPI_Comm_split_type((MPI_Comm)comm, splitType, key, (MPI_Info)info, &newcomm);
ompi_java_exceptionCheck(env, rc);
return (jlong)newcomm;
}

JNIEXPORT jlong JNICALL Java_mpi_Intracomm_create(
JNIEnv *env, jobject jthis, jlong comm, jlong group)
{
Expand Down
38 changes: 38 additions & 0 deletions ompi/mpi/java/c/mpi_Win.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,32 @@ JNIEXPORT jlong JNICALL Java_mpi_Win_createWin(
return (jlong)win;
}

JNIEXPORT jlong JNICALL Java_mpi_Win_allocateWin(JNIEnv *env, jobject jthis,
jint size, jint dispUnit, jlong info, jlong comm, jobject jBase)
{
void *basePtr = (*env)->GetDirectBufferAddress(env, jBase);
MPI_Win win;

int rc = MPI_Win_allocate((MPI_Aint)size, dispUnit,
(MPI_Info)info, (MPI_Comm)comm, basePtr, &win);

ompi_java_exceptionCheck(env, rc);
return (jlong)win;
}

JNIEXPORT jlong JNICALL Java_mpi_Win_allocateSharedWin(JNIEnv *env, jobject jthis,
jint size, jint dispUnit, jlong info, jlong comm, jobject jBase)
{
void *basePtr = (*env)->GetDirectBufferAddress(env, jBase);
MPI_Win win;

int rc = MPI_Win_allocate_shared((MPI_Aint)size, dispUnit,
(MPI_Info)info, (MPI_Comm)comm, basePtr, &win);

ompi_java_exceptionCheck(env, rc);
return (jlong)win;
}

JNIEXPORT jlong JNICALL Java_mpi_Win_createDynamicWin(
JNIEnv *env, jobject jthis,
jlong info, jlong comm)
Expand Down Expand Up @@ -434,3 +460,15 @@ JNIEXPORT void JNICALL Java_mpi_Win_fetchAndOp(JNIEnv *env, jobject jthis, jlong
int rc = MPI_Fetch_and_op(orgPtr, resultPtr, dataType, targetRank, targetDisp, op, (MPI_Win)win);
ompi_java_exceptionCheck(env, rc);
}

JNIEXPORT void JNICALL Java_mpi_Win_flushLocal(JNIEnv *env, jobject jthis, jlong win, jint targetRank)
{
int rc = MPI_Win_flush_local(targetRank, (MPI_Win)win);
ompi_java_exceptionCheck(env, rc);
}

JNIEXPORT void JNICALL Java_mpi_Win_flushLocalAll(JNIEnv *env, jobject jthis, jlong win)
{
int rc = MPI_Win_flush_local_all((MPI_Win)win);
ompi_java_exceptionCheck(env, rc);
}
3 changes: 3 additions & 0 deletions ompi/mpi/java/java/Comm.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -65,6 +67,7 @@
*/
public class Comm implements Freeable
{
public final static int TYPE_SHARED = 0;
protected final static int SELF = 1;
protected final static int WORLD = 2;
protected long handle;
Expand Down
20 changes: 20 additions & 0 deletions ompi/mpi/java/java/Intracomm.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -139,6 +141,24 @@ public final Intracomm split(int colour, int key) throws MPIException

private native long split(long comm, int colour, int key) throws MPIException;

/**
* Partition the group associated with this communicator and create
* a new communicator within each subgroup.
* <p>Java binding of the MPI operation {@code MPI_COMM_SPLIT_TYPE}.
* @param splitType type of processes to be grouped together
* @param key control of rank assignment
* @param info info argument
* @return new communicator
* @throws MPIException
*/
public final Intracomm splitType(int splitType, int key, Info info) throws MPIException
{
MPI.check();
return new Intracomm(splitType(handle, splitType, key, info.handle));
}

private native long splitType(long comm, int colour, int key, long info) throws MPIException;

/**
* Create a new communicator.
* <p>Java binding of the MPI operation {@code MPI_COMM_CREATE}.
Expand Down
79 changes: 78 additions & 1 deletion ompi/mpi/java/java/Win.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
public final class Win implements Freeable
{
private long handle;
public static final int WIN_NULL = 0;
public static final int FLAVOR_PRIVATE = 0;
public static final int FLAVOR_SHARED = 1;

/**
* Java binding of {@code MPI_WIN_CREATE}.
Expand Down Expand Up @@ -69,6 +72,53 @@ private native long createWin(
Buffer base, int size, int dispUnit, long info, long comm)
throws MPIException;

/**
* Java binding of {@code MPI_WIN_ALLOCATE} and {@code MPI_WIN_ALLOCATE_SHARED}.
* @param size size of window (buffer elements)
* @param dispUnit local unit size for displacements (buffer elements)
* @param info info object
* @param comm communicator
* @param base initial address of window
* @param flavor FLAVOR_PRIVATE or FLAVOR_SHARED
* @throws MPIException
*/
public Win(int size, int dispUnit, Info info, Comm comm, Buffer base, int flavor)
throws MPIException
{
if(!base.isDirect())
throw new IllegalArgumentException("The buffer must be direct.");

int baseSize;

if(base instanceof ByteBuffer)
baseSize = 1;
else if(base instanceof CharBuffer || base instanceof ShortBuffer)
baseSize = 2;
else if(base instanceof IntBuffer || base instanceof FloatBuffer)
baseSize = 4;
else if(base instanceof LongBuffer || base instanceof DoubleBuffer)
baseSize = 8;
else
throw new AssertionError();

int sizeBytes = size * baseSize,
dispBytes = dispUnit * baseSize;

if(flavor == 0) {
handle = allocateWin(sizeBytes, dispBytes, info.handle, comm.handle, base);
} else if(flavor == 1) {
handle = allocateSharedWin(sizeBytes, dispBytes, info.handle, comm.handle, base);
}
}

private native long allocateWin(
int size, int dispUnit, long info, long comm, Buffer base)
throws MPIException;

private native long allocateSharedWin(
int size, int dispUnit, long info, long comm, Buffer base)
throws MPIException;

/**
* Java binding of {@code MPI_WIN_CREATE_DYNAMIC}.
* @param info info object
Expand Down Expand Up @@ -784,11 +834,38 @@ public void fetchAndOp(Buffer origin, Buffer resultAddr, Datatype dataType,
throw new IllegalArgumentException("The origin must be direct buffer.");

fetchAndOp(handle, origin, resultAddr, dataType.handle, targetRank,
targetDisp, op, op.handle, getBaseType(dataType, dataType)); //neccessary?
targetDisp, op, op.handle, getBaseType(dataType, dataType));
}

private native void fetchAndOp(
long win, Buffer origin, Buffer resultAddr, long targetType, int targetRank,
int targetDisp, Op jOp, long hOp, int baseType) throws MPIException;

/**
* Java binding of the MPI operation {@code MPI_WIN_FLUSH_LOCAL}.
* @param targetRank rank of target window
* @throws MPIException
*/

public void flushLocal(int targetRank) throws MPIException
{
MPI.check();
flushLocal(handle, targetRank);
}

private native void flushLocal(long win, int targetRank) throws MPIException;

/**
* Java binding of the MPI operation {@code MPI_WIN_FLUSH_LOCAL_ALL}.
* @throws MPIException
*/

public void flushLocalAll() throws MPIException
{
MPI.check();
flushLocalAll(handle);
}

private native void flushLocalAll(long win) throws MPIException;

} // Win