| 1 | #include "com_sun_fortress_numerics_Blas.h" |
|---|
| 2 | |
|---|
| 3 | #include <jni.h> |
|---|
| 4 | |
|---|
| 5 | #if defined(OSX) |
|---|
| 6 | #include <Accelerate/Accelerate.h> |
|---|
| 7 | |
|---|
| 8 | #elif defined(SUNOS) |
|---|
| 9 | #include <sunperf.h> |
|---|
| 10 | |
|---|
| 11 | #else |
|---|
| 12 | #include <cblas.h> |
|---|
| 13 | |
|---|
| 14 | #endif |
|---|
| 15 | |
|---|
| 16 | #ifdef __cplusplus |
|---|
| 17 | extern "C" { |
|---|
| 18 | #endif |
|---|
| 19 | |
|---|
| 20 | static double oneVectorFunction( JNIEnv * env, jint length, |
|---|
| 21 | jdoubleArray vector1, jint stride1, jint offset1, |
|---|
| 22 | double (*cblas)() ){ |
|---|
| 23 | |
|---|
| 24 | double ret = 0; |
|---|
| 25 | int i; |
|---|
| 26 | jboolean copy; |
|---|
| 27 | |
|---|
| 28 | jdouble * convertedVector1 = (*env)->GetPrimitiveArrayCritical(env, vector1, ©); |
|---|
| 29 | |
|---|
| 30 | |
|---|
| 31 | |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | |
|---|
| 35 | |
|---|
| 36 | |
|---|
| 37 | |
|---|
| 38 | ret = (*cblas)( length, convertedVector1 + offset1, stride1 ); |
|---|
| 39 | |
|---|
| 40 | (*env)->ReleasePrimitiveArrayCritical(env, vector1, convertedVector1, 0 ); |
|---|
| 41 | return ret; |
|---|
| 42 | |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | static double oneVectorAlphaVoidFunction( JNIEnv * env, jint length, jdouble alpha, |
|---|
| 46 | jdoubleArray vector1, jint stride1, jint offset1, |
|---|
| 47 | void (*cblas)() ){ |
|---|
| 48 | |
|---|
| 49 | double ret = 0; |
|---|
| 50 | int i; |
|---|
| 51 | |
|---|
| 52 | jdouble * convertedVector1 = (*env)->GetPrimitiveArrayCritical(env, vector1, 0); |
|---|
| 53 | |
|---|
| 54 | |
|---|
| 55 | |
|---|
| 56 | |
|---|
| 57 | |
|---|
| 58 | |
|---|
| 59 | |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | (*cblas)( length, alpha, convertedVector1 + offset1, stride1 ); |
|---|
| 63 | |
|---|
| 64 | (*env)->ReleasePrimitiveArrayCritical(env, vector1, convertedVector1, 0 ); |
|---|
| 65 | } |
|---|
| 66 | |
|---|
| 67 | static void twoVectorVoidFunction( JNIEnv * env, jint length, |
|---|
| 68 | jdoubleArray vector1, jint stride1, jint offset1, |
|---|
| 69 | jdoubleArray vector2, jint stride2, jint offset2, |
|---|
| 70 | void (*cblas)() ){ |
|---|
| 71 | |
|---|
| 72 | int i; |
|---|
| 73 | |
|---|
| 74 | jdouble * convertedVector1 = (*env)->GetPrimitiveArrayCritical(env, vector1, 0); |
|---|
| 75 | |
|---|
| 76 | jdouble * convertedVector2 = (*env)->GetPrimitiveArrayCritical(env, vector2, 0); |
|---|
| 77 | |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | |
|---|
| 81 | |
|---|
| 82 | |
|---|
| 83 | |
|---|
| 84 | |
|---|
| 85 | |
|---|
| 86 | (*cblas)( length, convertedVector1 + offset1, stride1, convertedVector2 + offset2, stride2 ); |
|---|
| 87 | |
|---|
| 88 | (*env)->ReleasePrimitiveArrayCritical(env, vector1, convertedVector1, 0 ); |
|---|
| 89 | |
|---|
| 90 | (*env)->ReleasePrimitiveArrayCritical(env, vector2, convertedVector2, 0 ); |
|---|
| 91 | } |
|---|
| 92 | |
|---|
| 93 | static double twoVectorFunction( JNIEnv * env, jint length, |
|---|
| 94 | jdoubleArray vector1, jint stride1, jint offset1, |
|---|
| 95 | jdoubleArray vector2, jint stride2, jint offset2, |
|---|
| 96 | double (*cblas)() ){ |
|---|
| 97 | |
|---|
| 98 | double ret = 0; |
|---|
| 99 | int i; |
|---|
| 100 | |
|---|
| 101 | jdouble * convertedVector1 = (*env)->GetPrimitiveArrayCritical(env, vector1, 0); |
|---|
| 102 | |
|---|
| 103 | jdouble * convertedVector2 = (*env)->GetPrimitiveArrayCritical(env, vector2, 0); |
|---|
| 104 | |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | |
|---|
| 108 | |
|---|
| 109 | |
|---|
| 110 | |
|---|
| 111 | |
|---|
| 112 | |
|---|
| 113 | ret = (*cblas)( length, convertedVector1 + offset1, stride1, convertedVector2 + offset2, stride2 ); |
|---|
| 114 | |
|---|
| 115 | (*env)->ReleasePrimitiveArrayCritical(env, vector1, convertedVector1, 0 ); |
|---|
| 116 | |
|---|
| 117 | (*env)->ReleasePrimitiveArrayCritical(env, vector2, convertedVector2, 0 ); |
|---|
| 118 | return ret; |
|---|
| 119 | |
|---|
| 120 | } |
|---|
| 121 | |
|---|
| 122 | static void twoVectorAlphaVoidFunction( JNIEnv * env, jint length, jdouble alpha, |
|---|
| 123 | jdoubleArray vector1, jint stride1, jint offset1, |
|---|
| 124 | jdoubleArray vector2, jint stride2, jint offset2, |
|---|
| 125 | void (*cblas)() ){ |
|---|
| 126 | |
|---|
| 127 | int i; |
|---|
| 128 | |
|---|
| 129 | jdouble * convertedVector1 = (*env)->GetPrimitiveArrayCritical(env, vector1, 0); |
|---|
| 130 | |
|---|
| 131 | jdouble * convertedVector2 = (*env)->GetPrimitiveArrayCritical(env, vector2, 0); |
|---|
| 132 | |
|---|
| 133 | |
|---|
| 134 | |
|---|
| 135 | |
|---|
| 136 | |
|---|
| 137 | |
|---|
| 138 | |
|---|
| 139 | |
|---|
| 140 | |
|---|
| 141 | (*cblas)( length, alpha, convertedVector1 + offset1, stride1, convertedVector2 + offset2, stride2 ); |
|---|
| 142 | |
|---|
| 143 | |
|---|
| 144 | |
|---|
| 145 | (*env)->ReleasePrimitiveArrayCritical(env, vector1, convertedVector1, 0 ); |
|---|
| 146 | (*env)->ReleasePrimitiveArrayCritical(env, vector2, convertedVector2, 0 ); |
|---|
| 147 | } |
|---|
| 148 | |
|---|
| 149 | |
|---|
| 150 | |
|---|
| 151 | |
|---|
| 152 | |
|---|
| 153 | |
|---|
| 154 | JNIEXPORT jdouble JNICALL Java_com_sun_fortress_numerics_Blas_dotProduct |
|---|
| 155 | (JNIEnv * env, jclass class_, jint length, jdoubleArray vector1, jint stride1, jint offset1, jdoubleArray vector2, jint stride2, jint offset2 ){ |
|---|
| 156 | |
|---|
| 157 | return twoVectorFunction( env, length, vector1, stride1, offset1, vector2, stride2, offset2, cblas_ddot ); |
|---|
| 158 | |
|---|
| 159 | } |
|---|
| 160 | |
|---|
| 161 | JNIEXPORT jdouble JNICALL Java_com_sun_fortress_numerics_Blas_norm |
|---|
| 162 | (JNIEnv * env, jclass class_, jint length, jdoubleArray vector1, jint stride1, jint offset1 ){ |
|---|
| 163 | return oneVectorFunction( env, length, vector1, stride1, offset1, cblas_dnrm2 ); |
|---|
| 164 | } |
|---|
| 165 | |
|---|
| 166 | JNIEXPORT void JNICALL Java_com_sun_fortress_numerics_Blas_internal_1add |
|---|
| 167 | (JNIEnv * env, jclass class_, jint length, jdouble alpha, jdoubleArray vector1, jint stride1, jint offset1, jdoubleArray vector2, jint stride2, jint offset2 ){ |
|---|
| 168 | twoVectorAlphaVoidFunction( env, length, alpha, vector1, stride1, offset1, vector2, stride2, offset2, cblas_daxpy ); |
|---|
| 169 | } |
|---|
| 170 | |
|---|
| 171 | JNIEXPORT void JNICALL Java_com_sun_fortress_numerics_Blas_internal_1dcopy |
|---|
| 172 | (JNIEnv * env, jclass class_, jint length, jdoubleArray vector1, jint stride1, jint offset1, jdoubleArray vector2, jint stride2, jint offset2){ |
|---|
| 173 | twoVectorVoidFunction( env, length, vector1, stride1, offset1, vector2, stride2, offset2, cblas_dcopy ); |
|---|
| 174 | } |
|---|
| 175 | |
|---|
| 176 | JNIEXPORT void JNICALL Java_com_sun_fortress_numerics_Blas_internal_1scale |
|---|
| 177 | (JNIEnv * env, jclass class_, jint length, jdouble alpha, jdoubleArray vector, jint stride, jint offset){ |
|---|
| 178 | oneVectorAlphaVoidFunction( env, length, alpha, vector, stride, offset, cblas_dscal ); |
|---|
| 179 | } |
|---|
| 180 | |
|---|
| 181 | |
|---|
| 182 | JNIEXPORT void JNICALL Java_com_sun_fortress_numerics_Blas_internal_1vectorMatrixMultiply |
|---|
| 183 | (JNIEnv * env, jclass class_, jint order, jint transpose, jint m, jint n, jdouble alpha, jdoubleArray matrix, jint matrixStride, jint matrixOffset, jdoubleArray vector, jint stride, jint offset, jdouble beta, jdoubleArray result, jint resultStride, jint resultOffset){ |
|---|
| 184 | |
|---|
| 185 | |
|---|
| 186 | |
|---|
| 187 | |
|---|
| 188 | |
|---|
| 189 | |
|---|
| 190 | jdouble * convertedMatrix = (*env)->GetPrimitiveArrayCritical(env, matrix, 0); |
|---|
| 191 | jdouble * convertedVector = (*env)->GetPrimitiveArrayCritical(env, vector, 0); |
|---|
| 192 | jdouble * convertedResult = (*env)->GetPrimitiveArrayCritical(env, result, 0); |
|---|
| 193 | |
|---|
| 194 | cblas_dgemv( order, transpose, m, n, alpha, |
|---|
| 195 | convertedMatrix + matrixOffset, matrixStride, |
|---|
| 196 | convertedVector + offset, stride, beta, |
|---|
| 197 | convertedResult + resultOffset, resultStride ); |
|---|
| 198 | |
|---|
| 199 | |
|---|
| 200 | |
|---|
| 201 | |
|---|
| 202 | |
|---|
| 203 | (*env)->ReleasePrimitiveArrayCritical(env, matrix, convertedMatrix, 0 ); |
|---|
| 204 | (*env)->ReleasePrimitiveArrayCritical(env, vector, convertedVector, 0 ); |
|---|
| 205 | (*env)->ReleasePrimitiveArrayCritical(env, result, convertedResult, 0 ); |
|---|
| 206 | } |
|---|
| 207 | |
|---|
| 208 | JNIEXPORT void JNICALL Java_com_sun_fortress_numerics_Blas_internal_1matrixMatrixMultiply |
|---|
| 209 | (JNIEnv * env, jclass class_, jint order, jint transpose1, jint transpose2, jint m, jint n, jint k, jdouble alpha, jdoubleArray matrix1, jint matrix1Stride, jint matrix1Offset, jdoubleArray matrix2, jint matrix2Stride, jint matrix2Offset, jdouble beta, jdoubleArray resultMatrix, jint resultStride, jint resultOffset){ |
|---|
| 210 | |
|---|
| 211 | jdouble * convertedMatrix1 = (*env)->GetPrimitiveArrayCritical(env, matrix1, 0); |
|---|
| 212 | jdouble * convertedMatrix2 = (*env)->GetPrimitiveArrayCritical(env, matrix2, 0); |
|---|
| 213 | jdouble * convertedResult = (*env)->GetPrimitiveArrayCritical(env, resultMatrix, 0); |
|---|
| 214 | |
|---|
| 215 | cblas_dgemm( order, transpose1, transpose2, m, n, k, alpha, convertedMatrix1 + matrix1Offset, matrix1Stride, convertedMatrix2 + matrix2Offset, matrix2Stride, beta, convertedResult + resultOffset, resultStride ); |
|---|
| 216 | |
|---|
| 217 | (*env)->ReleasePrimitiveArrayCritical(env, matrix1, convertedMatrix1, 0 ); |
|---|
| 218 | (*env)->ReleasePrimitiveArrayCritical(env, matrix2, convertedMatrix2, 0 ); |
|---|
| 219 | (*env)->ReleasePrimitiveArrayCritical(env, resultMatrix, convertedResult, 0 ); |
|---|
| 220 | } |
|---|
| 221 | |
|---|
| 222 | #ifdef __cplusplus |
|---|
| 223 | } |
|---|
| 224 | #endif |
|---|