Sử dụng Intel intrinsics để tính Vector*Matrix

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);
}

Chỉ đơn giản là 4 phép toàn dc tính trong 1 lần, tutorial:
http://sci.tuomastonteri.fi/programming/sse

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?