В сообщении от 1112255050 секунд после начала Эпохи Unix Вы написали:
> Ссылки на хорошие доки, естесственно, принимаются с особой
> благодарностью(очень хотелось бы -- по русски, но английские тоже в
> почёте, лишь бы хорошие).
"Серверы корпоративных баз данных", где-то на www.citforum.ru.
Помимо всего прочего, там затрагивается тема процессоров, дается
обзор различных архитектур, затрагиваются темы конвеерной и
суперскалярной обработки.
> Итак.
> 1.Для того, чтобы компилировать с использованием инструкций
> конкретного проца(3дноу, ммх, ссе) нужно, чтобы это было явно указано
> в исходниках, причём единственный способ указать -- ассемблерные
> вставки с использованием нужных инструкций.
Это верно относительно MMX, по крайней мене, проверено опытным путем.
Хотя в gcc(1) есть такая фраза (помечена *):
-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
<вырезано>
*To have SSE/SSE2 instructions generated automatically from float-
ing-point code, see -mfpmath=sse.
Далее:
-mfpmath=unit
Generate floating point arithmetics for selected unit unit. The
choices for unit are:
387 Use the standard 387 floating point coprocessor present major-
<вырезано>
This is the default choice for i386 compiler.
sse Use scalar floating point instructions present in the SSE
instruction set. This instruction set is supported by Pentium3
and newer chips, in the AMD line by Athlon-4, Athlon-xp and
Athlon-mp chips. The earlier version of SSE instruction set
supports only single precision arithmetics, thus the double and
extended precision arithmetics is still done using 387. Later
version, present only in Pentium4 and the future AMD x86-64
chips supports double precision arithmetics too.
> Опции гсс типа -мммх
> только лишь разрешают использование инструкций ммх, если они есть в
> коде.
These switches enable or disable the use of built-in functions that
allow direct access to the MMX, SSE, SSE2, SSE3 and 3Dnow exten-
sions of the instruction set.
Похоже что под фразой "built-in functions" тут подразумеваются функции
самого gcc.
> Если нет опции и инструкции есть в коде, как поступит копилятор?
Откомпилирует их (точнее ассемблирует их).
> 2.Дальше. Непонятным является момент такой. Можно компилить с
> оптимизацией mcpu= march=. Как я понял, mcpu позволяет оптимизировать
> код под конкретный процессор и не позволяет запускать его на другом
> проце( в смысле "семействе" процов)
Это зависит от архитектуры. Т.е. смысл опции `-mcpu' разный для разных
архитектур. Для архитектур "Intel 386 and AMD x86-64" `-mcpu'
эквивалентен `-mtune' (псевдоним), и задает оптимизацию под данный
процессор, при этом если задан `-march', то набор инструкций будет
тот, который задан опцией `-march'. Таким образом можно компилировать
код, оптимизированный, скажем под Pentium 4, но способный работать на
всем семействе i386. Что и применяется, например в Fedora.
> (в отличие от march, оторый
> оптимизирует под проц и позволяет запускать на другом семействе
> процов).
Тут Вы перепутали. `-march' задает набор используемых инструкций.
Например если задан набор инструкций `athlon-xp', то код не будет
работать на Pentium.
> В чём же заключается эта
> оптимизация, если не юзать вещи типа ммх?
Как уже тут говорили, порядок команд, использование в конкретных
случаях одних регистров вместо других, и тому подобные махинации.
> В чём смысл указания обоих
> аргументов(march= и mcpu=)?
Если оба значения одинаковы, то по крайней мере для gcc 3.4.2, нет
смысла указывать обе опции, достаточно указать `-march'. Как с
другими версиями gcc, не знаю.
> 3.В чём смысл сборки у себя на машине с "заточкой под конкретное
> железо"(раньше, я по наивности полагал, что именно в ммх и т.д.).
> Возможно, смысл в том, что удаляются ненужные инструкции?
Инструкции генерируются так, чтобы код работал на данном процессоре
быстрее, т.е. с учетом его внутренних особенностей.
Литература:
1. man gcc