2

SIMD/Intel SSE を使用して、行列の乗算を最適化する必要があります。与えられたコード例は次のようになります。

*x = (float*)memalign(16, size * sizeof(float));

ただし、私は C++ を使用しており、[found that][1]代わりにmalloc(SIMD を実行する前に) を使用する必要がありますnew。今、私は SIMD/SSE を介してさらに最適化しているので、アラインされたメモリが必要なので、質問は: 必要ですかmemalign/_aligned_mallocまたは私の配列は次のように宣言されていますか?

static float m1[SIZE][SIZE];

すでに整列?(SIZEはintです)

4

1 に答える 1

4

通常、それらは 16 バイト境界でアラインされませんが、C++ 仕様には、コンパイラがそのような配列を 16 バイト境界でアラインすることを妨げるものは何もありません。使用しているコンパイラに応じて、通常、配列を 16 バイト境界に揃えるよう要求するコンパイラ固有の方法があります。たとえばgcc、次のように使用します。

static float m1[SIZE][SIZE] __attribute__((aligned(16)));

または、プラットフォームで利用可能なposix_memalign()memalign()、またはその他の整列割り当て API を使用して、目的の配置でメモリのブロックを取得することもできます。最悪の場合、標準を使用してメモリを割り当てmalloc()たりoperator new、アラインメント調整を自分で処理したりすることもできます。

于 2012-10-03T13:41:52.560 に答える