1

私は何週間もかけて、インテル® SSE 組み込み関数を使用してコードを適切に手作業でベクトル化しようとしました。しかし、次のメッセージが表示されるたびに (-vec-report3 をオンにした後):

(810 行目) remark: ループはベクトル化されませんでした: ステートメントはベクトル化できません。

これは、__m128 (16 バイト) と float (4 バイト) の 2 つのデータ型を混在させていたためであることが最終的にわかりました (以下のコードの配列vは float* です)。

これは、左側と右側のデータ型が異なるため、ベクトル化を妨げていたことを意味します。

ただし、SSE のベクトル化では、一度に 4 つの float を __m128 変数にロードする必要があるため、この問題を修正する方法がわかりません。同様に、818 行目に 4 つの float をまとめて格納するときに同じ問題に直面します。

    #pragma ivdep
    for ( i = 4; i < z - 4; i+=4 )
    {
      it = it2 + i;
      __m128 tmp22 = _mm_loadu_ps(&v[it]);    // Line 810 
      __m128 tmp23 = _mm_mul_ps(tmp22,tmp22);
      __m128 tmp24 = _mm_loadu_ps(&tmp2[i]);
      __m128 tmp25 = _mm_mul_ps(tmp23,tmp24);
      __m128 tmp26 = _mm_loadu_ps(&p2[it]);
      __m128 tmp27 = _mm_add_ps(_mm_mul_ps(tmp25,dt2_i),tmp26);
      __m128 tmp28 = _mm_add_ps(tmp27,tmp26);

      _mm_storeu_ps(&p1[it],_mm_sub_ps(tmp28,_mm_loadu_ps(&p1[it]))); // Line 818
     }

コードのベクトル化を容易にするために混合データ型変換を解決する際のこのような問題を克服するために、正しい方向を教えてください。

4

0 に答える 0