1
1

mpi.Prequest: improve start and startAll

This commit was SVN r30769.
Этот коммит содержится в:
Oscar Vega-Gisbert 2014-02-18 22:33:15 +00:00
родитель 49ee63f4b8
Коммит 04172e47c3
4 изменённых файлов: 64 добавлений и 65 удалений

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

@ -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