Я прочитал исходный код библиотеки DirectXMath и обнаружил, что реализация XMVectorSetByIndex
и XMVectorSetX
совершенно разные. Почему не XMVectorSetX
просто возвращает XMVectorSetByIndex
(index = 0)?В чем разница между XMVectorSetByIndex при индексе = 0 и XMVectorSetX?
1
A
ответ
2
XMVectorSetX
действительно может использовать функции SSE или ARM-NEON, а XMVectorSetByIndex
должен «разливаться в память» (т. Е. Это не SIMD вообще).
// Set a single indexed floating point component
inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i)
{
assert(i < 4);
_Analysis_assume_(i < 4);
#if defined(_XM_NO_INTRINSICS_)
XMVECTOR U;
U = V;
U.vector4_f32[i] = f;
return U;
#elif defined(_XM_ARM_NEON_INTRINSICS_)
XMVECTOR U = V;
U.n128_f32[i] = f;
return U;
#elif defined(_XM_SSE_INTRINSICS_)
XMVECTOR U = V;
U.m128_f32[i] = f;
return U;
#endif
}
против
// Sets the X component of a vector to a passed floating point value
inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x)
{
#if defined(_XM_NO_INTRINSICS_)
XMVECTOR U;
U.vector4_f32[0] = x;
U.vector4_f32[1] = V.vector4_f32[1];
U.vector4_f32[2] = V.vector4_f32[2];
U.vector4_f32[3] = V.vector4_f32[3];
return U;
#elif defined(_XM_ARM_NEON_INTRINSICS_)
return vsetq_lane_f32(x,V,0);
#elif defined(_XM_SSE_INTRINSICS_)
XMVECTOR vResult = _mm_set_ss(x);
vResult = _mm_move_ss(V,vResult);
return vResult;
#endif
}
Это информативно смотреть на XMVectorSetY
дела, а где с /arch:AVX
или /arch:AVX2
это возможность использовать инструкцию SSE4 _mm_insert_ps
в противном случае он должен сделать справедливый бит работы получить SIMD code-gen вместо того, чтобы «проливать память».
inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y)
{
#if defined(_XM_NO_INTRINSICS_)
XMVECTOR U;
U.vector4_f32[0] = V.vector4_f32[0];
U.vector4_f32[1] = y;
U.vector4_f32[2] = V.vector4_f32[2];
U.vector4_f32[3] = V.vector4_f32[3];
return U;
#elif defined(_XM_ARM_NEON_INTRINSICS_)
return vsetq_lane_f32(y,V,1);
#elif defined(_XM_SSE4_INTRINSICS_)
XMVECTOR vResult = _mm_set_ss(y);
vResult = _mm_insert_ps(V, vResult, 0x10);
return vResult;
#elif defined(_XM_SSE_INTRINSICS_)
// Swap y and x
XMVECTOR vResult = XM_PERMUTE_PS(V,_MM_SHUFFLE(3,2,0,1));
// Convert input to vector
XMVECTOR vTemp = _mm_set_ss(y);
// Replace the x component
vResult = _mm_move_ss(vResult,vTemp);
// Swap y and x again
vResult = XM_PERMUTE_PS(vResult,_MM_SHUFFLE(3,2,0,1));
return vResult;
#endif
}
Обратите внимание, что DirectXMath теперь доступен на GitHub.
Смежные вопросы
- 1. В чем разница между -0 и 0?
- 2. В чем разница между FILE_ATTRIBUTE_NORMAL и 0?
- 3. В чем разница между firstChild и [0]?
- 4. В чем разница между {0} и ""?
- 5. В чем разница между «Hash.new (0)» и «{}«
- 6. В чем разница между 0 и ~~?
- 7. В чем разница между {0} и +?
- 8. В чем разница между 0 и 0. в java?
- 9. В чем разница между 0 и dword 0?
- 10. В чем разница между crontab между */5 и 0/5?
- 11. разница между обр [0] ++ и ++ обр [0]
- 12. Разница между 0 и '0' в массиве
- 13. разница между «\ 0» и «\ 0»
- 14. В чем разница между «kill 0» и «kill - - $$»?
- 15. В чем разница между & vector [0] и vector.begin()?
- 16. В чем разница между «'» и «»
- 17. В чем разница между «и«
- 18. разница между objectAtIndex и [0]
- 19. В чем разница между + и%?
- 20. В чем разница между [0] и [: 1] в Go?
- 21. В чем разница между hasMany и referenceMany в loopback 0
- 22. В чем разница между Thread.yield() и Thread.sleep (0) в Java?
- 23. Разница между 0 и -0 в C++
- 24. Разница между 0 и 0u
- 25. Разница между {0} и calloc?
- 26. В чем разница между .communicate() и .communicate() [0]?
- 27. В чем разница между int var [] и int var [0]
- 28. В чем разница между «kill -0» и «kill -9»?
- 29. В чем разница между драйвером Ring 0 и Ring 3?
- 30. В чем разница между Array.GetUpperBound (0) и Array.GetUpperBound (1)