Какие уловки делает процессор для оптимизации кода? - PullRequest
7 голосов
/ 07 ноября 2008

Я ищу такие вещи, как переупорядочение кода, которые могут даже нарушить код в случае нескольких процессоров.

Ответы [ 4 ]

13 голосов
/ 07 ноября 2008

Самым важным будет переупорядочение доступа к памяти.

При отсутствии ограждений памяти или инструкций сериализации процессор может изменить порядок доступа к памяти. Некоторые архитектуры процессоров имеют ограничения на то, сколько они могут переупорядочить; Альфа известна тем, что она самая слабая (то есть та, которая может переупорядочить больше всего).

Очень хорошее описание этой темы можно найти в исходной документации ядра Linux по адресу Documentation / memory-barriers.txt .

В большинстве случаев лучше использовать блокирующие примитивы из вашего компилятора или стандартной библиотеки; они хорошо протестированы, должны иметь все необходимые барьеры памяти и, вероятно, довольно оптимизированы (оптимизация блокирующих примитивов непроста; даже эксперты иногда могут их неправильно понять).

0 голосов
/ 07 ноября 2008

Ответ DavidK является правильным, однако также очень важно знать модель памяти для вашего языка / среды выполнения. Даже без условий гонки и с последовательной последовательностью и использованием мьютекса ваш код может все еще сломаться, когда данные кэшируются разными потоками, работающими в разных ядрах процессора. Некоторые языки, например, Java, обеспечивают состояние данных между потоками при использовании блокировки мьютекса, но редко бывает достаточно просто гарантировать, что никакие два потока не смогут одновременно получать доступ к данным. Вам нужно правильно использовать мьютекс, чтобы языковая среда выполнения синхронизировала состояние данных между двумя потоками. В Java это делается путем синхронизации двух потоков на одном и том же объекте.

Вот хорошая страница, объясняющая проблему и то, как она решается в модели памяти javas.

http://gee.cs.oswego.edu/dl/cpj/jmm.html

0 голосов
/ 07 ноября 2008

В Википедии есть довольно полный список методов оптимизации здесь .

0 голосов
/ 07 ноября 2008

Да, но каков именно ваш вопрос?

Однако, поскольку это интересная тема: уловки, которые используются компиляторами и процессорами для оптимизации кода, не должны нарушать код, даже с несколькими процессорами, при отсутствии условий гонки в этом коде. Это называется гарантией последовательной согласованности: если в вашей программе нет условий гонки, и все данные правильно заблокированы перед доступом, код будет вести себя так, как если бы он был выполнен последовательно.

Вот действительно хорошее видео, где Херб Саттер говорит об этом здесь:

http://video.google.com/videoplay?docid=-4714369049736584770

Каждый должен смотреть это:)

...