SSE4 a PMAXSD
ou PMAXUD
pour les entiers 32 bits signés/non signés, ce qui peut être utile.
SSE2 a MAXPD
et MAXSD
qui comparent entre et à travers paires de doubles, de sorte que vous suivez n/2-1 MAXPDs avec un maxsd pour obtenir le maximum d'un vecteur de n, avec l'entrecroisement habituelle des charges et des opérations.
Il existe des équivalents MIN de ce qui précède.
pour le double cas, vous n'êtes probablement pas faire mieux en assembleur d'un C demi-décent ++ compilateur en mode ESS:
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
où min_max calcule min et max d'un tableau de 500 doubles 100.000 fois en utilisant une boucle naïve:
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;
}
En réponse à la deuxième partie, l'optimisation traditionnelle pour éliminer les ramifications d'une opération max est de comparer les valeurs, obtenir le drapeau comme chanter le bit (donnant 0 ou 1), soustraire un (donnant 0 ou 0xffff_ffff) et 'et' avec le xor des deux résultats possibles, donc vous obtenez l'équivalent de (a > best ? (current_index^best_index) : 0)^best_index)
. Je doute qu'il existe une méthode SSE simple pour cela, simplement parce que SSE a tendance à opérer sur des valeurs condensées plutôt que sur des valeurs étiquetées; il y a quelques opérations d'index horizontales, donc vous pourriez essayer de trouver le maximum, puis soustraire cela de tous les éléments du vecteur original, puis rassembler le bit de signe, et le zéro signé correspondrait à l'index du maximum, mais cela ne pas être une amélioration, sauf si vous utilisiez des shorts ou des octets.
Quelle est la langue d'hôte? Si c'est c/C++ je ne m'en soucierais pas trop. –
max d'environ 300 doubles est dans la boucle la plus intérieure du grand programme. 85% du temps est consacré à environ 10 des 8'000 lignes de code. La langue du pays hôte n'a pas d'importance à cause de cela. Mais oui c'est C++ –