アトミック算術関数 を使用して RenderScript で単純な輝度ヒストグラムを実装しようとしてrsAtomicInc
いますが、関数が存在しないと思われる実行時エラーが発生します:
ScriptC sym lookup failed for _Z11rsAtomicIncPVj
.
(これが正しい記号であることを確認するには、次を使用できます。
$ echo "unsigned int __attribute__((overloadable))
rsAtomicInc ( volatile unsigned int *addr ) { return 0; }" > rsai.c
$ clang -c rsai.c; nm rsai.o
dumpbin
Windows では代わりに使用できnm
ます。) 他のアトミック関数を使用してみましたが、同様のエラーが発生します。エラーをカーネルで使用するか、呼び出し可能な関数で使用するかに関係なく、エラーが発生します。
// histogram.rs:
#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)
#pragma rs_fp_imprecise //relax math- allows NEON and other optimizations
const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};
volatile uint32_t *luminanceHistogram;
void luminance(const uchar4 *img, const void *usrData, uint32_t x, uint32_t y) {
float4 f4 = rsUnpackColor8888(*img);
float3 mono = dot(f4.rgb, gMonoMult);
uchar lum = rsPackColorTo8888(mono).r;
rsAtomicInc(luminanceHistogram + lum);
}
void increment(int lum) {
rsAtomicInc(luminanceHistogram + lum);
}
// HelloCompute.java
int[] luminance = new int[256];
Allocation luminanceHistogram = Allocation.createSized(mRS,
Element.U32(mRS), luminance.length);
ScriptC_histogram histo = new ScriptC_histogram(mRS); // ERROR
エラーログ:
E/bcc ( 3539): Invalid RS info file /data/data/com.example.android.rs.hellocompute/cache/com.android.renderscript.cache/histogram.o.info! (No such file or directory)
E/RenderScript( 3539): ScriptC sym lookup failed for _Z11rsAtomicIncPVj
E/bcc ( 3539): Some symbols are found to be undefined during relocation!
E/bcc ( 3539): Error occurred when performs relocation on /data/data/com.example.android.rs.hellocompute/cache/com.android.renderscript.cache/histogram.o!
E/RenderScript( 3539): bcc: FAILS to prepare executable for 'histogram'
D/AndroidRuntime( 3539): Shutting down VM
W/dalvikvm( 3539): threadid=1: thread exiting with uncaught exception (group=0x415c6700)
E/AndroidRuntime( 3539): FATAL EXCEPTION: main
E/AndroidRuntime( 3539): android.renderscript.RSRuntimeException: Loading of ScriptC script failed.
E/AndroidRuntime( 3539): at android.renderscript.ScriptC.<init>(ScriptC.java:60)
...
histogram.o.info に関する最初のエラーはおそらく偽物です。アプリを完全にアンインストールすると、最初の実行時にエラーが解消されます (ただし、他のエラーは発生しません)。