0

2 LS バイトのデータと 2 MS バイトのビット フィールド データをInArray[2][60]運ぶ2 次元整数配列があります。データを抽出してにコピーするためshortのより高速な方法を提案してください。各項目を反復することは、これを行うための最適な方法ではないと思います。ティアshortshort OutArray[60]memcpy()

編集: コード スニペットの追加

int InArray[2][60];
short OutArray[60];
for (int i=0; i < 60;i++)
{
    OutArray[i] = (short)(InArray[0][i] & 0xffff);
}

これを行うためのより良い、おそらくより高速な方法はありますか

4

2 に答える 2

1

これは、このようなことを何度も行っている場合にのみ役立ちます。Agner Fog の vectorclass を使用してこれを行いました ( http://www.agner.org/optimize/vectorclass.zip )。SSE/AVXを利用するためのクラスです。ただし、質問にタグ SSE および AVX を追加すると、最良の回答が見つかります。

また、配列が 16 バイトまたは 32 バイトにアラインされていることを確認できれば、より良い結果が得られます。以下のコードでは、配列の幅を 64 にするか (60 要素しか使用しない場合でも)、配列の長さを 64 の倍数にすることも役立ちます。

#include <stdio.h>
#include "vectorclass.h"

void foo(int InArray[2][60],  short OutArray[60]) {
    for (int i=0; i < 60; i++) {
        OutArray[i] = (short)(InArray[0][i] & 0xffff);
    }
}

void foo_vec8s(int InArray[2][60],  short OutArray[60]) {
    int i=0;
    for (; i <(60-8); i+=8) {
        Vec8s v1 = Vec8s().load(&InArray[0][i]);
        Vec8s v2 = Vec8s().load(&InArray[0][i+4]);
        Vec8s out = blend8s<0,2,4,6,8,10,12,14>(v1,v2);
        out.store(&OutArray[i]);
    }
    //clean up since arrays are not a multiple of 64
    for (;i < 60; i++) {
        OutArray[i] = (short)(InArray[0][i] & 0xffff);
    }
}

int main() {
    int InArray[2][60];
    for(int i=0; i<60; i++) { 
        InArray[0][i] = i | 0xffff0000;
    }

    short OutArray1[60] = {0};
    foo(InArray, OutArray1);
    for(int i=0; i<60; i++) {
        printf("%d ", OutArray1[i]);
    } printf("\n");

    short OutArray2[60] = {0};
    foo_vec8s(InArray, OutArray2);
    for(int i=0; i<60; i++) {
        printf("%d ", OutArray2[i]);
    } printf("\n");  
}
于 2013-06-20T15:03:56.667 に答える