Phép nhân Vector nhân ma trận (V*M) thông thường và SSE trong C++

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.

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