From 2514806817ec394d334595d76e20f3129117da6e Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Mon, 29 Jun 2015 17:43:03 -0700 Subject: [PATCH] [RenderScript] update the type of offsets for BLAS.BNNM bug: 22184114 Change-Id: I7e7132aa3563f32de32640567b381f8f5bddf491 (cherry picked from commit 6099ee6e081904e73e0fad331e326b0607b6b1dc) --- .../renderscript/ScriptIntrinsicBLAS.java | 21 ++++++++++++++++--- rs/jni/android_renderscript_RenderScript.cpp | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java index 9acf5adeb43f0..8fd56d76b6094 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java @@ -1554,14 +1554,29 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { /** + * 8-bit GEMM-like operation for neural networks: C = B.transposed() * A + * Calculations are done in 1.10.21 fixed-point format for the final output, + * just before there's a shift down to drop the fractional parts. The output + * values are gated to 0 to 255 to fit in a byte, but the 10-bit format + * gives some headroom to avoid wrapping around on small overflows. * - * 8-bit GEMM-like operation for neural networks - * - * @hide + * @param A The input allocation contains matrix A, supported elements type {@link Element#U8}. + * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset. Value should be from 0 to 255. + * @param B The input allocation contains matrix B, supported elements type {@link Element#U8}. + * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset. Value should be from 0 to 255. + * @param C The input allocation contains matrix C, supported elements type {@link Element#U8}. + * @param c_offset The offset for all values in matrix C. + * @param c_mult The multiplier for all values in matrix C, e.g C[i,j] = (C[i,j] + c_offset) * c_mult. **/ public void BNNM(Allocation A, int a_offset, Allocation B, int b_offset, Allocation C, int c_offset, int c_mult) { validateL3(Element.U8(mRS), NO_TRANSPOSE, TRANSPOSE, 0, A, B, C); + if (a_offset < 0 || a_offset > 255) { + throw new RSRuntimeException("Invalid a_offset passed to BNNM"); + } + if (b_offset < 0 || b_offset > 255) { + throw new RSRuntimeException("Invalid b_offset passed to BNNM"); + } int M = -1, N = -1, K = -1; M = A.getType().getY(); N = B.getType().getY(); diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index ec835b2ad9f75..aac6c19ec7274 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -701,8 +701,8 @@ nScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint call.M = M; call.N = N; call.K = K; - call.a_offset = a_offset; - call.b_offset = b_offset; + call.a_offset = a_offset & 0xFF; + call.b_offset = b_offset & 0xFF; call.c_offset = c_offset; call.c_mult_int = c_mult_int;