I'm trying to figure out how to do half-precision using types like 'half' and 
'half4'. The only problem seems to be getting the numbers from java to 
renderscript and back.
The Java Code:

private float[] input;
private float[] half_output;
private RenderScript mRS;
private ScriptC_mono mScript;
private final int dimen = 15;...

//onCreate
input = new float[dimen * dimen * 3];      //later loaded from file 182.24 3.98 
105.83 226.08 15.2 80.01...
half_output = new float[dimen * dimen * 3];
*...*

//function calling renderscript
mRS = RenderScript.create(this);
ScriptC_halfPrecision mScript = new ScriptC_halfPrecision(mRS);

Allocation input2 = Allocation.createSized(mRS, Element.F16(mRS), dimen * dimen 
* 3);
input2.copyFromUnchecked(input);            //copy float values to F16 
allocation

Allocation halfIndex = Allocation.createSized(mRS, Element.F16(mRS), dimen * 
dimen);
Type.Builder half_output_type = new Type.Builder(mRS, 
Element.F16(mRS)).setX(dimen * dimen * 3);
Allocation output3 = Allocation.createTyped(mRS, half_output_type.create());

mScript.set_half_in(input2);
mScript.set_half_out(output3);
mScript.forEach_half_operation(halfIndex);

output3.copy1DRangeToUnchecked(0, dimen * dimen * 3, half_output);  //copy F16 
allocation back to float array




The Renderscript:

#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)

rs_allocation half_in;
rs_allocation half_out;

half __attribute__((kernel)) half_operation(uint32_t x) {
    half4 out = rsGetElementAt_half4(half_in, x);

    out.x /= 2.0;
    out.y /= 2.0;
    out.z /= 2.0;
    out.w /= 2.0;

    rsSetElementAt_half4(half_out, out, x);
}



I also tried this instead of the last line shown in the Java code
float temp_half[] = new float[1];
for (int i = 0; i < dimen * dimen * 3; ++i) {     //copy F16 allocation back to 
float array
    output3.copy1DRangeToUnchecked(i, 1, temp_half);
    half_output[i]=temp_half[0];
}


All the above code works perfectly for float4 variables in the renderscript and 
F32 allocations in the java.
This is obviously because there is no issue going from renderscript float to 
java float.
But trying to go from java float (since there is no java half) to renderscript 
half and back again is very difficult.
*Can anyone tell me how to do it?*

Both of the above versions of the java code result in seemingly random values 
in the half_output array.
They are obviously not random because they are the same values every time I run 
it, no matter what the operation in the half_operation(uint32_t x) function.
I've tried changing the   out.x /= 2.0;  to  out.x /= 2000000.0;   or   out.x 
*= 2000000.0;
and still the values that end up in the half_output array are the same every 
time I run it.

Using input of 
182.24 3.98 105.83 226.08 15.2 80.01...

Using this java
output3.copy1DRangeToUnchecked(0, dimen * dimen * 3, half_output);  //copy F16 
allocation back to float array
The resulting half_output is 46657.44 27094.48 3891.45 965.1825 36223.44 
14959.08...

Using this java
float temp_half[] = new float[1];
for (int i = 0; i < dimen * dimen * 3; ++i) {     //copy F16 allocation back to 
float array
    output3.copy1DRangeToUnchecked(i, 1, temp_half);
    half_output[i]=temp_half[0];
}
The resulting half_output is 2.3476E-41 2.5546E-41 6.2047E-41 2.5407E-41 
1.9802E-41 2.4914E-41...

Again these are the results no matter what I change the   out.x /= 2.0;   
algorithm to.

-- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/fb9c4fc4-d273-4538-b0c1-2422b7922a63%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to