VFP Android デバイスで ARMv6 をターゲットにしたいと考えています。
Android.mk
有効にするためにファイルに次の行がありますVFP
LOCAL_CFLAGS := -marm -mfloat-abi=softfp -mfpu=vfp -Wmultichar
をターゲットにARMv5
していると思いVFP
ます。
android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\setup.mk
削除するように編集しました-msoft-float
。オリジナルもやってみたsetup.mk
私のコードは 99.99% の確率で正常に動作しますが、ARMv6 デバイスではおかしくなることがあります。私はそれがいつ狂ったかを検出する特別なコードを持っています。
コード
glm::vec3 D = P1 - P2;
float f1 = sqrtf(D.x*D.x + D.y*D.y + D.z*D.z);
if(!(f1 < 5)){
// f1 is bigger then 5 or NaN
mylog_fmt("Crazy %f %f %f %f", P1.x, P1.y, P1.z, f1);
mylog_fmt("%f %f %f", P2.x, P2.y, P2.z);
}
LogCat :
12-14 00:59:08.214: I/APP(17091): Crazy -20.000031 0.000000 0.000000 20.000000
12-14 00:59:08.214: I/APP(17091): -20.000000 0.000000 0.000000
2 点間の距離を計算します。通常は 0.000031crazy mode
ですが、オンの場合は 20.0 です。
ARMv7 CPU で実行すると、問題は発生しません。ARMv6 CPU にのみ存在します。
コンパイラの設定またはバージョンに関連する一般的な既知のバグであると思います。コードにメモリ バリアがない可能性があります。
同様のバグへの参照をいくつか見たいと思います。それを解決する方法。またはバグの性質について。
また、ARMv7 の同じコードで NaN が返されない場合でも、ARMv6 で NaN 値を取得することがよくあります。
私はすでに 2 週間コードをデバッグしており、Web を検索しています。誰かが同様の問題へのリンクを共有できれば、それは大きな助けになるでしょう!
PS。コンパイル コマンドの 1 つの例を次に示します。すでにさまざまな設定を試しました。
コンパイラの設定
c:/soft/Android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-g++
-MMD -MP -MF ./obj/local/armeabi/objs/main/sys/base.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-march=armv5te -mtune=arm6
-mfloat-abi=softfp -mfpu=vfp
-fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64
-Ijni/main/ -Ijni/main/sys -Ijni/main/bullet/src -Ijni/main/bullet/src/LinearMath -Ijni/main/bullet/src/BulletCollision/BroadphaseCollision
-Ijni/main/bullet/src/BulletCollision/CollisionDispatch -Ijni/main/bullet/src/BulletCollision/CollisionShapes -Ijni/main/bullet/src/BulletCollision/NarrowPhaseCollision
-Ijni/main/bullet/src/BulletDynamics/ConstraintSolver -Ijni/main/bullet/src/BulletDynamics/Dynamics -Ijni/main/../libzip/ -Ic:/soft/Android/android-ndk-r8b/sources/cxx-stl/stlport/stlport
-Ic:/soft/Android/android-ndk-r8b/sources/cxx-stl//gabi++/include -Ijni/main
-DANDROID
-marm -march=armv6 -mfloat-abi=softfp -mfpu=vfp -Wmultichar
-Wa,--noexecstack -frtti -O2 -DNDEBUG -g -Ic:/soft/Android/android-ndk-r8b/platforms/android-5/arch-arm/usr/include -c jni/main/sys/base.cpp
-o ./obj/local/armeabi/objs/main/sys/base.o
更新 2
これらのデバイスはすべて Qualcomm MSM7227A を搭載しており、ARM1136JF-S を搭載しています。
私がこれまでに学んだことは、デフォルトでゼロにフラッシュされ、ARM1136SF-S がオプションでそれを
de-norms
持っている ARMv6 と ARMv7 の違いをどこかで読むことにバグが関連している可能性があるということです。http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211k/DDI0211K_arm1136_r1p5_trm.pdfdenorms
ARM で Flush-To-ZERO フラグを確認する方法がまだわかりません。
更新 3
この CPU の VFP はVFP11
I found--vfp11-denorm-fix
オプションと呼ばれます。また、CPU--vfp-denorm-fix
の正誤表も修正されてVFP11
います。私のターゲットの問題のように見えます。VFP11 エラッタに関する投稿がほとんど見つかりませんでした。コードが修正されることを願っています。