Có bạn nào có tài liệu về cách sử dụng Intel Intrinsics để chia sẻ với mình không? Máy mình không hỗ trợ AVX nên cái đó mình không dùng.
Giả sử mình có Vector(a,b,c,d) và Matrix 4x4
Nếu tính Vector*Matrix bằng cộng trừ nhân chia có vẻ sẽ nhanh hơn dùng intrinsics sao?
Cái code này mình kiếm được trên đây.
Nhìn sơ qua thì thấy nó có vẻ chậm hơn cộng trừ nhân chia bình thường.
void A_times_x(float4& out_y,
const float4* in_A,
const float4& in_x) {
// Load matrix A and vector x into SSE registers
__m128 x = _mm_loadu_ps((const float*)&in_x);
__m128 A0 = _mm_loadu_ps((const float*)(in_A + 0));
__m128 A1 = _mm_loadu_ps((const float*)(in_A + 1));
__m128 A2 = _mm_loadu_ps((const float*)(in_A + 2));
__m128 A3 = _mm_loadu_ps((const float*)(in_A + 3));
// Multiply each matrix row with the vector x
__m128 m0 = _mm_mul_ps(A0, x);
__m128 m1 = _mm_mul_ps(A1, x);
__m128 m2 = _mm_mul_ps(A2, x);
__m128 m3 = _mm_mul_ps(A3, x);
// Using HADD, we add four floats at a time
__m128 sum_01 = _mm_hadd_ps(m0, m1);
__m128 sum_23 = _mm_hadd_ps(m2, m3);
__m128 result = _mm_hadd_ps(sum_01, sum_23);
// Finally, store the result
_mm_storeu_ps((float*)&out_y, result);
}