- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
for(int i=0;i<size1;i+=4)
{
float4 boxMax(plist[i+0].Box().vmax[axis], plist[i+1].Box().vmax[axis], plist[i+2].Box().vmax[axis], plist[i+3].Box().vmax[axis]);
float4 boxMin(plist[i+0].Box().vmin[axis], plist[i+1].Box().vmin[axis], plist[i+2].Box().vmin[axis], plist[i+3].Box().vmin[axis]);
register __m128 a = _mm_and_ps(_mm_cmplt_ps(boxMax, vSplit), one);
register __m128 b = _mm_and_ps(_mm_cmpgt_ps(boxMin, vSplit), one);
register __m128 left = _mm_sub_ps(one, b); // left = 1 - b; same as not(b)
register __m128 right = _mm_sub_ps(one, a); // right = 1 - a; same as not(a)
summLeft += (left.m128_i32[0] + left.m128_i32[1] + left.m128_i32[2] + left.m128_i32[3]);
summRight+= (right.m128_i32[0] + right.m128_i32[1] + right.m128_i32[2] + right.m128_i32[3]);
}
Использовал SSE - молодец.
А насчет того, что оно тупит - нужно разобраться.
Может unaligned обращения к памяти или еще какой нюанс.
Пройдите по ссылке, если вам интересно. Это не так.