SSE4 có PMAXSD
hoặc PMAXUD
cho số nguyên 32 bit đã ký/không dấu, có thể hữu ích.
SSE2 có MAXPD
và MAXSD
so sánh giữa các cặp đôi, vì vậy bạn thực hiện theo n/2-1 MAXPD với một MAXSD để nhận được tối đa vectơ của n, với sự xen kẽ thông thường của tải và thao tác.
Có MIN tương đương ở trên.
Đối với trường hợp tăng gấp đôi, bạn có lẽ sẽ không làm tốt hơn trong lắp ráp hơn một trình biên dịch ++ C nửa phong nha trong chế độ SSE:
peregrino:$ g++ -O3 src/min_max.cpp -o bin/min_max
peregrino:$ g++ -O3 -msse4 -mfpmath=sse src/min_max.cpp -o bin/min_max_sse
peregrino:$ time bin/min_max
0,40
real 0m0.874s
user 0m0.796s
sys 0m0.004s
peregrino:$ time bin/min_max_sse
0,40
real 0m0.457s
user 0m0.404s
sys 0m0.000s
nơi min_max tính min và max của một mảng của 500 đôi 100.000 lần sử dụng một vòng lặp ngây thơ:
bool min_max (double array[], size_t len, double& min, double& max)
{
double min_value = array [ 0 ];
double max_value = array [ 0 ];
for (size_t index = 1; index < len; ++index) {
if (array [ index ] < min_value) min_value = array [ index ];
if (array [ index ] > max_value) max_value = array [ index ];
}
min = min_value;
max = max_value;
}
để đối phó với phần hai, việc tối ưu hóa truyền thống để loại bỏ nhánh từ một hoạt động tối đa là so sánh các giá trị, có cờ như một hát le bit (cho 0 hoặc 1), trừ một (cho 0 hoặc 0xffff_ffff) và 'và' nó với xor của hai kết quả có thể, do đó bạn nhận được tương đương với (a > best ? (current_index^best_index) : 0)^best_index)
. Tôi nghi ngờ có một cách SSE đơn giản để làm điều đó, đơn giản bởi vì SSE có xu hướng hoạt động trên các giá trị đóng gói hơn là các giá trị được gắn thẻ; có một số hoạt động chỉ mục ngang, vì vậy bạn có thể thử tìm giá trị tối đa, sau đó trừ đi tất cả các phần tử trong vector gốc, sau đó thu thập bit dấu, và ký hiệu số không tương ứng với chỉ mục của giá trị tối đa, nhưng có thể không phải là một cải tiến trừ khi bạn đang sử dụng quần short hoặc byte.
Nguồn
2009-12-28 15:01:23
Ngôn ngữ máy chủ là gì? Nếu nó là c/C++ tôi sẽ không lo lắng về nó quá nhiều. –
tối đa khoảng 300 đôi là trong vòng lặp lớn nhất của chương trình lớn. 85% thời gian được chi tiêu trong khoảng 10 trong số 8'000 dòng mã. Ngôn ngữ máy chủ không quan trọng chỉ vì điều đó. Nhưng có nó là C + + –