mpi.Prequest: improve start and startAll
This commit was SVN r30769.
Этот коммит содержится в:
родитель
49ee63f4b8
Коммит
04172e47c3
@ -98,6 +98,11 @@ void ompi_java_releaseBooleanArray(
|
||||
void ompi_java_forgetBooleanArray(
|
||||
JNIEnv *env, jbooleanArray array, jboolean *jptr, int *cptr);
|
||||
|
||||
void ompi_java_getPtrArray(
|
||||
JNIEnv *env, jlongArray array, jlong **jptr, void ***cptr);
|
||||
void ompi_java_releasePtrArray(
|
||||
JNIEnv *env, jlongArray array, jlong *jptr, void **cptr);
|
||||
|
||||
jboolean ompi_java_exceptionCheck(JNIEnv *env, int rc);
|
||||
|
||||
void* ompi_java_attrSet(JNIEnv *env, jbyteArray jval);
|
||||
|
@ -509,6 +509,41 @@ void ompi_java_forgetBooleanArray(JNIEnv *env, jbooleanArray array,
|
||||
(*env)->ReleaseBooleanArrayElements(env, array, jptr, JNI_ABORT);
|
||||
}
|
||||
|
||||
void ompi_java_getPtrArray(JNIEnv *env, jlongArray array,
|
||||
jlong **jptr, void ***cptr)
|
||||
{
|
||||
jlong *jp = *jptr = (*env)->GetLongArrayElements(env, array, NULL);
|
||||
|
||||
if(sizeof(jlong) == sizeof(void*))
|
||||
{
|
||||
*cptr = (void**)jp;
|
||||
}
|
||||
else
|
||||
{
|
||||
int i, length = (*env)->GetArrayLength(env, array);
|
||||
void **cp = *cptr = calloc(length, sizeof(void*));
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
cp[i] = (void*)jp[i];
|
||||
}
|
||||
}
|
||||
|
||||
void ompi_java_releasePtrArray(JNIEnv *env, jlongArray array,
|
||||
jlong *jptr, void **cptr)
|
||||
{
|
||||
if(jptr != (jlong*)cptr)
|
||||
{
|
||||
int i, length = (*env)->GetArrayLength(env, array);
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
jptr[i] = (jlong)cptr[i];
|
||||
|
||||
free(cptr);
|
||||
}
|
||||
|
||||
(*env)->ReleaseLongArrayElements(env, array, jptr, 0);
|
||||
}
|
||||
|
||||
jboolean ompi_java_exceptionCheck(JNIEnv *env, int rc)
|
||||
{
|
||||
if(MPI_SUCCESS == rc)
|
||||
|
@ -9,51 +9,23 @@
|
||||
#include "mpi_Prequest.h"
|
||||
#include "mpiJava.h"
|
||||
|
||||
/*
|
||||
* Class: mpi_Prequest
|
||||
* Method: start_jni
|
||||
* Signature: (J)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_mpi_Prequest_start_1jni(JNIEnv *env, jobject jthis)
|
||||
JNIEXPORT jlong JNICALL Java_mpi_Prequest_start(
|
||||
JNIEnv *env, jobject jthis, jlong jRequest)
|
||||
{
|
||||
MPI_Request request = (MPI_Request)(*env)->GetLongField(
|
||||
env, jthis, ompi_java.ReqHandle);
|
||||
|
||||
MPI_Request request = (MPI_Request)jRequest;
|
||||
int rc = MPI_Start(&request);
|
||||
ompi_java_exceptionCheck(env, rc);
|
||||
(*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)request);
|
||||
return (jlong)request;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: mpi_Prequest
|
||||
* Method: startAll_jni
|
||||
* Signature: ([Lmpi/Prequest;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_mpi_Prequest_startAll_1jni(
|
||||
JNIEnv *env, jclass clazz, jobjectArray prequests)
|
||||
JNIEXPORT void JNICALL Java_mpi_Prequest_startAll(
|
||||
JNIEnv *env, jclass clazz, jlongArray prequests)
|
||||
{
|
||||
int i, count = (*env)->GetArrayLength(env, prequests);
|
||||
MPI_Request *requests = calloc(count, sizeof(MPI_Request));
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
jobject r = (*env)->GetObjectArrayElement(env, prequests, i);
|
||||
|
||||
requests[i] = (MPI_Request)(*env)->GetLongField(
|
||||
env, r, ompi_java.ReqHandle);
|
||||
|
||||
(*env)->DeleteLocalRef(env, r);
|
||||
}
|
||||
|
||||
int rc = MPI_Startall(count, requests);
|
||||
int count = (*env)->GetArrayLength(env, prequests);
|
||||
jlong* jReq;
|
||||
MPI_Request *cReq;
|
||||
ompi_java_getPtrArray(env, prequests, &jReq, (void***)&cReq);
|
||||
int rc = MPI_Startall(count, cReq);
|
||||
ompi_java_exceptionCheck(env, rc);
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
jobject r = (*env)->GetObjectArrayElement(env, prequests, i);
|
||||
(*env)->SetLongField(env, r, ompi_java.ReqHandle, (long)requests[i]);
|
||||
(*env)->DeleteLocalRef(env, r);
|
||||
}
|
||||
|
||||
free(requests);
|
||||
ompi_java_releasePtrArray(env, prequests, jReq, (void**)cReq);
|
||||
}
|
||||
|
@ -28,16 +28,6 @@ package mpi;
|
||||
*/
|
||||
public final class Prequest extends Request
|
||||
{
|
||||
protected final static int MODE_STANDARD = 0;
|
||||
protected final static int MODE_BUFFERED = 1;
|
||||
protected final static int MODE_SYNCHRONOUS = 2;
|
||||
protected final static int MODE_READY = 3;
|
||||
|
||||
private int mode, offset, count, src, dest, tag;
|
||||
private Object buf;
|
||||
private Datatype type;
|
||||
private Comm comm;
|
||||
|
||||
/**
|
||||
* Constructor used by {@code sendInit}, etc.
|
||||
*/
|
||||
@ -56,10 +46,10 @@ protected Prequest(long handle)
|
||||
*/
|
||||
public void start() throws MPIException
|
||||
{
|
||||
start_jni();
|
||||
handle = start(handle);
|
||||
}
|
||||
|
||||
private native void start_jni() throws MPIException;
|
||||
private native long start(long request) throws MPIException;
|
||||
|
||||
/**
|
||||
* Activate a list of communication requests.
|
||||
@ -70,20 +60,17 @@ private native void start_jni() throws MPIException;
|
||||
public static void startAll(Prequest[] requests) throws MPIException
|
||||
{
|
||||
MPI.check();
|
||||
startAll_jni(requests);
|
||||
long[] r = new long[requests.length];
|
||||
|
||||
for(int i = 0; i < r.length; i++)
|
||||
r[i] = requests[i].handle;
|
||||
|
||||
startAll(r);
|
||||
|
||||
for(int i = 0; i < r.length; i++)
|
||||
requests[i].handle = r[i];
|
||||
}
|
||||
|
||||
private native static void startAll_jni(Prequest[] requests)
|
||||
throws MPIException;
|
||||
|
||||
/**
|
||||
* Set the request object to be void.
|
||||
* Java binding of the MPI operation {@code MPI_REQUEST_FREE}.
|
||||
*/
|
||||
@Override public void free() throws MPIException
|
||||
{
|
||||
buf = null;
|
||||
super.free();
|
||||
}
|
||||
private native static void startAll(long[] requests) throws MPIException;
|
||||
|
||||
} // Prequest
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user