小编oc1*_*c1d的帖子

如何使用ARM NEON优化循环4D矩阵向量乘法?

我正在使用ARM NEON Assembler优化4D(128位)矩阵向量乘法.

如果我将矩阵和矢量加载到NEON寄存器并对其进行转换,我将无法获得极大的性能提升,因为切换到NEON寄存器需要20个周期.此外,我为每次乘法重新加载矩阵,尽管它没有改变.

有足够的寄存器空间可以在更多的向量上执行转换.这是在提高性能.

但..

我想知道如果我在汇编程序中对所有顶点(增加指针)进行循环,这个操作会有多快.但我现在处于霓虹汇编程序的最开始,虽然不知道如何做到这一点.有人能帮我一把吗?

我想要实现的目标:

  1. 加载矩阵和第一个向量
  2. 存储循环计数"计数"和..
  3. - LOOP_START -
  4. 执行乘法 - 添加(执行转换)
  5. 将q0写入vOut
  6. 将指针vIn和vOut增加4(128位)
  7. LOAD vIn到q5.
  8. - LOOP_END -

现有的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)

c android arm neon android-ndk

7
推荐指数
1
解决办法
1654
查看次数

为Android构建Valgrind

使用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 valgrind android-ndk

5
推荐指数
2
解决办法
1万
查看次数

JAVA Matrix-Vector-Multilication比C-Version慢100倍

我致力于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)

c java performance android android-ndk

0
推荐指数
1
解决办法
999
查看次数

标签 统计

android ×3

android-ndk ×3

c ×2

arm ×1

java ×1

neon ×1

performance ×1

valgrind ×1