2008-11-07 4 views
7

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

+0

Не могли бы вы обновить, чтобы фраза это в виде вопроса? – 2008-11-07 14:36:58

+0

Вы имеете в виду компилятор? Потому что вы получите дико разные ответы ... – 2008-11-07 14:36:59

+0

Какой комплимент? Какая платформа? – 2008-11-07 14:37:31

ответ

0

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

0

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

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

Существует очень хорошее видео Herb Sutter говорить об этом здесь:

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

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

13

Важнейшим из них является переупорядочение доступа к памяти.

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

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

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

0

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

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

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

Смежные вопросы