Производительность XNAMath SIMD

Я протестировал производительность XNAMath и, похоже, на моей версии для ПК с характеристиками SIMD производительность ниже, чем без 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?

Thanx.

ОБНОВИТЬ: Я компилирую программу с параметром «/ arch: SSE2»

0

Решение

SSE на самом деле не настроен для этого — вы пытаетесь добавить «горизонтально», что не подходит для SIMD. Вы можете искать (Google или S.O.) массив структур против структуры массивов, чтобы получить более подробные ответы. Я могу сказать вам, что если ваш процессор поддерживает 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. */

Если ваш код ориентирован на более поздние процессоры, это может быть дать лучшую производительность.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]