2

sse/sse2 を使用して行列ベクトル乗算を実装する必要があります。ベクトルと行列が大きい。行列は double、ベクトルは float です。

ポイントは、フロートで実行する必要があるすべての計算です-マトリックスからデータを取得すると、それをフロートに昇格させ、計算を行い、フロートベクトルを取得します(後でフロートで追加の計算を行った後、いくつかのフロート値を追加する必要があります(フロート行列) を double 値 (double 行列) に変換します。

私の質問は、SSE/SSE2 を使用してそれを行う方法です-問題は double にあります-double* へのポインターがあり、__mm128 に収まるように 4 つの double を 4 つの float に変換する必要があります...それを行うための指示はありますか? ?

4

2 に答える 2

1

doubleからへの変更floatは、精度のレベルを下げることであり、上げることではありません。より正確にするには、doubles で計算を行い (ベクトルをその型に昇格させ)、その後結果をキャストする必要がありfloatます。変換に必要な指示はcvtps2pd( floatdouble) および/またはcvtpd2ps( doublefloat) です。これらは一度に 2 つの値しか変換しないため ( doubleSSE レジスタには 2 つしか収まらないため)、2 つの部分に分けて変換を行う必要があります。

于 2011-02-28T08:07:47.237 に答える
1

__m128 _mm_cvtpd_ps (__m128d a)( ) を 2 回呼び出しCVTDP2PSて、それぞれが元の倍精度値を 2 つ含む 2 つの単精度 float ベクトルを取得し、次に__m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)( SHUFPS) などを使用して、これら 2 つの float ベクトルを 1 つのベクトルにマージする必要があります。

于 2011-02-28T15:08:07.230 に答える