Tôi đang tối ưu hóa một số mã cho kiến trúc vi mô Intel x86 Nehalem sử dụng nội tại SSE.Cách hiệu quả nhất để lưu trữ các sản phẩm 4 chấm vào một mảng liền kề trong C bằng cách sử dụng nội tại SSE
Một phần chương trình của tôi tính các sản phẩm 4 chấm và thêm mỗi kết quả vào các giá trị trước đó trong một đoạn liền kề của một mảng. Cụ thể hơn,
tmp0 = _mm_dp_ps(A_0m, B_0m, 0xF1);
tmp1 = _mm_dp_ps(A_1m, B_0m, 0xF2);
tmp2 = _mm_dp_ps(A_2m, B_0m, 0xF4);
tmp3 = _mm_dp_ps(A_3m, B_0m, 0xF8);
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
Lưu ý rằng tôi sẽ sử dụng 4 thanh ghi xmm tạm thời để giữ kết quả của mỗi sản phẩm chấm. Trong mỗi thanh ghi XMM, kết quả được đặt vào một độc đáo 32 bit so với thanh ghi XMM tạm thời khác như vậy mà kết quả cuối cùng trông như thế này:
tmp0 = R0-zero-zero-zero
tmp1 = zero -R1-zero-zero
tmp2 = zero-zero-R2-zero
tmp3 = zero-zero-zero-R3
tôi kết hợp các giá trị chứa trong mỗi biến tmp vào một biến XMM bởi tổng hợp chúng với các hướng dẫn sau:
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
Cuối cùng, tôi thêm thanh ghi chứa tất cả 4 kết quả của các sản phẩm chấm cho một phần tiếp giáp của một mảng để chỉ số của mảng được tăng lên bởi một sản phẩm dấu chấm, như vậy (C_0n là 4 giá trị hiện tại mảng được cập nhật; C_2 là địa chỉ trỏ đến những 4 giá trị):
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
Tôi muốn biết nếu có một cách ít tròn về, hiệu quả hơn để lấy kết quả của các sản phẩm chấm và thêm chúng vào các đoạn tiếp giáp của mảng. Bằng cách này, tôi đang thực hiện 3 bổ sung giữa các thanh ghi chỉ có 1 giá trị khác 0. Có vẻ như có một cách hiệu quả hơn để thực hiện việc này.
Tôi đánh giá cao tất cả trợ giúp. Cảm ơn bạn.
Bạn vẫn phải thêm giá trị cũ (C_0n) vào từng sản phẩm chấm trước cửa hàng. Tất cả chúng đều độc lập, vì vậy nó có thể không quá chậm, nhưng nó không đẹp hơn nhiều :) – celion