17
17
* Copyright (c) 2015 Research Organization for Information Science
18
18
* and Technology (RIST). All rights reserved.
19
19
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
20
+ * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
20
21
* $COPYRIGHT$
21
22
*
22
23
* Additional copyrights may follow
@@ -672,6 +673,39 @@ static void* getReadPtrvRank(
672
673
return ptr ;
673
674
}
674
675
676
+ static void * getReadPtrwRank (
677
+ ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
678
+ int * offsets , int * counts , int * displs , int size ,
679
+ int rank , MPI_Datatype * types , int * baseTypes )
680
+ {
681
+ int extent = getTypeExtent (env , types [rank ]),
682
+ length = getCountv (counts , displs , size );
683
+ void * ptr = getBuffer (env , item , length );
684
+ int rootOff = offsets [rank ] + displs [rank ];
685
+
686
+ if (opal_datatype_is_contiguous_memory_layout (& types [rank ]-> super , counts [rank ]))
687
+ {
688
+ int rootLength = extent * counts [rank ];
689
+ void * rootPtr = (char * )ptr + displs [rank ];
690
+ getArrayRegion (env , buf , baseTypes [rank ], rootOff , rootLength , rootPtr );
691
+ }
692
+ else
693
+ {
694
+ void * inBuf , * inBase ;
695
+ inBuf = ompi_java_getArrayCritical (& inBase , env , buf , rootOff );
696
+
697
+ int rc = opal_datatype_copy_content_same_ddt (
698
+ & types [rank ]-> super , counts [rank ], ptr , inBuf );
699
+
700
+ ompi_java_exceptionCheck (env ,
701
+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
702
+
703
+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , inBase , JNI_ABORT );
704
+ }
705
+
706
+ return ptr ;
707
+ }
708
+
675
709
static void * getReadPtrvAll (
676
710
ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
677
711
int offset , int * counts , int * displs , int size ,
@@ -716,6 +750,49 @@ static void* getReadPtrvAll(
716
750
return ptr ;
717
751
}
718
752
753
+ static void * getReadPtrwAll (
754
+ ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
755
+ int * offsets , int * counts , int * displs , int size ,
756
+ MPI_Datatype * types , int * baseTypes )
757
+ {
758
+
759
+ int length = getCountv (counts , displs , size );
760
+ void * ptr = getBuffer (env , item , length );
761
+
762
+ for (int i = 0 ; i < size ; i ++ )
763
+ {
764
+ int extent = getTypeExtent (env , types [i ]);
765
+
766
+ if (opal_datatype_is_contiguous_memory_layout (& types [i ]-> super , 2 ))
767
+ {
768
+ int iOff = offsets [i ] + displs [i ],
769
+ iLen = extent * counts [i ];
770
+ void * iPtr = (char * )ptr + displs [i ];
771
+ getArrayRegion (env , buf , baseTypes [i ], iOff , iLen , iPtr );
772
+ }
773
+ else
774
+ {
775
+ void * bufPtr , * bufBase ;
776
+ bufPtr = ompi_java_getArrayCritical (& bufBase , env , buf , offsets [i ]);
777
+
778
+ int iOff = displs [i ];
779
+ char * iBuf = iOff + (char * )bufPtr ,
780
+ * iPtr = iOff + (char * )ptr ;
781
+
782
+ int rc = opal_datatype_copy_content_same_ddt (
783
+ & types [i ]-> super , counts [i ], iPtr , iBuf );
784
+
785
+ ompi_java_exceptionCheck (env ,
786
+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
787
+
788
+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , bufBase , JNI_ABORT );
789
+ }
790
+
791
+ }
792
+
793
+ return ptr ;
794
+ }
795
+
719
796
static void * getWritePtr (ompi_java_buffer_t * * item , JNIEnv * env ,
720
797
int count , MPI_Datatype type )
721
798
{
@@ -735,6 +812,14 @@ static void* getWritePtrv(ompi_java_buffer_t **item, JNIEnv *env,
735
812
return getBuffer (env , item , length );
736
813
}
737
814
815
+ static void * getWritePtrw (ompi_java_buffer_t * * item , JNIEnv * env ,
816
+ int * counts , int * displs , int size , MPI_Datatype * types )
817
+ {
818
+ int length = getCountv (counts , displs , size );
819
+
820
+ return getBuffer (env , item , length );
821
+ }
822
+
738
823
void ompi_java_getReadPtr (
739
824
void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
740
825
jboolean db , int offset , int count , MPI_Datatype type , int baseType )
@@ -810,6 +895,39 @@ void ompi_java_getReadPtrv(
810
895
}
811
896
}
812
897
898
+ void ompi_java_getReadPtrw (
899
+ void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env ,
900
+ jobject buf , jboolean db , int * offsets , int * counts , int * displs ,
901
+ int size , int rank , MPI_Datatype * types , int * baseTypes )
902
+ {
903
+ int i ;
904
+
905
+ if (buf == NULL )
906
+ {
907
+ /* Allow NULL buffers to send/recv 0 items as control messages. */
908
+ * ptr = NULL ;
909
+ * item = NULL ;
910
+ }
911
+ else if (db )
912
+ {
913
+ for (i = 0 ; i < size ; i ++ ){
914
+ assert (offsets [i ] == 0 );
915
+ }
916
+ * ptr = (* env )-> GetDirectBufferAddress (env , buf );
917
+ * item = NULL ;
918
+ }
919
+ else if (rank == -1 )
920
+ {
921
+ * ptr = getReadPtrwAll (item , env , buf , offsets , counts ,
922
+ displs , size , types , baseTypes );
923
+ }
924
+ else
925
+ {
926
+ * ptr = getReadPtrwRank (item , env , buf , offsets , counts ,
927
+ displs , size , rank , types , baseTypes );
928
+ }
929
+ }
930
+
813
931
void ompi_java_releaseReadPtr (
814
932
void * ptr , ompi_java_buffer_t * item , jobject buf , jboolean db )
815
933
{
@@ -859,6 +977,27 @@ void ompi_java_getWritePtrv(
859
977
}
860
978
}
861
979
980
+ void ompi_java_getWritePtrw (
981
+ void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
982
+ jboolean db , int * counts , int * displs , int size , MPI_Datatype * types )
983
+ {
984
+ if (buf == NULL )
985
+ {
986
+ /* Allow NULL buffers to send/recv 0 items as control messages. */
987
+ * ptr = NULL ;
988
+ * item = NULL ;
989
+ }
990
+ else if (db )
991
+ {
992
+ * ptr = (* env )-> GetDirectBufferAddress (env , buf );
993
+ * item = NULL ;
994
+ }
995
+ else
996
+ {
997
+ * ptr = getWritePtrw (item , env , counts , displs , size , types );
998
+ }
999
+ }
1000
+
862
1001
void ompi_java_releaseWritePtr (
863
1002
void * ptr , ompi_java_buffer_t * item , JNIEnv * env , jobject buf ,
864
1003
jboolean db , int offset , int count , MPI_Datatype type , int baseType )
@@ -933,6 +1072,49 @@ void ompi_java_releaseWritePtrv(
933
1072
releaseBuffer (ptr , item );
934
1073
}
935
1074
1075
+ void ompi_java_releaseWritePtrw (
1076
+ void * ptr , ompi_java_buffer_t * item , JNIEnv * env ,
1077
+ jobject buf , jboolean db , int * offsets , int * counts , int * displs ,
1078
+ int size , MPI_Datatype * types , int * baseTypes )
1079
+ {
1080
+ if (db || !buf || !ptr )
1081
+ return ;
1082
+
1083
+ int i ;
1084
+
1085
+ for (i = 0 ; i < size ; i ++ )
1086
+ {
1087
+ int extent = getTypeExtent (env , types [i ]);
1088
+
1089
+ if (opal_datatype_is_contiguous_memory_layout (& types [i ]-> super , 2 ))
1090
+ {
1091
+ int iOff = offsets [i ] + displs [i ],
1092
+ iLen = extent * counts [i ];
1093
+ void * iPtr = (char * )ptr + displs [i ];
1094
+ setArrayRegion (env , buf , baseTypes [i ], iOff , iLen , iPtr );
1095
+ }
1096
+ else
1097
+ {
1098
+ void * bufPtr , * bufBase ;
1099
+
1100
+ bufPtr = ompi_java_getArrayCritical (& bufBase , env , buf , offsets [i ]);
1101
+ int iOff = displs [i ];
1102
+ char * iBuf = iOff + (char * )bufPtr ,
1103
+ * iPtr = iOff + (char * )ptr ;
1104
+
1105
+ int rc = opal_datatype_copy_content_same_ddt (
1106
+ & types [i ]-> super , counts [i ], iBuf , iPtr );
1107
+
1108
+ ompi_java_exceptionCheck (env ,
1109
+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
1110
+
1111
+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , bufBase , 0 );
1112
+ }
1113
+
1114
+ }
1115
+ releaseBuffer (ptr , item );
1116
+ }
1117
+
936
1118
jobject ompi_java_Integer_valueOf (JNIEnv * env , jint i )
937
1119
{
938
1120
return (* env )-> CallStaticObjectMethod (env ,
0 commit comments