如何在 renderscript 中使用半精度?
How to use half precision in renderscript?
我使用以下代码将浮点数数组传输到渲染脚本内核:
float[] bufName = new float[3];
bufName [0] = 255;
bufName [1] = 255;
bufName [2] = 0;
Allocation alloc1 = Allocation.createSized(mRs, Element.F32(mRs), 3);
alloc1.copy1DRangeFrom(0, 3, mtmd);
ScriptC_foo foo = new ScriptC_foo(mRs);
foo.set_gIn(alloc1);
并且我在foo.rs
文件中定义了gIn
如下:
rs_allocation gIn;
我想使用 16 位浮点数。我知道我应该将分配创建更改为:
Allocation alloc1 = Allocation.createSized(mRs, Element.F16(mRs), 3);
但是,我找不到将 bufName 数组复制到分配的解决方案。任何帮助表示赞赏。
Java 没有定义半精度浮点数,因此您必须自己进行操作才能使其正常工作。如果您使用 Float.valueOf(f).shortValue()
(其中 f
是您希望表示为半精度的特定流)。这应该正确地将 float
转换为新的位大小。然后创建 Element.F16
大小的 Allocation
。您应该能够将 short
值的数组向下复制到 RenderScript 来完成这项工作。
我使用以下代码将浮点数数组传输到渲染脚本内核:
float[] bufName = new float[3];
bufName [0] = 255;
bufName [1] = 255;
bufName [2] = 0;
Allocation alloc1 = Allocation.createSized(mRs, Element.F32(mRs), 3);
alloc1.copy1DRangeFrom(0, 3, mtmd);
ScriptC_foo foo = new ScriptC_foo(mRs);
foo.set_gIn(alloc1);
并且我在foo.rs
文件中定义了gIn
如下:
rs_allocation gIn;
我想使用 16 位浮点数。我知道我应该将分配创建更改为:
Allocation alloc1 = Allocation.createSized(mRs, Element.F16(mRs), 3);
但是,我找不到将 bufName 数组复制到分配的解决方案。任何帮助表示赞赏。
Java 没有定义半精度浮点数,因此您必须自己进行操作才能使其正常工作。如果您使用 Float.valueOf(f).shortValue()
(其中 f
是您希望表示为半精度的特定流)。这应该正确地将 float
转换为新的位大小。然后创建 Element.F16
大小的 Allocation
。您应该能够将 short
值的数组向下复制到 RenderScript 来完成这项工作。