0

XNAMath のパフォーマンスをテストしたところ、SIMD 組み込み関数を使用した PC バージョンでは、simd を使用しない場合よりもパフォーマンスが低下しているように見えます。

内積を計算する関数を使用します。このコードをsimdなしでテストしました:

XMVECTOR4 Result;
Result.m128_f32[0] =
Result.m128_f32[1] =
Result.m128_f32[2] =
Result.m128_f32[3] = V1.m128_f32[0] * V2.m128_f32[0] + V1.m128_f32[1] * V2.m128_f32[1] + V1.m128_f32[2] * V2.m128_f32[2] + V1.m128_f32[3] * V2.m128_f32[3];
return Result;

そしてこれと:

XMVECTOR4 vTemp2 = V2;
XMVECTOR4 vTemp = _mm_mul_ps(V1,vTemp2);
vTemp2 = _mm_shuffle_ps(vTemp2,vTemp,_MM_SHUFFLE(1,0,0,0)); // Copy X to the Z position and Y to the W position
vTemp2 = _mm_add_ps(vTemp2,vTemp);          // Add Z = X+Z; W = Y+W;
vTemp = _mm_shuffle_ps(vTemp,vTemp2,_MM_SHUFFLE(0,3,0,0));  // Copy W to the Z position
vTemp = _mm_add_ps(vTemp,vTemp2);           // Add Z and W together
return XM_PERMUTE_PS(vTemp,_MM_SHUFFLE(2,2,2,2));    // Splat Z and return

そして、このループで:

for (int i = 0; i < 10000000; i++)
{
    volatile XMVECTOR4 d = MVector4Dot(v1, v2);
}

simd なしのリリース モード バージョンでは約 9 ミリ秒かかり、約 20 ミリ秒かかります。

SIMD のパフォーマンスに影響を与える可能性のある理由はどれですか?

ありがとう。

更新:「/arch:SSE2」オプションを使用してプログラムをコンパイルします

4

1 に答える 1

1

SSE は実際にはこのように設定されていません。「水平に」追加しようとしていますが、これは SIMD には適していません。より詳細な回答については、(Google または SO) 構造体の配列と配列の構造体を検索できます。お使いのプロセッサが SSE3 をサポートしている場合は、次のようになります。

/* apologies - this is 'C' ... */

v0 = _mm_mul_ps(V1, V2);
v0 = _mm_hadd_ps(v0, v0);
v0 = _mm_hadd_ps(v0, v0); /* dot product splat across all elements. */

繰り返しになりますが、「haddps」のレイテンシは非常に高く、命令数は少なくなりますが、おそらく SIMD を使用しないコードよりも遅くなります。インターリーブ操作を開始すると、レイテンシを隠すことができる場合があります。プロセッサーが SSE 4.1 をサポートしている場合は、以下を使用できます。

v0 = _mm_dp_ps(V1, V2, 0xff); /* dot product splat across all elements. */

コードがより新しいプロセッサをターゲットにしている場合、これによりパフォーマンスが向上する可能性があります。

于 2012-12-08T17:46:14.957 に答える