4

以前はSIMD演算子を使用してコードの効率を改善していましたが、現在は解決できない新しいエラーに直面しています。このタスクでは、速度が最も重要です。

配列のサイズは、データがインポートされるまでわかりません。非常に小さい場合(100個の値)または大きい場合(1000万個の値)の場合があります。後者の場合、コードは正常に機能しますが、使用する配列値が130036未満の場合にエラーが発生します。

この問題の原因と解決方法を知っている人はいますか?

関連する(テスト済みの)コードを添付しました。これは、後でより複雑な関数で使用されます。エラーは「arg1List[i]=...」で発生します

#include <iostream>
#include <xmmintrin.h>
#include <emmintrin.h>

void main()
{
    int j;
    const int loop = 130036;
    const int SIMDloop = (int)(loop/4);
    __m128 *arg1List = new __m128[SIMDloop];

    printf("sizeof(arg1List)= %d, alignof(Arg1List)= %d, pointer= %p", sizeof(arg1List), __alignof(arg1List), arg1List);
    std::cout << std::endl;

    for (int i = 0; i < SIMDloop; i++)
    {
        j = 4*i;
        arg1List[i] = _mm_set_ps((j+1)/100.0f, (j+2)/100.0f, (j+3)/100.0f, (j+4)/100.0f);
    }
}
4

1 に答える 1

10

アライメントが理由です。

MOVAPS--整列されたパックされた単精度浮動小数点値を移動します

[...]オペランドは16バイト境界に揃える必要があります。そうしないと、一般保護違反(#GP)が生成されます。

ポインタを合わせるとすぐに問題がなくなったことがわかります。

__m128 *arg1List = new __m128[SIMDloop + 1];
arg1List = (__m128*) (((int) arg1List + 15) & ~15);
于 2012-10-22T14:56:59.760 に答える