Mình viết 2 hàm tính phép nhân V*M như sau:
Vector có dạng (a,b,c,d)
Matrix thì 4x4 (x_1 đến x_16)
Cách 1: tính bằng cộng trừ nhân chia bình thường
Vect VM_reg(const Vect& a, const Matrix& b){
return Vect(a*x1 + b*x4 + c*x8 + d*x12, …, …, …)
}
Cách 2: viết bằng SSE. Mình thấy rằng hàng đầu tiên của Ma trận sẽ luôn nhân với phần tử đầu tiên của trong vector là a, giống như vậy thì hàng 2 là b, 3 là c, 4 là d.
Vect VM_intel(const Vect& x, const Matrix& y){
//Bước 1:
//tạo 4 vector mà các phần tử giống nhau ví dụ vector1(a,a,a,a)
__m128 vect1 = _mm_set1_ps(x.a);
//làm như vậy với x.b, x.c, x.d
//Bước 2:
//mình lần lượt nhân các hàng trong ma trận với mấy cái vector vừa tạo ở trên.
__m128 row1 = _mm_mul_ps(y.hang1, vect1);
//lần lượt làm vậy với 3 hàng còn lại với vector tương ứng. Gọi các biến là row2, row3, row4
//Bước 3
//Cuối cùng mình dùng _mm_add_ps cộng các row1, row2, row3, row4 lại với nhau
_m128 row12 = _mm_add_ps(row1, row2);
return Vect(row1234);
}
Cho mình hỏi tại sao khi mình tính thời gian coi cái nào nhanh hơn thì cách 1 lại nhanh hơn cách 2?
Cách 1: mình cần đến 16 phép nhân và 12 phép cộng.
Cách 2: Bước 2: 4 phép nhân, bước 3: 3 phép cộng.
Mình có làm gì sai không? Hay tại cái _mm_set1_ps chạy chậm quá?
Mình muốn cách 2 phải nhanh hơn cách 1 nhưng không biết sai chỗ nào.
Update 1: Mình dùng visual studio. Nếu chạy bằng Debug thì cách 1 nhanh hơn cách 2 nhưng nếu chỉnh qua Release thì cách 2 nhanh hơn cách 1.