我正在使用ARM NEON Assembler优化4D(128位)矩阵向量乘法.
如果我将矩阵和矢量加载到NEON寄存器并对其进行转换,我将无法获得极大的性能提升,因为切换到NEON寄存器需要20个周期.此外,我为每次乘法重新加载矩阵,尽管它没有改变.
有足够的寄存器空间可以在更多的向量上执行转换.这是在提高性能.
但..
我想知道如果我在汇编程序中对所有顶点(增加指针)进行循环,这个操作会有多快.但我现在处于霓虹汇编程序的最开始,虽然不知道如何做到这一点.有人能帮我一把吗?
我想要实现的目标:
现有的C版循环:
void TransformVertices(ESMatrix* m, GLfloat* vertices, GLfloat* normals, int count)
{
GLfloat* pVertex = vertices;
int i;
// iterate trough vertices only one at a time
for (i = 0; i < count ; i ++)
{
Matrix4Vector4Mul( (float *)m, (float *)pVertex, (float *)pVertex);
pVertex += 4;
}
//LoadMatrix( (const float*) m);
//// two at a time …Run Code Online (Sandbox Code Playgroud) 使用ndk-r6或ndk-r8d在ubuntu 12.04上构建valgrind-3.8.1失败,并出现以下错误:
...
cc1: Error: not rekognized option "-marm"
priv/main_globals.c:1:0: Error: wrong Value (cortex-a8) for -mtune=switch
...
Run Code Online (Sandbox Code Playgroud)
我的构建脚本:
export NDKROOT=/home/stefan/android-ndk-r6-crystax-2
export HWKIND=generic
PATH=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin:$PATH
PATH=$PATH:$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/libexec/gcc/arm-linux-androideabi/4.4.3
export CROSS_COMPILE=arm-linux-androideabi-
export AR=${CROSS_COMPLIE}ar
export LD=${CROSS_COMPLIE}ld
export CC=${CROSS_COMPLIE}gcc
export CXX=${CROSS_COMPLIE}g++
export CPP=${CROSS_COMPLIE}cpp
./autogen.sh CPPFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm -DANDROID_HARDWARE_$HWKIND" CFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm"
./configure --prefix=/data/local/Inst --host=armv7-unknown-linux --target=armv7-unknown-linux --with-tmpdir=/tmp
Run Code Online (Sandbox Code Playgroud)
最后
make
Run Code Online (Sandbox Code Playgroud)
:)
有任何想法吗?谢谢
我也会接受建造的二进制文件;))
我致力于Android JAVA和Android NDK应用程序之间的性能差异.我在超过90000个顶点上执行了Matrix4D-Vector4D转换,作为3D图形的示例.
可以看出,JAVA版本比C版本快了近100倍.我错了吗?有没有人有类似的经历?
我的Java代码转换:
long t1 = System.nanoTime();
for ( int i = 0; i < vCount; i++)
{
Vector4 vOut = new Vector4();
Vector4 v = vertices[i];
vOut.v_[0] = v.v_[0] * matrix[0].v_[0];
vOut.v_[1] = v.v_[0] * matrix[0].v_[1];
vOut.v_[2] = v.v_[0] * matrix[0].v_[2];
vOut.v_[3] = v.v_[0] * matrix[0].v_[3];
vOut.v_[0] += v.v_[1] * matrix[1].v_[0];
vOut.v_[1] += v.v_[1] * matrix[1].v_[1];
vOut.v_[2] += v.v_[1] * matrix[1].v_[2];
vOut.v_[3] += v.v_[1] * matrix[1].v_[3];
vOut.v_[0] += v.v_[2] * matrix[2].v_[0];
vOut.v_[1] += v.v_[2] * …Run Code Online (Sandbox Code Playgroud)