SSE4 имеет PMAXSD
или PMAXUD
для 32-битных подписных/беззнаковых целых чисел, что может быть полезно.
SSE2 имеет MAXPD
и MAXSD
которые сравнивают между и между парами двойников, так что вы будете следовать п/2-1 MAXPDs с одним MAXSD, чтобы получить максимум вектора п, с обычным переплетением нагрузок и операций.
Имеются эквиваленты MIN, указанные выше.
Для двойной случае, вы, вероятно, не будет делать лучше на ассемблере, чем наполовину приличная компилятор C++ в режиме 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
где min_max вычисляет минимальное и максимальное из массива 500 дублей 100000 раз, используя наивный цикл:
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;
}
в ответ на вторую часть традиционной оптимизации для удаления разветвлений от максимальной операции сравнить значения, получить флаг как грех gle bit (давая 0 или 1), вычтите один (давая 0 или 0xffff_ffff) и 'и' его с xor двух возможных результатов, так что вы получите эквивалент (a > best ? (current_index^best_index) : 0)^best_index)
. Я сомневаюсь, что есть простой способ SSE сделать это просто потому, что SSE имеет тенденцию работать с упакованными значениями, а не с мечеными значениями; есть некоторые операции с горизонтальным индексом, поэтому вы можете попробовать найти max, а затем вычесть это из всех элементов исходного вектора, затем собрать знаковый бит, а нулевой знак соответствия будет соответствовать индексу max, но это, вероятно, будет не будет улучшения, если вы не используете шорты или байты.
Что такое основной язык? Если это c/C++, я бы не стал слишком беспокоиться об этом. –
Максимум около 300 удваивается в самой внутренней петле большой программы. 5% времени проводится примерно в 10 из 8'000 строк кода. Язык хоста не имеет значения только из-за этого. Но да, это C++ –