РЕДАКТИРОВАТЬ: это был мой ответ на попытку, но, пожалуйста, посмотрите комментарии, в которых @BenVoigt предлагает лучший способ оптимизировать выражение.
- Вам нужно пройти весь список хотя бы один раз
- поэтому нужно найти более эффективное выражение для
if (d>max) max=d
, если таковое имеется.
Предполагая, что нам нужен общий случай, где список не отсортирован (если мы оставим его отсортированным, мы просто выберем последний элемент, как указывает @IgnacioVazquez в комментариях), и немного изучим ветвь предсказание (Почему это быстрее обрабатывать отсортированный массив, чем несортированный массив?, см. 4-й ответ), выглядит так
if (d>max) max=d;
можно более эффективно переписать как
max=d>max?d:max;
Причина в том, что первый оператор обычно преобразуется в ветвь (хотя это полностью зависит от компилятора и языка, но, по крайней мере, в C и C++, и даже в языке на основе VM, таком как Java происходит), а второй преобразуется в условный ход.
Современные процессоры имеют большой штраф в ответвлениях, если предсказание идет не так (конвейеры выполнения должны быть сброшены), в то время как условное перемещение — это атомарная операция, которая не влияет на конвейеры.
Случайный характер элементов в списке (один из них может быть больше или меньше текущего максимума с равной вероятностью) приведет к тому, что многие предсказания ветвления будут ошибочными.
Пожалуйста, обратитесь к связанному вопросу для хорошего обсуждения всего этого вместе с тестами.
person
rupps
schedule
07.12.2014
if (d>max) max=d
- person rupps   schedule 07.12.2014#pragma omp parallel for reduction(max : max)
перед цикломfor
. Здесь второй максимум относится кdouble max
. Он автоматически пересекает трубы. - person Thomas   schedule 07.12.2014