質問

私は MSVC12 (Visual Studio 2013 Express) を使用しており、8*8 浮動小数点値の高速乗算を実装しようとしています。問題は位置合わせです。ベクトルには実際には 9*n の値がありますが、必要なのは常に最初の 8 だけです。n=0 の場合、32 バイトのアライメントが保証されます (_mm_malloc を使用する場合)。n=1 の場合、「最初の」値は 4*9 = 36 バイトでアライメントされます。

for(unsigned i = 0; i < n; i++) {
    float *coeff_set = (float *)_mm_malloc(909 * 100 *sizeof(float), 32);
    // this works for n=0, not n=1, n=2, ...
    __m256 coefficients = _mm256_load_ps(&coeff_set[9 * i]);
    __m256 result = _mm256_mul_ps(coefficients, coefficients);

    ...
}

これを解決する可能性はありますか?データの構造を維持したいのですが、それが不可能な場合は変更します。私が見つけた解決策の 1 つは、最初に 8 つの浮動小数点を整列された配列にコピーしてからロードすることでしたが、その場合のパフォーマンスの損失は大きすぎます。

役に立ちましたか?

解決

選択肢は 2 つあります。

  1. アライメントを維持するために、係数の各セットを 16 の値にパディングします。
  2. 使用 _mm256_loadu_ps 非整列アクセス用の組み込み

最初の選択は速度効率が高く、2 番目の選択はスペース効率が高くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top