1

iOS 6プロジェクトでは、ルックアップテーブルを介して4バイトワード(32ビット)に変換する必要がある2バイトワード(16ビット)を含むバッファーがあります。値をテーブルにハードコーディングしてから、2バイトのバッファーの値を使用して、取得する32ビットのテーブル値を決定します。次に例を示します。

void map_values(uint32_t *dst,uint16_t *src,uint32_t *lut,int buf_length){
    int i=0;
    for(i=0;i<buf_length;i++){

        *dst = *(lut+(*src));
        dst++;
        src++;
    }
}

問題は、それが遅すぎるということです。NEONを使用して一度に4つの出力バイトを処理することでこれを高速化できますか?問題は、srcバッファーから値を取得し、それをルックアップテーブルへの入力として使用して、取得する値を把握する方法に自信がないことです。また、ワード長はテーブルと出力バッファで同じですが、ソースでは同じではありません。したがって、必要な4つの32ビットワード出力に対して、入力として2つの16ビットワードしか読み取ることができません。何か案は?おそらく、この問題に取り組むためのより良い方法はありますか?

clangからの現在のasm出力(clang -O3 -arch armv7 lut.c -S):

    .section    __TEXT,__text,regular,pure_instructions
    .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
    .section    __TEXT,__const_coal,coalesced
    .section    __TEXT,__picsymbolstub4,symbol_stubs,none,16
    .section    __TEXT,__StaticInit,regular,pure_instructions
    .syntax unified
    .section    __TEXT,__text,regular,pure_instructions
    .globl  _map_values
    .align  2
    .code   16                      @ @map_values
    .thumb_func _map_values
_map_values:
@ BB#0:
    cmp r3, #0
    it  eq
    bxeq    lr
LBB0_1:                                 @ %.lr.ph
                                        @ =>This Inner Loop Header: Depth=1
    ldrh    r9, [r1], #2
    subs    r3, #1
    ldr.w   r9, [r2, r9, lsl #2]
    str r9, [r0], #4
    bne LBB0_1
@ BB#2:                                 @ %._crit_edge
    bx  lr


.subsections_via_symbols
4

2 に答える 2

3

ルックアップテーブルは(ほぼ)ベクトル化できません。非常に小さなルックアップテーブルをこのvtbl命令で処理できますが、ルックアップテーブルはそれには大きすぎます。

ルックアップテーブルを何に使用していますか?値を調べるのではなく、あまり手間をかけずにその場で値を計算できる場合、それは実際にはあなたにとって重要な勝利かもしれません。

于 2013-02-08T17:29:17.793 に答える
1

私の最初の考えは、 AccelerateフレームワークvtablelookupのvecLib部分で運が出るかもしれないということです。署名は次のとおりです。

vUInt32 vtablelookup (
   vSInt32 Index_Vect,
   uint32_t *Table
);

ここでvSInt32、およびvUInt32はそれぞれ128ビットパックされた32ビットの符号付き/符号なし整数です。この機能はARM上のNEONによって支えられていると思います。大きな問題は、src配列を32ビットインデックスに変換することです。これにより、ルックアップをベクトル化することによる速度の向上が無意味になるほど、速度が低下する可能性があります。

于 2013-02-08T16:32:28.597 に答える