SSE4 ma PMAXSD
lub PMAXUD
dla 32-bitowych liczb całkowitych podpisanych/bez znaku, co może być przydatne.
SSE2 ma MAXPD
i MAXSD
który porównywać i drugiej pary deblu, więc śledzić N/2-1 MAXPDs z jednej MAXSD aby uzyskać max wektora n, ze zwykłymi przeplotu ładunków i operacji.
Istnieje MIN odpowiedników powyższych.
Dla podwójnej przypadku, jesteś prawdopodobnie nie będziemy robić lepiej w asemblerze niż pół-przyzwoity kompilator C++ w trybie 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
gdzie min_max oblicza min i max tablicy 500 deblu 100000 razy stosując naiwny pętlę:
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;
}
w odpowiedzi na dwie części, tradycyjny optymalizacja usunięcie rozgałęzień z max pracy jest porównanie wartości dostać flagę jako śpiewać le bit (dając 0 lub 1), odejmij jedną (dając 0 lub 0xffff_ffff) i "i" ją z xor z dwóch możliwych wyników, więc otrzymasz równowartość (a > best ? (current_index^best_index) : 0)^best_index)
. Wątpię, by był prosty sposób na SSE, po prostu dlatego, że SSE ma tendencję do działania na spakowanych wartościach zamiast oznaczonych wartościach; istnieją pewne poziome operacje indeksu, więc możesz spróbować znaleźć maksimum, a następnie odjąć je od wszystkich elementów w oryginalnym wektorze, a następnie zebrać bit znaku, a zero z podpisem odpowiada indeksowi maksimum, ale prawdopodobnie nie być poprawą, chyba że używasz szortów lub bajtów.
Jaki jest język hosta? Jeśli jest to c/C++, nie przejmowałbym się tym zbytnio. –
max około 300 podwójnych jest w najbardziej wewnętrznej pętli dużego programu. 85% czasu spędza się w około 10 na 8000 linii kodu. Język hosta nie ma znaczenia tylko z tego powodu. Ale tak, to jest C++ –