0

ベクトルの下でいくつかの並列比較を行いuint16x8_t、それに応じていくつかのローカル変数 (カウンター) をインクリメントする必要があります。私はこのアルゴリズムを実装します:

...
register int objects = 0;
uint16x8_t vcmp0,vobj;
uint32x2_t dobj;
register uint32_t temp0;
...
vobj = vreinterpretq_u16_u8(vcntq_u8(vreinterpretq_u8_u16(vcmp0))); 
vobj = vpaddlq_u8(vreinterpretq_u8_u16(vobj)); 
vobj = vreinterpretq_u16_u32(vpaddlq_u16(vobj)); 
vobj = vreinterpretq_u16_u64(vpaddlq_u32(vreinterpretq_u32_u16(vobj))); 
dobj = vmovn_u64(vreinterpretq_u64_u16(vobj));
dobj = vreinterpret_u32_u64(vpaddl_u32(dobj));
    __asm__ __volatile__
            (
             "vmov.u32  %[temp0] , %[dobj][0]               \n\t"
             "add  %[objects] ,%[objects], %[temp0], asr #4               \n\t"
             : [dobj]"+w"(dobj), [temp0]"=r"(temp0), [objects]"+r"(objects)
             :
             : "memory"
            );

...

ベクトルvcmp0には比較の結果が含まれます。計算に使用されるvobjはカウンタです。セットビット数とペアワイズ加算を計算に使用しています。この作業を行うためのより速い方法はありますか?dobjobjects

4

0 に答える 0