Оптимизация для pentium процессора планирование операций с плавающей точкой


Содержание

Оптимизация для pentium процессора планирование операций с плавающей точкой

27.1 Инструкция LEA (все процессоры)

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

Гораздо быстрее, чем

Инструкцию LEA можно использовать, чтобы делать сложение или сдвиг без изменения флагов. Источник и назначение не обязательно должны быть размером в слово, поэтому ‘LEA EAX,[BX]’ может стать возможной заменой для ‘MOVZX EAX,BX’, хотя на многих процессорах это не совсем оптимально.

Как бы то ни было, вам следует знать, что инструкция LEA вызывает задержку AGI на PPlain и PMMX, если она использует базовый или индексный регистр, в которой была произведена запись в предыдущем такте.

Так как инструкция LEA спариваема в V-конвеер на PPlain и PMMX, а инструкции сдвига — нет, вы можете использовать LEA в качестве замены SHL на 1, 2 или 3, если вы хотите, чтобы инструкция выполнялась в V-конвеере.

У 32-х битных конвееров нет документированного режима адресации с только индексным регистром, поэтому инструкция LEA EAX,[EAX*2] на самом деле записывается как ‘LEA EAX,[EAX*2+00000000] с 4-х байтовым смещением. Вы можете снизить размер инструкции, написав ‘LEA EAX,[EAX+EAX]’ или, что еще лучше, ‘ADD EAX,EAX’. Последний вариант не приведет к задержке AGI на PPlain и PMMX. Если случилось так, что у вас есть регистр, равный нулю (например, счетчик цикла после последнего прохода), вы можете использовать его как базовый регистр, чтобы снизить размер кода:

27.2 Деление (все процессоры)

Деление отнимает очень много времени. На PPro, PII и PIII целочисленное деление занимает 19, 23 или 39 для байта, слова и двойного слова соответственно. На PPlain и PMMX беззнаковое челочисленное деление занимает приблизительно то же время, хотя деление со знаком занимает немного больше. Поэтому более предпочтительно использовать операнды маленького размера, которые не вызовут переполнения, даже если это будет стоить префикса размера операнда, и использовать по возможности беззнаковое деление.

Целочисленное деление на константу (все процессоры)

Целочисленное деление на степень от двух можно сделать, сдвигая значение вправо. Деление беззнакового целого числа на 2N:

Деление целого числа со знаком на 2N:

Альтернативный SHR короче, чем ‘AND if N > 7, но может попасть только в порт 0 (или U-конвеер), в то время как AND может попасть как в порт 0, так и в порт 1 (U- или V-конвеер).

Деление на константу можно сделать на обратное число. Чтобы произвести беззнаковое целочисленное деление q = x / d, вам вначале нужно посчитать число, обратное делителю, f = 2r / d, где r определяет позицию двоично-десятичной точки (точка основания системы счисления). Затем нужно умножить x на f и сдвинуть полученный результат на r позиций вправо. Максимальное значение r равно 32+b, где b равно числу двоичных цифр в d минус 1. (b — это самое большое целое число, для которого 2b

Предположите, что вы хотите разделить на 5.

Дробная часть больше, чем половина: используем случай C. Округляем f вверх до 0CCCCCCCDh.

Следующий код делит EAX на 5 и возвращает результат в EDX:

После умножения EDX содержит значение, сдвинутое вправо на 32. Так как r = 34, вам нужно сдвинуть еще на 2, чтобы получить окончательный результат. Чтобы поделить на 10, вам нужно всего лишь заменить последнюю строку на ‘SHR EDX,3’.

В случае B у вас будет следующее:

Этот код работает для всех значений x, кроме 0FFFFFFFFH, которое дает ноль из-за переполнения в инструкции INC. Если возможно, что x = 0FFFFFFFFH, тогда замените этот код на:

Если значение x ограничено, тогда вам следует использовать меньшее значение r, то есть меньшее количество цифр. Может быть несколько причин для того, чтобы сделать это:

вы можете установить r = 32 и избежать ‘SHR EDX,b’ в конце.

вы можете установить r = 16+b и использовать инструкции умножения, которые дают 32-х битный результат, вместо 64-х битного. Тогда можно освободить регистр EDX: IMUL EAX,0CCCDh / SHR EAX,18

вы можете выбрать значение r, которое будет чаще приводить к случаю C, а не B, чтобы избежать инструкции ‘INC EAX’.

Максимальное значение x в этих случаях равно по крайней мере 2r-b, иногда выше. Вы должны делать систематические тесты, если хотите узнать точное максимально значение x, при котором ваш код будет работать корректно.

Вы можете заменить медленную инструкцию умножения более быстрыми инструкциями, как это объяснено в главе 26.5.

Следующий пример делит EAX на 10 и возвращает результат в EAX. Я выбрал r=17, а не 19, потому что это дает код, который легче оптимизировать, и он покрывает такое же количество значений x. f = 217 / 10 = 3333h, случай B: q = (x+1)*3333h:

Проведенные тесты показываеют, что этот код работает правильно для всех значений x Повторяемое деление целого цисла на одно и то же значение (все процессоры)

Если делитель не известен во время ассемблирования программы, но вы делите на одно и то же число несколько раз, вы тоже можете использовать данный метод. Код должен определить, с каким случаем (A, B и C) он имеет дело, и высчитать f до совершения делений.

Следующий далее код показывает, как делать несколько делений на одно и то же число (беззнаковое деление с усечением). Сначала вызовите SET_DIVISOR, чтобы установить делитель и обратное ему число, затем вызовите DIVIDE_FIXED для каждого значения, которое нужно разделить на один и тот же делитель.

Этот код даст тот же результат, что и инструкция DIV для 0 Деление чисел с плавающей запятой (все процессоры)

Деление чисел с плавающей запятой занимает 38 или 39 тактов при самой высокой точности. Вы можете сэкономить время, указав более низкую точность в контрольном слове (на PPlain и PMMX только FDIV и FIDIV более быстры при низкой точности; на PPro, PII и PIII это также относится к FSQRT. Выполнение других инструкций убыстрить этим способом нельзя).

Параллельное деление (PPlain и PMMX)

На PPlain и PMMX можно производить деление числа плавающей запятой и целочисленное деление параллельно. На PPro, PII и PIII это не возможно, потому что целочисленное деление и деление чисел с плавающей запятой используют один и тот же механизм.

Пример: A = A1 / A2; B = B1 / B2

Убедитесь, что вы установили в контрольном слове FPU желаемый метод округления.

Использование обратных инструкций для быстрого деления (PIII)

На PIII вы можете использовать быстрые обратные инструкции RCPSS или PCPPS с делителем, а затем умножить на делимое. Правда, точность будет всего 12 бит. Вы можете повысить ее до 23-х, использовав метод Ньютона-Рафсона, объясненного в интеловской сопроводительной заметке AP-803:

где x0 — это первое приближение к обратному от делителя d, а x1 — лучшее приближение. Вы должны использовать эту формулу перед умножение на делимое:

Это позволяет сделать 4 деления за 18 тактов с точностью 23 бита. Повышение точность, повторяя формулу Ньютона-Рафсона возможно, но не очень выгодно.

Если вы хотите использовать этот метод для целочисленных делений, тогда вам нужно проверять результаты на ошибки округления. Следующие код делает четыре деления с усечением на упакованных целых числах размером в слово за примерно 42 такта. Это дает точные результаты для 0

Этот код проверяет, не слишком ли мал результат и делает соответствующую коррекцию. Не нужно проверять, если результат слишком велик.

Избегание делений (все процессоры)

Очевидно, что вам минимизировать количество делений. Деления плавающей запятой на константу или повторяющиеся деления на одно и то же значения следуюет делать через умножения на обратное число. Но есть много других ситуаций, когда вы можете снизить количество делений. Например: if (A/B >c) можно переписать как if (A > B*C), если B положительны, и как обратное сравнение, если B отрицательны.

A/B + C/D можно переписать как (A*D + C*B) / (B*D)

Если вы используете целочисленное деление, вам стоит остерегаться того, что ошибки округления могут стать другими после переписывания формул.

27.3 Освобождение регистров FPU (все процессоры)

Вы должны освободить все использованные регистры FPU до выходы из подпрограммы, не считая регистра, использованного для возвращения результата.

Самый быстрые способ освободить один регистр — это FSTP ST. Самый быстрый способ освбодить два регистра на PPlain и PMMX — это FCOMPP, на PPro, PII и PIII вы можете использовать как FCOMPP, так и FSTP ST дважды.

Не рекомендуется использовать FFREE.

27.4 Переход от инструкций FPU к MMX и обратно (PMMX, PII и PIII)

Вы должны выполнить инструкцию EMMS после инструкции MMX, за которой может последовать код с инструкциями FPU.

На PMMX переключение между инструкциями FPU и MMX вызывает высокие потери. Выполнение первой инструкции FPU после EMMS занимает примерно на 58 тактов больше, а первой инструкции MMX после инструкции FPU — на 38 тактов больше.

На PII и PIII подобных потерь нет. Задержку после EMMS можно скрыть, поместив целочисленные инструкции между EMMS и первой инструкции FPU.

27.5 Конвертации чисел с плавающей запятой в целые (все процессоры)

Все подобные конверсии и обратно должны осуществляться через память:

На PPro, PII и PIII этот код может вызвать потерит из-за попытки считать из [TEMP] до того, как закончена запись туда же, потому что инструкция FIST медленная (глава 17). WAIT не поможет (глава 26.6). Рекомендуется поместить другие инструкции между записью в [TEMP] и чтением оттуда, что бы избежать этих потерь. Это относится ко всем примерам, которые последуют в дальнейшем.

Спецификация языка C и C++ требует, чтобы конверсия из чисел с плавающей запятой в целые числа осуществлялась с помощью усечения, а не округления. Метод, используемый большинством библиотек C, это изменение контрольного слова FPU, чтобы указать инструкции FISTP на усечение, и изменение контрольного слова в прежнее состояние после ее выполнения. Это метод очень медленнен на всех процессорах. На PPro, PII и PIII контрольное слово FPU не может быть переименовано, поэтому все последующие инструкции плавающей запятой будут ждать, пока инструкция FLDCW не будет выведена из обращения.

Если вам нужно осуществить конверсию числа с плавающей запятой в C или C++, вам следует подумать о том, не лучше ли вам использовать округление вместо усечения. Если ваша стандартная библиотека не поддерживает быструю функцию округления, тогда сделайте свою собственную, используя примеры примеры, приведенные ниже.

Если вам нужно усечение внутри чикла, вы можете изменить контрольное слово за его пределами, если инструкции плавающей запятой внутри цикла могут корректно работать с данным режимом конвериторования.

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

Округление к ближайшему

Усечение к нулю

Усечение к минус бесконечности

Эти процедуры работают для -231 Альтернатива инструкции FISTP (PPlain и PMMX)

Конвертирование числа с плавающей запятой в целое обычно осуществляется следующим образом:

Альтернативный метод заключает в:

Добавление ‘волшебного числа’ 251+252 есть такой эффект, что любое целое число между -231 и +231 будет выравнено в нижних 32-х битах, когда сохраняется как число с плавающей запятой двойной точности. Результат будет такой же, какой бы вы получили с помощью инструкции FISTP со всеми методами окруления, кроме усечения к нулю. Результат будет отличаться от FISTP, если в контрольном слове задано усечение или в случае переполнения. Вам может потребоваться инструкция WAIT для совместимости со старым 80287 процессором (глава 26.6)

Этот метод не быстрее использования FISTP, но он дает большую гибкость на PPlain и PMMX, потому между FADD и FSTP 3 такта, которые можно заполнить другими инструкциями. Вы можете умножить или разделить число на степень от друх в той же операции, сделав обратно по отношению к магическому числу. Вы также можете добавить константу, добавив ее к магическому числу, которое тогда будет иметь двойную точность.

27.6 Использование целочисленных инструкция для осуществления операций плавающей запятой (все процессоры)

Целочисленные операции в большинстве своем быстрее, чем инструкции плавающей запятой, поэтому зачастую выгоднее использовать их для осуществления простых операций плавающей запятой. Наиболее очевидное применение — это перемещение данных.

Тестируем, не равно ли значение с плавающей запятой нулю:

Значение с плавающей запятой, равное нулю, обычно представляется как 32 или 64 обнуленных бита, но здесь есть один подводные камень: бит знака может быть равен нулю! Минус ноль считается правильным числом с плавающей запятой, и процессор может сгенерировать ноль с уставноленным битом знака, если, например, отрицательное число было умножено на ноль. Поэтому если вы хотите узнать, не равно ли число с плавающей запятой нулю, вам не следует тестировать бит знака.

Используйте целочисленные инструкции вместо этого и сдвиньте бит знака:

Если число с плавающей запятой имеет двойную точность (QWORD), тогда вам нужно протестировать только биты 32-62. Если они равны нулю, тогда нижняя половина будет также равна нулю, если это верное число с плавающей запятой.

Тест на то, отрицательно ли значение:

Число с плавающей запятой отрицательно, если бит знака и установлен по крайней мере один бит.

Манипулирование битом знака:

Вы можете изменить знак числа с плавающей запятой просто инвертирововав бит знака:

Похожим образом вы можете получить асбсолютное значение числа с плавающей запятой, просто сANDив бит знака:

Числа с плавающей запятой сохраняются в особом формате, который позволяет использовать целочисленные инструкции для сравнения чисел с плавающей запятой, не считая бита знака. Если вы уверены, что оба сравниваемые числа с плавающей запятой являются правильными и положительными, вы можете простой сравнить их как целые:

Этот метод работает только, если у двух чисел одна и та же точность, и вы уверены, что ни у одного из числа не установлен бит знака.

Если возможны отрицательные числа, вы можете их сконвертировать определенным образом и сделать знаковое сравнение:

Этот метод работает для всех правильных чисел с плавающей запятой, включая -0.

27.7 Использование инструкции с плавающей запятой, чтобы осуществлять целочисленные операции (PPlain и PMMX)

Целочисленное умножение (PPlain и PMMX)

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

На PMMX инструкции умножения MMX быстрее, чем целочисленное умножение, и могут конвееризоваться, поэтому одним из лучших решений на PMMX может быть использование этих инструкций на PMMX, если вы можете жить с 16-ти битной точностью.

Целочисленное умножение быстрее, чем умножение с плавающей запятой на PPro, PII и PIII.

Целочисленное деление (PPlain и PMMX)

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

Конвертирование двоичных чисел в десятичные (все процессоры)

Использование инструкции FBSTP — простой и удобный путь для того, чтобы конвертировать двоичные числа в десятичные, хотя не обязательно самый быстрый метод.

27.8 Перемещение блоков данных (все процессоры)

Есть несколько способов перемещения блоков данных. Наиболее общий метод — это REP MOVSD, но при определенных условиях другие методы быстрее.

На PPlain и PMMX быстрее переместить 8 байтов за раз, если место назначения не находится в кэше:

Источник и место назначения должны быть выравнены на 8. Дополнительное время, используемое медленными инструкциями FILD и FISTP компенсируется тем, что вам требуется сделать в два раза меньше операций записывания. Обратите внимание, что этот метод имеет преимущество только на PPlain и PMMX и только тогда, когда место назначения не находится в кэше первого уровня. Вы не можете использовать FLD и FSTP (без I) с противоположными последовательностями битов, потому что ненормальные числа обрабатываются медленно и не гарантируется, что они останутся неизмененными.

На PMMX, если назначение не находится в кэше, быстрее использовать инструкции MMX для перемещения восьми байтов за раз, если место назначения не находится в кэше.

Данный цикл не нужно оптимизировать или разворачивать, если ожидаются промахи кэша, потому что здесь узкое место — это доступ к памяти, а не выполнение инструкций.

На процессорах PPro, PII и PIII инструкция REP MOVSD особенно быстра, если соблюдены следующие условия:

источник и назначение должны быть выравнены на 8

направление должно быть вперед (очищен флаг направления)

счетчик (ECX) должен быть больше или равен 64

разность между EDI и ESI должна быть больше или равна 32

На PII быстрее использовать регистры MMX, если вышеприведенные условия не соблюдены и место назначения находится в кэше первого уровня. Цикл можно развернуть в два раза, а источник и назначение должны быть выравнены на 8.

На PIII самый быстрый путь перемещения данных — это использовать инструкцию MOVAPS, если вышеприведенные условия не соблюдены или если место назначения не находится в кэше первого или второго уровня:

В отличии от FLD, MOVAPS может обрабатывать любую пследовательность битов без всяких проблем. Помните, что источник и назначение должны быть выравнены на 16.

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

На PIII у вас также есть опция прямой записи в RAM-память без вовлечения кэша, используя инструкцию MOVNTQ или MOVNTPS. Это может быть полезным, если вы не хотите, чтобы место назначение попало в кэш. MOVNTPS чуть-чуть быстрее, чем MOVNTQ.

27.9 Самомодифицирующийся код (все процессоры)

Потери при выполнении кода сразу после того, как тот был изменен, занимают примерно 19 тактов на PPlain, 31 на PMMX и 150-300 на PPro, PII и PIII. Процессоры 80486 и более ранние требуют переход между модифицирующим и модифицируемым кодом, чтобы очистить кэш кода.

Чтобы получить разрешение на модифицирование кода в защищенное операционной системе, вам потребуется вызвать специальные системные функции: в 16-битной Windows это ChangeSelector, в 32-х битной Windows — VirtualProtect и FlushInstructionCache (или поместить код в сегмент данных).

Самомодифицирующийся код не считается хорошим тоном программирования, но можно пойти на его применение, если выигрыш в скорости значителен.

27.10 Определение типа процессора (все процессоры)

Я думаю, что теперь достаточно очевидно, что оптимальное для одного процессора может не являться таковым для другого. Вы можете сделать несколько вариантов наиболее критичных участков кода вашей программы, чтобы они выполнялись максимально быстро на любом процессоре. Однако вам потребуется определить, на каком процессоре программа выполняется в настоящий момент. Если вы используете инструкции, которые не поддерживаются всеми процессорами, т.е. условные перемещения, FCOMI, инструкции MMX и XMM), то вы можете сначала проверить, поддерживает ли процессор данные инструкции. Процедура, приведенная ниже, проверяет тип процессора и поддерживаемые им технологии.

Обратите внимание, что некоторые операционные системы не позволяют использовать инструкции XMM. Информация о том, как узнать, поддерживает ли операционная система инструкции XMM, можно найти в интеловской инструкции AP-900: «Identifying support for Streaming SIMD Extensions in the Processor and Operating System». Больше информации о идентификации процессора можно найти в инструкции AP-485: «Intel Processor Identification and the CPUID Instruction».

«Оптимизация для PENTIUM процессора» — читать интересную книгу автора

ОПТИМИЗАЦИЯ ДЛЯ PENTIUM ПРОЦЕССОРА
**********************************
Права на распространение Ангера Фога, (c) 1996
Перевод Дмитрия Померанцева, (c) 1997 FTS Labs.

0. примечание переводчика
1. введение
2. литература
3. отладка и проверка
4. модель памяти
5. выравнивание
6. кеш
7. блокировка генерации адреса (AGI)
8. спаривание инструкций
9. исполнение кода в цикле
10. неполное спаривание
11. замена сложных инструкций на более простые
12. переходы и ветви
13. префиксы
14. уменьшение длины кода
15. планирование операций с плавающей точкой
16. оптимизация цикла
17. обзор специальных инструкций

18. целые числа вместо чисел с плавающей точкой
19. числа с плавающей точкой вместо целых чисел
20. список целочисленных инструкций
21. список инструкций с плавающей точкой
22. скоростные испытания
23. соображения о других микропроцессорах

0. ПРИМЕЧАНИЕ ПЕРЕВОДЧИКА
=========================
Прежде всего я хочу сказать, что я не являюсь профессиональным переводчиком
и ранее не занимался переводами технической документации. Возможно, где то
в тексте будут встречаться литературные огрехи, но в любом случае —
документация на английском языке из любопытной вещи превратилась во вполне
понятное руководство, пригодное к повседневной работе.

И так, прежде всего несколько неточностей — что бы не загромождать текст
фразами типа: «инструкции, оперирующие с числами с плавающей точкой», я
просто называю их «инструкции с плавающей точкой», справедливо пологая, что
от технического руководства не будут требовать литературных изысков. Подобная
ситуация наблюдается и с целыми числами. Надеюсь, что теперь вы правильно меня
поймете и подобные выражения в тексте не будут вызывать праведный гнев.

В остальном же я старался при переводе сохранить первоначальный смысл текста,
передать его вам без искажений. Пользуйтесь на здоровье.

Оптимизация для pentium процессора планирование операций с плавающей точкой

Для процессоров семейства x86 с 8086/8088 по 386, модуль операций с плавающей запятой был выделен в отдельную микросхему, называемую математическим сопроцессором. Для установки сопроцессора на плате компьютера предусматривался отдельный разъём.

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

Одна из схем взаимодействия центрального процессора и сопроцессора, применяемая, в частности, в x86 сопроцессорах, реализуется следующим образом:

  • Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
  • Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды. Центральный процессор, наоборот, игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение. Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов), он выполняет его через захват шины.
  • После получения команды и необходимых данных сопроцессор начинает её выполнение. Пока сопроцессор выполняет команду, центральный процессор выполняет программу дальше, параллельно с вычислениями сопроцессора. Если следующая команда также является командой сопроцессора, процессор останавливается и ожидает завершения выполнения сопроцессором предыдущей команды.
  • Также существует специальная команда ожидания (FWAIT), принудительно останавливающая процессор до завершения вычислений (если для продолжения программы необходимы их результаты).
Илон Маск рекомендует:  PHP статьи, примеры кодов, создание сайтов на php

Начиная с процессора 486SX модуль FPU отключался (в эту линейку попадали процессоры с бракованным FPU). Для процессоров 486SX также выпускался «сопроцессор» 487SX, но, фактически, он являлся процессором 486DX и при его установке процессор 486SX отключался.

Несмотря на интеграцию, FPU в процессорах i486 представляет собой неизменный сопроцессор, выполненный на том же кристалле, более того, схема FPU i486 полностью идентична сопроцессору предыдущего поколения 387DX вплоть до тактовой частоты (в два раза меньшей, чем частота центрального процессора). Настоящая интеграция FPU c центральным процессором началась только в процессорах Pentium модели MMX.

Сопроцессоры x86 от сторонних производителей

Широкое распространение в соответствующий период получили сопроцессоры для платформы x86, выпускавшиеся компанией Weitek — ею были выпущены 1167, 2167 в виде набора микросхем и микросхемы 3167, 4167, для процессоров 8086, 80286, 80386, 80486, соответственно. По сравнению с сопроцессорами от Intel они обеспечивали в 2-3 раза большую производительность, но обладали несовместимым программным интерфейсом, реализованным через технологию memory-mapping. Она сводилась к тому, что основной процессор должен был записывать информацию в те или иные области памяти, контролируемые Weitek-овским сопроцессором (собственно, оперативной памяти там, конечно не было). Конкретный адрес, куда производилась запись, интерпретировался в качестве той или иной команды. Несмотря на несовместимость, сопроцессоры от Weitek были широко поддержаны как разработчиками ПО, так и производителями материнских плат, предусматривавших на них гнёзда для установки такой микросхемы.

Ряд других компаний также выпускал различные несовместимые математические сопроцессоры, реализуя интерфейс к ним через порты ввода-вывода или прерывания

Компании-производители клонов выпускали совместимые с 80287 80387 сопроцессоры, работавшие быстрее аналогичных интеловских. Среди этих компаний можно упомянуть AMD, Chips & Technologies (C&T). Иногда система команд этих сопроцессоров расширялась несколькими несовместимыми, например, аналог 80287 от C&T содержал команды для работы с вектором из четырёх значений с плавающей точкой. Серьёзной поддержки от производителей ПО эти расширенные команды не получили.

Просессоры EMC87 от фирмы

В СССР выпускалась микросхема (КМ)1810ВМ87, которая являлась аналогом 8087

Другие платформы

Аналогично, материнские платы ПК, построенных на процессорах

Компания Weitek также выпускала математические сопроцессоры для платформ 68000 и

Устройство FPU

Модуль операций с плавающей запятой представляет собой стековый калькулятор, работающий по принципу обратной польской записи. Перед операцией аргументы помещаются в LIFO-стек, при выполнении операции необходимое количество аргументов снимается со стека. Результат операции помещается в стек, где может быть использован в дальнейших вычислениях или может быть снят со стека для записи в память. Также поддерживается и прямая адресация аргументов в стеке относительно вершины.

Внутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же или чтения из памяти могут использоваться:

  • один из трёх форматов с плавающей точкой (32, 64 и 80 бит),
  • целочисленные форматы (16, 32 и 64 бита),
  • 80-битный BCD-формат.

Поддерживаемые математические операции: арифметические операции, сравнение, деление по модулю, округление, смена знака, модуль, квадратный корень, синус, косинус, частичный тангенс, частичный арктангенс, загрузка константы (0, 1, число пи, log2(10), log2(e), lg(2), ln(2)) и некоторые другие специфические операции.

FPU умеет обрабатывать пограничные состояния с помощью специальных значений, представимых форматом с плавающей запятой:

  • денормализованное число (число, близкое к переполнению; при дальнейшем возрастании модуля денормализованное число становится бесконечностью),
  • бесконечность (положительная и отрицательная), возникает при делении на нуль ненулевого значения а также при переполнениях,
  • англ. not-a-number (NaN) ). Нечисла могут определять такие случаи, как:
    • неопределённость (IND), возникает при комплексном результате (например, при вычислении квадратного корня из отрицательного числа) и в некоторых других случаях,
    • недействительное значение (qNaN, sNaN) — может использоваться компилятором (для предотвращения использования неинициализированных переменных) или отладчиком,
  • нуль — в формате с плавающей запятой, нуль также считается специальным значением.

В зависимости от флагов FPU, специальные значения могут инициировать обработку исключения операционной системой.

См. также

Устройство цифровых процессоров Архитектура Гарвардская • Фон Неймана • Битовые операции • Система команд • Кольца защиты • RISC • MISC • EPIC •

Параллелизм Упреждающее выполнение • Конвейер • Суперскалярность • Подмена регистров • Мультипроцессор • Многопоточность Компоненты АЛУ • Математический сопроцессор • Корпус • Векторный процессор • Регистры • Кэш Питание Динамическое изменение частоты • Динамическое изменение напряжения Реализации Микропроцессор • Графический процессор • Физический процессор • DSP • Система на кристалле • Микроконтроллер • ПЛИС

Wikimedia Foundation . 2010 .

Смотреть что такое «Блок операций с плавающей точкой» в других словарях:

UltraSPARC T1 — UltraSPARC T1 многоядерный микропроцессор с аппаратной поддержкой многопоточности, разработанный Sun Microsystems, до анонса 14 ноября 2005 г. известен как Niagara. Процессор базируется на RISC архитектуре UltraSPARC Architecture 2005… … Википедия

MIPS (архитектура) — У этого термина существуют и другие значения, см. MIPS. MIPS (англ. Microprocessor without Interlocked Pipeline Stages) микропроцессор, разработанный компанией MIPS Computer Systems (в настоящее время MIPS Technologies) в соответствии… … Википедия

POWER — (сокр. от англ. Performance Optimization With Enhanced RISC) микропроцессорная архитектура с ограниченным набором команд (RISC), разработанная и развиваемая компанией IBM. Название позже было расшифровано как Performance Optimization… … Википедия

Цифровой сигнальный процессор — (англ. Digital signal processor, DSP; сигнальный микропроцессор, СМП; процессор цифровых сигналов, ПЦС) специализированный микропроцессор, предназначенный для цифровой обработки сигналов (обычно в реальном масштабе времени) … Википедия

ПЦС — Цифровой сигнальный процессор (англ. Digital signal processor, DSP; сигнальный микропроцессор, СМП; процессор цифровых сигналов, ПЦС) специализированный микропроцессор, предназначенный для цифровой обработки сигналов (обычно в реальном масштабе… … Википедия

Сравнение C Sharp и Java — Правильный заголовок этой статьи Сравнение C# и Java. Он показан некорректно из за технических ограничений. Сравнения языков программирования Общее сравнение Основной синтаксис Основные инструкции Массивы Ассоциативные массивы Операции со… … Википедия

Микроархитектура — Схема, иллюстрирующая место микроархитектурного уровня в многоуровневой структуре компьютера. В компьютерной инженерии … Википедия

Cyrix 6×86 — Cyrix 6x86MX PR200 Cyrix 6×86 (кодовое название M1) шестое поколение 32 битных процессоров, разработанных фирмой Cyrix и выпущенных IBM и SGS Thomson в 1996 году. Содержание … Википедия

ЕС ЭВМ — У этого термина существуют и другие значения, см. ЕС (значения). ЕС ЭВМ (Единая система электронных вычислительных машин, произносится «еэс эвээм») советская серия компьютеров. Аналогия серий System/360 и System/370 фирмы IBM, выпускавшихся … Википедия

История вычислительной техники — История науки … Википедия

Особенности архитектуры процессоров Pentium III и Pentium IV

Разработка процессоров Pentium III и Pentium IV определяла не только создание процессоров с новым уровнем производительности, но имела своей основной целью обеспечить эффективную поддержку мультимедийных и 3D технологий.

Архитектурные особенности процессоров Pentium III:

1. Потоковые SIMD-расширения. Потоковые SIMD-расширения обрабатывают 70 новых команд, в том числе инструкции потоковой обработки данных с плавающей точкой, дополнительные целочисленные SIMD-операции и команды управления кэш-памятью. От внедрения новой технологии существенно выигрывают такие направления, как обработка изображений, звуковых и видеопотоков, а также распознавание речи. При этом можно реализовать более высокое качество изображений на экране, качественные звук и изображение в MPEG2, возможность одновременного кодирования и декодирования MPEG2.

2. Технология обработки мультимедиа-данных Intel MMX™. Технология Intel MMX предусматривает поддержку набора из 57 целочисленных команд и четырех типов данных общего назначения, легко применимых для оптимизации широкого круга мультимедийных и коммуникационных приложений. В рамках этой технологии используется расширение «Одна инструкция над множественными данными» (Single Instruction, Multiple Data, SIMD); в процессор введены восемь 64-разрядных регистров технологии MMX.

3. Технология динамического исполнения:

· Многоуровневое предсказание ветвлений — предсказывает направление переходов сразу в нескольких точках ветвления программы, позволяя полностью загрузить процессор работой.

· Анализ потока данных: переупорядочивает очередь выполнения команд, анализируя зависимости их операндов.

· Спекулятивное исполнение — в случае отсутствия в очереди однозначно исполняемых команд процессор загружается предположительно исполняемыми, полностью используя суперскалярную структуру процессора.

4. Самотестирование и мониторинг производительности:

· Функция самотестирования (Built In Self Test, BIST) обеспечивает обнаружение одиночных неисправностей — типа остановки микрокоманды и ошибки в логических матрицах, а также тестирует кэш-память, буферы TLB и целостность микрокода.

· Порт тестового доступа и архитектура сканирования окружения, соответствующие стандарту IEEE 1149.1, позволяют проверять процессоры Pentium III с помощью стандартного интерфейса.

· Встроенный датчик производительности обеспечивает возможность мониторинга быстродействия и подсчета событий.

· Встроенный в матрицу термодиод, измеряющий ее температуру. Системные платы позволяют использовать его для мониторинга температуры процессора.

5. Внедрена высокопроизводительная архитектура двойной независимой шины (Dual independent Bus, DIB), разделяющая системную шину и шину кэш-памяти, повышающая скорость обмена данными, производительность и масштабируемость по мере развития новых технологий.

6. Системная шина поддерживает множественные отложенные транзакции, повышающие ее доступность. Кроме того, шина обеспечивает совместную работу двух процессоров без «залипания». Это позволяет создавать недорогие симметричные двухпроцессорные системы, существенно повышающие производительность многозадачных и многопотоковых приложений.

7. Неблокируемая объединенная кэш-память второго уровня (L2) объемом 512 Кб повышает производительность, сокращая среднее время доступа к памяти путем хранения часто используемых команд и данных. Пропускная способность кэш-памяти увеличена благодаря использованию отдельной 64-разрядной шины. Скорость работы кэш-памяти второго уровня растет с увеличением частоты процессора. Кроме того, в процессор встроена раздельная кэш-память первого уровня для команд и данных, объемом по 16 Кб. Процессоры поддерживают кэширование до 4 Гб памяти.

8. Процессоры поддерживают функцию распознавания и коррекции ошибок (Error Correction Code, ECC) на шине кэш-памяти второго уровня для приложений с повышенными требованиями к целостности данных.

9. Конвейеризованное устройство операций с плавающей точкой (Floating-Point Unit, FPU) поддерживает как 32-разрядный и 64-разрядный форматы IEEE 754, так и 80-разрядное представление чисел.

10. Технология запроса адреса памяти и ответа системной шины с проверкой четности и возможностью повтора повышает надежность обмена данными.

Pentium IV радикально отличается от своих предшественников. Архитектуре этих процессоров дано имя NetBurst. Рассмотрим важнейшие особенности процессора:

1. Гиперконвейерная архитектура: Pentium IV отличается от предшественников конвейером, длина которого составляет не менее 20 стадий (конвейер Pentium III насчитывает 10 стадий). Именно поэтому новый процессор способен работать на сверхвысоких частотах. В самом деле: если последовательность исполнения команды разбита на более мелкие этапы, то каждый из них процессор сможет выполнять быстрее, следовательно, тактовую частоту ЦП можно повысить. К сожалению, длинный конвейер не лишен недостатков. Основной его враг — инструкции условных переходов. Процессор, выполняя такую команду, в зависимости от определенного условия должен либо совершить переход на новый адрес, либо продолжить обработку следующей инструкции. Все современные процессоры стараются предсказать результат каждого ветвления до того, как условие перехода будет вычислено. Если прогноз окажется верным, ЦП будет работать без простоев. Если предсказание ошибочно, процессору приходится очищать весь конвейер и запускать его заново. Pentium IV ошибается в предсказании ветвлений на треть реже, чем Pentium III.

2. Кэш трассировки исполнения (Execution trace cache): Pentium IV отличается от х86-совместимых процессоров уникальной организацией кэш-памяти. Pentium III и Athlon используют одну половину кэш первого уровня (L1) для хранения инструкций, а другую – для данных. Все современные ЦП исполняют громоздкие инструкции х86, предварительно разбив их на простые и удобные для обработки микрооперации. Декодеры Pentium III и Athlon считывают команды из кэш-памяти первого уровня и делят их на микрокоманды, которые передаются исполнительному устройству. Такая схема имеет два серьезных недостатка:

· Во-первых, если декодеру попадается сложная инструкция, то исполнительному устройству приходится простаивать до тех пор, пока она не будет преобразована в микрооперации;

· Во-вторых, каждый раз при повторном исполнении команд (при обработке циклов) процессору приходится декодировать их заново.

Pentium IV не хранит инструкции в кэш первого уровня. Вместо этого процессор помещает уже декодированный код в так называемом кэш трассировки исполнения (Execution Trace Cache).

Иными словами, в новом кэш хранятся не классические инструкции х86, а готовые к исполнению микрооперации. Такой подход позволяет избежать описанных выше проблем. Во-первых, исполнительные устройства Pentium IV не ждут декодера, а считывают микрокоманды непосредственно из кэш трассировки исполнения. Во-вторых, если цикл полностью помещается в новый кэш, процессору не приходится декодировать его многократно. В Execution Trace Cache можно хранить до 12000 микрокоманд.

Объем кэш первого уровня Pentium IV (данных) составляет всего восемь килобайт. Для сравнения: L1-кэш Pentium III и Athlon могут хранить до 16 и 64 килобайт данных соответственно; объем принесен в жертву скорости — на ожидание данных из кэш первого уровня Pentium IV тратит всего два такта, а его конкуренты — минимум три.

Кэш второго уровня соединен с ядром широкой 256-битной шиной данных (Intel называет эту конфигурацию Advanced Transfer Cache).

3. Механизм ускоренного выполнения (rapid execution engine): Все современные процессоры оснащены не одним, а несколькими АЛУ (арифметико-логическими устройствами, то есть блоками, выполняющими арифметические и логические операции над целочисленными данными). Инструкции х86 плохо поддаются распараллеливанию; очень часто процессор не может обработать команду до тех пор, пока не вычислит результат предшествующей ей инструкции. Такие пары команд называются зависимыми. Поскольку обрабатывать их параллельно нельзя, процессору приходится вычислять их по очереди.

Чтобы максимально сократить время исполнения зависимых инструкций, Pentium IV оснащен двумя АЛУ, работающими на удвоенной частоте процессора. Каждое из них может исполнить за такт две простых операции (сложение, вычитание и логические). На удвоенной частоте обрабатываются не все арифметические команды, а лишь простейшие из них. Сложные операции (например, умножение) Pentium IV выполняет на своей номинальной частоте.

4. SSE2: Набор SIMD-инструкций SSE, появившийся в процессорах Pentium III, не только включен в Pentium IV, но и существенно расширен. К имевшимся 70 командам добавлено еще 144. SIMD-инструкции (Single Instruction Multiple Data — одна инструкция над многими данными) производят арифметические операции над несколькими (более чем двумя) операндами. Прежние команды SSE позволяли обработать одновременно четыре пары вещественных чисел одинарной точности (восемь 32-битных чисел с плавающей запятой). Другие типы данных SSE не обрабатывает. Команды, появившиеся в SSE2, могут работать с двумя парами вещественных чисел двойной точности (четырьмя 64-битными числами с плавающей запятой) и целочисленными операндами длиной от одного до 16 байт. Добавлены также новые команды, управляющие кэшированием данных.

Самым важным нововведением в SSE2 следует признать поддержку SIMD-операций над вещественными числами двойной точности. Напомним, что SSE и 3Dnow! работают лишь с операндами одинарной точности, недостаточной для многих инженерных приложений. AMD едва ли сможет добавить в свой набор команд операции над вещественными числами двойной точности. Дело в том, что инструкции 3DNow! хранят операнды в 80-разрядных регистрах математического сопроцессора, и втиснуть в такой регистр два 64-битных числа в принципе невозможно.

5. Системная шина: Вместе с оригинальным ядром Pentium IV получил обновленную системную шину (FSB). От FSB процессоров Pentium III она отличается возможностью передавать данные четыре раза за такт (Intel называет этот режим «Quad Pumped»). Таким образом, даже работая на скромной частоте 100 мегагерц, эта 64-разрядная шина может передавать информацию со скоростью до 3.2 Гбайт/с. Впрочем, даже самая быстрая шина будет простаивать, если память не сможет поставлять данные с адекватной скоростью.

Pentium IV подобный дисбаланс не грозит. Материнские платы для этого процессора оснащаются двухканальным контроллером памяти. Пропускная способность каждого канала может достигать 1.6 Гбайт/с; таким образом, суммарная полоса пропускания RAM достигает внушительной цифры 3.2 Гбайт/с.

Не нашли то, что искали? Воспользуйтесь поиском:

Как увеличить производительность процессора за счет настроек электропитания (парковка ядер, как включить все ядра ЦП ✔)

Долго думал, стоит ли публиковать сегодняшнюю статью, т.к. вопрос довольно спорный (и результат после настройки у всех может быть разным, в зависимости от оборудования и ПО). И всё же, попрошу к статье отнестись критически и как к «экспериментальной».

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

К тому же функция парковки ядер позволяет процессору (при определенной нагрузке) переносить все задачи на одно ядро, а остальные переводить в режим ожидания (т.е. работать будет фактически только одно ядро). Естественно, это снижает общую производительность (правда, делает систему более отзывчивой, но незначительно). Отмечу, что Windows к тому же не совсем корректно работает с парковой ядер на процессорах Intel (по крайней мере Windows 7).

Так вот, задав определенные настройки электропитания, можно ограничить работу функции парковки ядер и повысить общую производительность (в некоторых случаях до 20%!). На мой взгляд есть смысл попробовать потратить 3-5 мин. на «эксперимент»!

Примечание : в первую очередь эта тема касается многоядерных процессоров от Intel (на AMD, честно говоря, адекватной статистики не имею. Но попробовать можно. ).

Как настроить тонко электропитание процессора

Чтобы не быть голословным о повышении производительности, приведу один небольшой тест быстродействия в WinRAR (офиц. сайт архиватора). На скриншоте ниже: в левой части приведена общая скорость до оптимизации настроек; справа — после. Даже невооруженным глазом видно, что в тестах ЦП начинает работать быстрее (что положительно сказывается и в реальных задачах, тех же играх, например) .

Разница в производительности

Примечание : рекомендую вам запустить тест в WinRAR сначала до оптимизации настроек (и запомнить общую скорость), и затем провести тест после оптимизации. Далее просто сравнить эти числа, в ряде случаев удается выжать из ЦП еще 10-20%!

Важный момент!

Как уже сказал выше, в первую очередь этот вопрос касается многоядерных процессоров (4 ядра и выше). Чтобы узнать количество ядер своего ЦП — просто запустите утилиту CPU-Z, и посмотрите в нижнюю часть окна: в графе Cores увидите кол-во ядер (пример ниже).

CPU-Z — 4 Cores (4 ядра, 8 потоков)

1) И так, начать нужно с настройки реестра.

Тут дело в том, что Windows по умолчанию скрывает часть настроек электропитания. Чтобы их открыть для редактирования, необходимо внести определенные изменения в реестр. Проще всего это сделать с помощью уже готового файла настроек, который нужно просто запустить и согласиться с добавлением параметров в системный реестр. Вот подготовленный файл: core_parking (нужно извлечь его из архива и запустить. Архив запакован с помощью WinRAR, актуален для Windows 7-10) .

Редактор реестра — настройки успешно внесены в реестр

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

2) Настройка схемы электропитания

Теперь необходимо открыть панель управления Windows раздел «Оборудование и звук/Электропитание» . После перейти в настройки текущей схемы электропитания (т.е. ту, которая сейчас у вас используется). В моем случае это сбалансированная (см. скриншот ниже).

Настройка текущей схемы электропитания

Далее нужно открыть дополнительные настройки питания.

Изменить дополнительные параметры питания

Теперь самое главное (см. скриншот ниже):

  1. минимальное число ядер в состоянии простоя: рекомендуется выставить значение в 99% (почему-то если выставить 100% — Windows часто отправляет одно ядро «отдыхать»);
  2. разрешить состояние снижения питания: переведите в режим выкл. (не дает процессору экономить энергию);
  3. отключение простоя процессора: переведите режим в откл.;
  4. минимальное состояние процессора: 100% (незначительно ускоряет работу ЦП (кстати, в некоторых случаях позволяет уменьшить писк от дросселей )) .
  5. политика охлаждения системы: активная (более эффективно охлаждает ЦП);
  6. максимальное состояние процессора: 100% (очень сильно влияет на производительность! Обязательно выставите на 100%);
  7. максимальное число ядер в состоянии простоя: 100% (противоречивая опция. Если выставить что-то отличное от 100% — то грузятся почему-то не все ядра, несмотря на то что активны все. ).

Дополнительные параметры электропитания

Сохраните настройки и перезагрузите компьютер!

3) Еще раз о режиме питания (касается в первую очередь ноутбуков)

После перезагрузки компьютера (ноутбука) — обратите внимание на режим питания (кликните по батарейке в трее). Выставите производительность на 100%!

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

Питание ноутбука // менеджер ноутбука


4) Тестирование быстродействия

После чего можно запустить WinRAR и провести тест быстродействия. Как правило, после точечной настройки электропитания наблюдается рост цифр (т.к. система перестает ограничивать ЦП, и он может начать работать на весь свой потенциал).

Тестирование — WinRAR / Кликабельно

Дополнение!

Чтобы посмотреть, как идет нагрузка на ядра ЦП — откройте «Диспетчер задач» (Ctrl+Shift+Esc) и перейдите во вкладку «Производительность» . Далее щелкните правой кнопкой мышки по графику загрузки ЦП и в меню выберите «Изменить график/Логические процессы» . См. скрин ниже.

Диспетчер задач — производительность

В результате у вас будет не один график, а несколько, в зависимости от количества ядер (потоков).

Все ядра загружены

Обратите внимание, при нагрузке (например, тестировании) — в идеале все ядра должны быть загружены (как на скриншоте ниже).

Для более показательного теста работы ЦП рекомендую воспользоваться утилитой AIDA64 (ссылку на инструкцию привожу ниже).

Как выполнить стресс-тест процессора и системы в целом, держит ли он частоты, нет ли перегрева (AIDA 64) — https://ocomp.info/kak-vyipolnit-stress-test-videokartyi-noutbuka-v-aida-64.html

PS

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

PARALLEL.RU — Информационно-аналитический центр по параллельным вычислениям

Быстрое ознакомление с оптимизацией компиляторов Intel 10.0

Пошаговый подход к оптимизации приложения с использованием компиляторов Intel.

До того, как вы начнете настраивать программу на эффективную работу, вы можете проверить ее на корректность, компилируя ее без оптимизации, используя ключи /Od (-O0).

  1. Основные опции для настройки. В большинстве случаев следует начинать с опций /O2 (-O2) (установка по умолчанию). Следующим шагом следует попробовать /O3 (-O3) для приложений с большим количеством циклов, особенно на архитектурах IA-64.
  2. Специфичные настройки для процессоров. Для полного списка рекомендуемых опций смотрите соответствующую таблицу. Для двухъядерных процессоров Intel Itanium 2 9000 используйте опцию /G2-p9000 (-mtune=itanium2-p9000).
  3. Используйте анализатор производительности Intel Vtune для помощи в обнаружении ключевых мест в коде, чтобы знать, какие именно части вашего приложения могут быть улучшены дальнейшими настройками. Отчеты по оптимизации компиляторов Intel также помогают в обнаружении мест, где компилятор может нуждаться в дополнительной информации от пользователя.
  4. Добавление межпроцедурной оптимизации (IPO) /Qipo (-ipo) и/или управляемой профилем оптимизации (PGO) /Qprof-gen (-prof-gen и -prof-use), затем измерить производительность еще раз и определить, есть ли выигрыш от применения какой-то из этих оптимизаций, или от обоих сразу.
  5. Оптимизация приложения для гипертрединговых, многоядерных или многопроцессорных систем путем использования опций /Qparallel (-parallel), /Qopenmp (-openmp) или использования библиотек Intel Performance Libraries или элементов Intel Threading Building Blocks.
  6. Использование профилировщика Intel Thread Profile для помощи в понимании структуры программ и максимизации их производительности. Использование Intel Thread Checker для сокращения времени на доработку параллельных приложений путем обнаружения специфичных ошибок и увеличения скорости разработки приложения в целом. Оба инструмента работают с бинарным инструментарием. Использование компилятора Intel с кодом программы, оснащенным таким инструментарием, даст более полную информацию об исходном коде.

Более подробная информация может быть получена из документации компилятора и документа «Optimizing Applications with the Intel C++ & Fortran Compilers» (PDF, 1.14MB, eng.).

Основные опции

Начинайте настройку эффективности с использования ключей /O1, /O2 или /O3 (-O1, -O2 или -O3 ). Это основные опции для оптимизации, которые должны быть использованы, прежде всего, при настройке приложения для всех процессоров. Произведите замеры производительности до того, как приступите к использованию расширенных опций оптимизации.

Windows Linux,
Mac OS
Комментарии
/Od -O0 Без оптимизации. Используется на ранних стадиях разработки и отладки приложения для проверки корректности работы программы.
/O1 -O1 Оптимизация по размеру. Не использует методов оптимизации, которые могут увеличить размер кода. Создает в большинстве случаев самый маленький размер кода.
/O2 -O2 Максимизация скорости. Установка по умолчанию. Как правило, создает более быстрый код, чем /O1 (-O1).
/O3 -O3 Задействует методы оптимизации из /O2 (-O2) и, дополнительно, более агрессивные методы оптимизации циклов и доступа к памяти, такие как подстановка скаляров, раскрутка циклов, подстановка кода для избежания ветвлений, блокирование циклов для обеспечения более эффективного использования кэш-памяти и, только на системах архитектуры IA-64, дополнительная подготовка данных. Данная опция особенно рекомендуется для приложений, где есть циклы, которые активно используют вычисления с плавающей точкой или обрабатывают большие порции данных. Эти агрессивные методы оптимизации могут в ряде случаев и замедлить работу приложений других типов по сравнению с использованием /O2 (-O2).
/zi -g Генерирует отладочную информацию для использования с любым обычным отладчиком. Эта опция отключает /O2 (-O2) и делает /Od (-O0) по умолчанию до тех пор, пока тип оптимизации не будет указан явно.
/debug:full -debug full Облегчает отладку оптимизированного кода добавлением символьной информации, включая информацию о локальной таблице символов, независимо от используемого уровня оптимизации. Это может привести к минимальным снижениям производительности. Если эта опция указывается для приложения, которое делает вызовы к подпрограммам библиотек языка С, которые надо отладить, опция /dbglibs также должна быть указана для подключения соответствующих отладочных библиотек С.

Производительность параллельных программ

Компиляторы Intel поддерживают разработку многопроцессных приложений для гипертрединговых, многоядерных и/или многопроцессорных систем посредством двух опций: /Qparallel (-parallel) или /Qopenmp (-openmp). Если вы используете Intel Thread Profiler или Intel Thread Checker для настройки ваших приложений, используйте /Qtcheck (-tcheck) в случае Intel Thread Checker и /Qtprofile (-tprofile) в случае Intel Thread Profiler.

Windows Linux,
Mac OS
Комментарии
/Qopenmp -openmp Задействует создание кода на базе директив OpenMP.
/Qopenmp-report -openmp-report Задает уровень диагностики OpenMP. Установка по умолчанию /Qopenmp-report1.
/Qparallel -parallel Обнаруживает циклы с простой структурой, которые могут быть безопасно выполнены в параллельном режиме и автоматически создает параллельный код для таких циклов.
/Qpar-report -par-report Управляет уровнями диагностики автоматического распараллеливания:
0 — Не выдает диагностической информации.
1 — Помечает успешно распараллеленный циклы (установка по умолчанию).
2 — добавляет информацию о циклах, которые не удалось преобразовать.
3 — Добавляет информацию о всех найденных или подозреваемых зависимостях, не позволяющих распараллеливание.
/Qpar-threshold[n] -par-threshold[n] Устанавливает порог для автоматического распараллеливания циклов, базирующийся на вероятности выгодности выполнения цикла в параллельном режиме, параметр n — в диапазоне от 0 до 100 (по умолчанию n=100).
0 — Распараллеливать циклы вне зависиомти от вычислительной сложности.
100 — Распараллеливать циклы только в случае почти однозначной выгодности выполнения циклов в параллельном режиме.
Опция должна использоваться совместно с /Qparallel (-parallel)
/Qtprofile -tprofile Позволяет получить информацию о структуре параллельного приложения для использования в целях их настройки для достижения максимальной производительности. Опция создает бинарный файл, который сгенерирует данные о приложении, которые могут быть просмотрены с помощью Intel Thread Profiler.
/Qtcheck -tcheck Позволяет получить информацию для диагностики ошибок в параллельной части параллельного приложения. Эта опция создает бинарный файл, который сгенерирует данные о приложении, которые могут быть просмотрены с помощью Intel Thread Checker.
/Qopt-mem-bandwith
(только для IA-64)
-opt-mem-bandwith
(только для IA-64)
Запрещает использовать методы оптимизации, которые могут увеличить требования к объему используемой памяти.
/Qopt-mem-bandwidth0 (-opt-mem-bandwidth0) — нет запрета (установка по умолчанию)
/Qopt-mem-bandwidth1 (-opt-mem-bandwidth1) — запрещает оптимизацию циклов в секциях OpenMP (используется по умолчанию с /Qparallel (-parallel) или /Qopenmp (-openmp)).
/Qopt-mem-bandwidth2 (-opt-mem-bandwidth2) — запрещает оптимизацию для всех циклов. Может использоваться для MPI или других параллельных приложений.
Для Mac OS опция не поддерживается.

Cпецифичные для процессоров архитектур IA-32 и Intel 64

Используйте /QxT (-xT в случае Linux и Mac OS) для лучших результатов на процессорах семейства Intel Core2 и /QxP (-xP в Linux) на более старых системах на базе Intel, поддерживающих инструкции SSE3. Рекомендуется использовать /QaxT /QxW (-axT -xW в Linux) для лучших результатов на семействе Intel Core2 и хорошей производительности на других системах, поддерживающих SSE2, включая процессоры от AMD. Для лучшей производительности на не Intel процессорах, поддерживающих инструкции SSE3, рекомендуется использовать /QxO (-xO) вместо /QxW (-xW). Рекомендуемые опции для более старых процессоров смотрите ниже. Как и на предыдущих шагах, производите замер влияния на производительность каждой из опций, чтобы принять лучшие решения. Используйте отчеты оптимизаторов компилятора Intel для того чтобы понять, можно ли помочь компилятору разрешить какие-либо сложности, например, возможные зависимости или альясы.

Windows Linux,
Mac OS
Комментарии
/Qx -x Для создания приложения, исполняемого на конкретном типе процессора. Генерирует специальный код для такого процессора и задействует векторизацию. Исполняемый файл должен запускаться только на совместимых процессорах.

S — Может генерировать инструкции SSE4, SSSE3, SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует и для будущих процессоров Intel, поддерживающих векторизацию компилятора SSE4 и медиа-акселераторы.

T — может генерировать инструкции SSSE3, SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует для процессоров семейства Intel Core2 Duo, четырехъядерных процессоров Intel Xeon и двухъядерных процессоров Intel Xeon серий 5300, 5100 и 3000.

P — Может генерировать инструкции SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует для микроархитектуры процессоров Intel Core, процессоров Intel Pentium 4 с SSE3, процессоров Intel Xeon с SSE3, двухъядерных процессоров Intel Pentium T2060, процессоров Intel Pentium Extreme Edition и процессоров Intel Pentium D. Осуществляет оптимизации, не задействованные с /QxO (-xO).

O — Может генерировать инструкции SSE3, SSE2 и SSE. Оптимизирует для микроархитектур процессоров Intel Core, процессоров Intel Pentium 4 с SSE3, процессоров Intel Xeon с SSE3, двухъядерных процессоров Intel Pentium T2060, процессоров Intel Pentium Extreme Edition и процессоров Intel Pentium D. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE3*.

N — Может генерировать инструкции SSE2 и SSE для процессоров Intel. Оптимизирует для процессоров Intel Pentium 4, процессоров Intel Xeon с SSE2 и процессоров Intel Pentium M. Осуществляет оптимизации, не задействованные с /QxW (-xW).

W — может генерировать инструкции SSE2 и SSE. Оптимизирует для процессоров Intel Pentium 4 и процессоров Intel Xeon с SSE2. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE2 и SSE*.

K — Может генерировать инструкции SSE. Оптимизирует для процессоров Intel Pentium III и процессоров Intel Pentium III Xeon. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE*.

Примечание: на Mac OS значения опций O, N, W и K не поддерживаются. Для систем с Mac OS архитектуры IA-32 -xP является установкой по умолчанию. Для систем Mac OS архитектуры Intel 64 установкой по умолчанию является -xT.

/Qax

-ax Автоматический выбор процессора. Генерирует специальный код и задействует векторизацию, создавая код, не привязанный к конкретному процессору. Можно использовать более одного значения для получения одного исполняемого файла под разные процессоры. Например, для наилучшей производительности на процессорах семейства Intel Core2 Duo, четырехъядерных процессорах Intel Xeon, двухъядерных процессорах Intel Xeon серий 5300, 5100 и 3000 при возможности хорошей работы и на процессорах AMD, поддерживающих только SSE2, используйте /QaxT /QxW (-axT -xW в Linux) для генерации бинарного файла, использующего SSSE3 и настроенного и для не-SSSE3 x86-64 процессоров.

В данном примере комбинация /QaxT /QxW (-axT -xW в Linux) даст бинарный файл с двумя видами кода. Один код даст возможность использовать полное преимущество процессоров семейства Intel Core2 Duo, четырехъядерных процессоров Intel Xeon processors и двухъядерных процессоров Intel Xeon серий 5300, 5100 и 3000. Другой код также даст возможность использовать возможности процессоров Intel и будет работать и на процессорах, не поддерживающих SSE3.

Во время работы приложение автоматически определяет тип используемого процессора и выбирает соответствующий вариант кода. Примечания: Значение опции O не поддерживается для /Qax (-ax). Значения P, N, W и K не поддерживаются в Mac OS.

/Qvec-report[n] -vec-report[n] Разметка возможности векторизации циклов:
n = 0: без информации
n = 1: размечает векторизуемые циклы (настройка по умолчанию)
n = 2: размечает и векторизуемые, и не векторизуемые циклы
n = 3: размечает векторизуемые циклы и объяснения, почему не векторизуемые не могут векторизоваться

*Значения опций O, W и K создают бинарные файлы, которые должны запускаться не на процессорах Intel, таких как AMD, имеющих такие же возможности, как и соответствующие процессоры Intel. Значения опции P и N добавляют дополнительные оптимизации, которые не задействуются опциями O и W.

Cпецифичные для процессоров архитектур IA-64

В основном, использование /O3 (-O3), IPO и/или PGO, в сочетании с отчетами оптимизации (описанными в разделе тонкой настройки), помогающими разрешить возможные проблемы с альясами и улучшить использование памяти, обеспечивает наилучшую производительность на системах на базе IA-64.

Windows Linux,
Mac OS
Комментарии
/G2 -mtune=itanium2 Оптимизирует приложение для процессоров Intel Itanium 2.
Сгенерированный код также совместим с более старыми процессорами IA-64.
(установка по умолчанию)
/G2-p9000 -mtune=itanium2-p9000 Оптимизирует для двухъядерных процессоров Intel Itanium 2 9000.
Сгенерированный код также совместим со всеми процессорами IA-64, пока в программе нет вызовов функций, специфичных для процессоров Intel Itanium 2 9000.
/QIPF-fma[-] -IPF-fma[-] Активирует [деактивирует] комбинирование операций умножения с плавающей точкой и операций сложения/вычитания.
(включено по умолчанию)
/Qivdep-parallel -ivdep-parallel Задает отсутствие зависимостей по памяти в циклах, где указана директива IVDEP. Обычно используется в сочетании с /Qparallel (-parallel).
/Qprefetch[-] -prefetch[-] Включает или выключает предварительные подстановки.

Межпроцедурная (IPO) и профильно-зависимая оптимизация (PGO)

IPO включает в себя подстановку функций для сокращения накладных расходов на их вызовы и предоставляет другие возможности для оптимизации.

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

Однако IPO может увеличивать размер кода. Следует обратить внимание на оценки как производительности, так и времени компиляции и изменение размера кода с этими опциями. IPO лучше всего использовать в сочетании с PGO для определения тех функций, тело которых имеет смысл подставлять вместо вызова.

Windows Linux,
Mac OS
Комментарии
/Qip -ip Оптимизация отдельного файла.
Межпроцедурные оптимизации, включая выборочные подстановки внутри этого файла.

Внимание: Для больших файлов эта опция может существенно увеличить время компиляции и размер кода.

/Qipo[value] -ipo[value] Разрешает подстановки и другие межпроцедурные оптимизации с несколькими исходными файлами. Значение в опции управляет максимальным числом выполненных компиляций (или числом объектных файлов). Значение по умолчанию — 0 (выбирает компилятор).

Внимание: Эта опция может существенно увеличить время компиляции и размер кода.

/Qipo-jobs[n] -ipo-jobs[n] Определяет количество команд (заданий) для одновременного выполнения на фазе линкования IPO. Значение по умолчанию — 1.
/Ob2 -finline-functions-finline-level=2 Эта опция разрешает подстановку функций внутри текущего исходного файла на усмотрение компилятора. Опция задействована по умолчанию при /O2 и /O3 (-O2 и -O3).

Внимание: Эта опция может существенно увеличить время компиляции и размер кода. Она может быть отключена с помощью /Ob0 (-fno-inline-functions в Linux и Mac OS).

/Qinline-factor=n -finline-factor=n Эта опция масштабирует общий и максимальный размеры функций, которые могут подставляться. Значение по умолчанию — 100, т.е. 100% или единичный масштаб.
/Qprof-gen -prof-gen Обеспечивает инструментами для профилирования.
/Qprof-use -prof-use Включает использование профильной информации в ходе оптимизации.
/Qprof-dir dir -prof-dir dir Определяет директорию для выходных файлов профилирования *.dyn и *.dpi.

Арифметика с плавающей точкой

Компиляторы Intel предоставляют опции для улучшения последовательности использования или точности результатов операций с плавающей точкой на всех архитектурах Intel ценой некоторого снижения производительности. Более подробную информацию можно найти в полном описании опций оптимизаторов.

Windows Linux,
Mac OS
Комментарии
/fp:name -fp-model name Этот метод управления последовательностью результатов выполнения операций с плавающей точкой путем запрещения оптимизаций рекомендуется с опциями /Op (-mp) и /Qprec (-mp1). Возможные значения:

precise — разрешает оптимизацию кода с операциями с плавающей точкой только для безопасных, с точки зрения сохранения значений, оптимизаций.

double/extended/source — неявно выражает точность, вычисляя промежуточные значения с точностью double, extended или исходной. Значения double и extended недоступны для компилятора Intel Fortran.

fast=[1|2] — позволяет использовать более агрессивные методы оптимизации ценой незначительного падения точности или последовательности вычислений. (fast=1 по умолчанию)

except — разрешает семантику floating point exception.

strict — режим строгого выполнения, включает как опции precise, так и except и отключает сжатие fma.

Рекомендация: /fp:source (-fp-model source) рекомендуется для большинства ситуаций с процессорами IA-64, на процессорах, поддерживающих Intel 64, и на IA-32 в случае использования SSE с помощью /QxW (-xW) или выше, когда требуется дополнительная связанность и повторимость операций с плавающей точкой.

/Qfp-speculation mode -fp-speculation mode Управляет анализом операций с плавающей точкой в следующих режимах:

fast — анализировать операции с плавающей точкой. (по умолчанию)

off — отключает анализ операций с плавающей точкой.

safe — Не анализировать, если это может вызвать несоответствие.

strict — то же, что и off.

/Qftz[-] -ftz[-] Когда основная программа или dll компилируется с этой опцией, не инициализированные значения обнуляются для всей программы (dll). Установка этой опции не гарантирует, что все не инициализированные значения будут обнулены. Обнуляются лишь те значения, которые были сгенерированы во время запуска.
В системах на базе IA-64 опция по умолчанию выключена, кроме /O3 (-O3).
В системах на базе IA-32 и Intel 64 опция по умолчанию включена, кроме /Od (-O0), но обнуляются только замеченные не инициализированные значения в результате выполнения инструкций SSE.

Тонкая настройка (все процессоры)

Когда определились наиболее влияющие на производительность места в программе, вам может потребоваться обеспечить компилятор дополнительной информацией для тонкой настройки специфичных функций. Отчеты оптимизации и векторизации могут указать места, где циклы не могут быть до конца оптимизированы, например, из-за алиаса указателя или конфликта при доступе к памяти.

Полная документация по компиляторам Intel С++ и Fortran содержит детальное описание прагм, директив и интринзиков, которые могут быть использованы для раскрутки циклов, векторизации и других методов для тонкой настройки внутри кода вашего приложения.

Windows Linux,
Mac OS
Комментарии
/Qunroll[n] -unroll[n] Устанавливает максимально число раскруток циклов.

/Qunroll0 (-unroll0) отключает раскрутку.

/Qunroll (-unroll) позволяет выбирать число раскруток компилятору (значение по умолчанию).

/Qrestrict[-] -[no]restrict Включает [выключает] устранение неоднозначности с указателями с помощью запрещающих ключевых слов.
/Oa -fno-alias Указывает отсутствие алиасов в программе.
/Ow -fno-fnalias Указывает отсутствие алиасов в теле функций.
/Qalias-args[-] -alias-args[-] Подразумевает, что аргументы функций могут иметь алиасы [не могут].
/Qopt-class-analysis[-] -[no-]opt-class-analysis Эта опция использует информацию об иерархии классов С++ для анализа и разрешения виртуальных вызовов функций во время компиляции. Если приложение на С+++ содержит нестандартные конструкции, это может привести к разным результатам. По умолчанию, опция выключена, но включена при использовании /Qipo (-ipo), делая доступным улучшенную оптимизацию для С++.

Примечание: Поддерживается только для С++.

-fexceptions Опция включает создание таблицы обработки несоответствий. В приложениях, написанных на нескольких языках, опция не дает подпрограммам Fortran конфликтовать с обработкой несоответствий в подпрограммах С++. Используется по умолчанию для С++.
-fno-exceptions Опция отключает создание таблицы обработки несоответствий, делая код меньше. Когда опция используется, при любой обработке несоответствий С++ во время вызова подпрограмм Fortran будет получена ошибка.
/Qopt-report -opt-report Генерирует отчет об оптимизации в stderr.
/Qopt-report-levellevel -opt-report-levellevel Устанавливает подробность сообщений на выходе. Возможные значения: min (по умолчанию), med и max.
/Qopt-report-phasename -opt-report-phasename Создание отчетов. По умолчанию не создаются. Опция может использоваться несколько раз для получения отчетов на разных фазах хода компиляции. Возможные значения аргумента:

all — все возможные отчеты для данной фазы

ipo — отчеты IPO

ipo_inl — только отчеты IPO по подстановке функций

hlo — отчеты HLO

hpo — отчеты HPO

ecg — отчеты Code Generator (только Windows и Linux на IA-64)

ecg_swp — только отчеты по пайплайнингу от Code Generator (только Windows и Linux на IA-64)

Управление режимами вычислений с плавающей запятой при использовании Intel® Threading Building Blocks

Представлено: Alex, Alexey Kostadinov, опубликовано: 30 сентября 2014 г.

В Intel® Threading Building Blocks (Intel® TBB) 4.2, обновление 4, появилась расширенная поддержка управления параметрами вычислений с плавающей запятой. Теперь эти параметры можно указать при вызове большинства параллельных алгоритмов (включая flow::graph). В этом блоге мне бы хотелось рассказать о некоторых особенностях, новых функциях и общей поддержке вычислений с плавающей запятой в Intel TBB. Этот блог не посвящен общей поддержке вычислений с плавающей запятой в ЦП. Если вы незнакомы с поддержкой вычислений с плавающей запятой в ЦП, рекомендую начать с раздела Операции с плавающей запятой в справочном руководстве Intel® C++ Compiler. Для получения дополнительных сведений о сложностях арифметики с плавающей запятой рекомендую классику “ Все, что необходимо знать об арифметике с плавающей запятой ”.

В Intel TBB предлагается два способа, при помощи которых можно задать нужные параметры вычислений с плавающей запятой для задач, выполняемых планировщиком задач Intel TBB:

  1. Когда планировщик задач инициализируется для заданного потока приложения, он получает текущие параметры вычислений с плавающей запятой этого потока;
  2. У класса task_group_context есть метод для получения текущих параметров вычислений с плавающей запятой.

Рассмотрим первый подход. Такой подход, по сути, является неявным: планировщик задач всегда и безусловно получает параметры вычислений с плавающей запятой в момент своей инициализации. Затем сохраненные параметры используются для всех задач, связанных с этим планировщиком задач. Другими словами, такой подход можно рассматривать как свойство планировщика задач. Поскольку это свойство планировщика задач, мы можем применять и управлять параметрами вычислений с плавающей запятой в нашем приложении двумя способами:

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

Я попробую показать некоторые особенности в следующих примерах:

  • “fp0”, “fp1” and “fpx” – состояния, описывающие параметры вычислений с плавающей запятой;
  • “set_fp_settings( fp0 )” и “set_fp_settings( fp1 )” – указание параметров вычислений с плавающей запятой для текущего потока;
  • “get_fp_settings( fpx )” – получение параметров вычислений с плавающей запятой из текущего потока и сохранение этих параметров в “fpx”.

Пример #1. Планировщик задач по умолчанию.

Пример #2. Настраиваемый планировщик задач.

В целом, пример 2 действует так же, как пример 1, но зато предоставляет способ вручную завершить работу планировщика задач.

Пример #3. Повторная инициализация планировщика задач.

Пример #4. Еще один поток.

Обратите внимание, что Intel TBB может повторно использовать одни и те же рабочие потоки для обоих parallel_for, несмотря на то, что они вызваны из разных потоков. При этом гарантируется, что все итерации parallel_for в главном потоке будут использовать fp0, а все итерации второго parallel_for — fp1.

Пример #5. Изменение параметров вычислений с плавающей запятой в потоке пользователя.

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

Пример #6. Изменение параметров вычислений с плавающей запятой в задаче Intel TBB.

Если вам очень нужно использовать внутри задачи другие параметров вычислений с плавающей запятой, следует записать предыдущие параметры, а в конце задачи восстановить их:

Для решения большей части проблем можно использовать подход с применением планировщика задач для управления параметров вычислений с плавающей запятой. Но представьте себе ситуацию, когда для каждой из двух частей вычисления требуются разные параметры. Разумеется, можно использовать подходы, показанные в примерах 3 и 4. Но при этом могут возникнуть определенные затруднения:

  1. Реализация затруднена: в примере 3 невозможно управлять жизненным циклом объекта планировщика задач, а в примере 4 может потребоваться синхронизация между потоками;
  2. Влияние на производительность: в примере 3 нужно заново инициализировать планировщик задач, тогда как ранее этого не требовалось, а в примере 4 может возникнуть проблема избыточной подписки.

Что происходит с вложенными вычислениями при разных параметрах вычислений с плавающей запятой? Применение планировщика задач в этом случае затрудняется, поскольку потребуется писать много бесполезного кода.

В Intel TBB 4.2 U4 появился новый подход на основе task_group_context: функциональность task_group_context была расширена для управления параметрами вычислений с плавающей запятой для задач, связанных с ним, с помощью нового метода

получающего эти параметры из вызывающего потока и передающего их своим задачам. Таким образом, вы можете без труда задать нужные параметры для того или иного параллельного алгоритма:

Пример #7. Задание параметров вычислений с плавающей запятой для определенного алгоритма.

Пример 7 не особенно интересен, поскольку можно добиться такого же результата, если указать fp1 до инициализации планировщика задач. Рассмотрим гипотетическую проблему, когда для двух частей вычисления требуются разные параметры. Эту проблему можно решить так:

Пример #8. Задание параметров вычислений с плавающей запятой для разных частей вычислений.

Я уже продемонстрировал одно свойство подхода на основе контекста группы задач в примерах 7 и 8: заданные таким способом параметры имеют более высокий приоритет, чем параметры, заданные с помощью планировщика задач, когда контекст указывается для параллельного алгоритма Intel TBB. При этом подходе наследуется еще одно свойство: вложенные параллельные алгоритмы наследуют параметры вычислений с плавающей запятой из контекста группы задач, указанного для внешнего параллельного алгоритма.

Пример #9. Вложенные параллельные алгоритмы.

Если нужно использовать планировщик задач внутри вложенного алгоритма, можно использовать контекст изолированной группы задач:

Пример #10. Вложенный параллельный алгоритм с изолированным контекстом группы задач.

В одном блоге невозможно продемонстрировать все возможности поддержки вычислений с плавающей запятой в Intel TBB. Но приведенные примеры демонстрируют основные идеи управления параметрами таких вычислений в Intel TBB для применения в реальных приложениях.

Основные принципы параметров вычислений с плавающей запятой можно объединить в следующий список:

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

P.S. Отложенный планировщик задач получает параметры с плавающей запятой при вызове метода инициализации.

Пример #11: Явная инициализация планировщика задач.

P.P.S. Будьте осторожны, если вы используете функцию автоматической записи в планировщике задач. Она не будет работать, если вызов вашей функции осуществляется внутри другого параллельного алгоритма Intel TBB.

Пример #12. Еще одно предупреждение: берегитесь библиотечных функций.

Фрагмент кода 1. Слегка измененный пример 1. Это работоспособный код, здесь нет ошибок.

Фрагмент кода 2. Достаточно вызвать фрагмент кода 1 как библиотечную функцию.

Этот пример выглядит вполне безобидным, поскольку фрагмент кода 1 задаст нужные параметры и будет выполнять вычисления с fp0. Но в этом примере есть две проблемы:

  1. К моменту вызова фрагмента кода 1 планировщик задач уже будет инициализирован и уже получит fp1. Поэтому фрагмент кода 1 будет выполнять вычисления с fp1, не учитывая параметры fp0;
  2. Изоляция пользовательских параметров вычислений с плавающей запятой нарушается, поскольку фрагмент кода 1 изменяет эти параметры внутри задачи Intel TBB, но не восстанавливает первоначальные параметры. Поэтому нет никаких гарантий относительно параметров вычислений с плавающей запятой после выполнения параллельного алгоритма Intel TBB во фрагменте кода 2.

Intel Pentium 4 1,4 ГГц

Редакция

03 апреля 2001

Столкнувшись с множеством проблем при попытке увеличить частоту процессора Pentium III выше 1ГГц, Intel поняла, что старая архитектура процессоров, не менявшаяся с времен PentiumPro требует радикальных изменений. И хотя переход производства на 0,13 мкм поможет Pentium III еще около года вполне достойно выполнять свою работу (ожидается, что частота Pentium III поднимется до 1,5 ГГц) потенциал этой архитектуры уже практически исчерпан и компания для своих новых 32-х разрядных процессоров разработала новую архитектуру, которую назвала Intel NetBurst Micro-Architecture.

Pentium 4

Для того, чтобы процессоры могли работать на частотах порядка нескольких гигагерц Intel увеличил длину конвейера Pentium 4 до 20 стадий ( Hyper Pipelined Technology ) за счет чего удалось даже при текущих технологических нормах (0,18мкм) добиться работы процессора на частоте в 2ГГц. Однако из-за такого увеличения длины конвейера время выполнения одной команды в процессорных тактах также сильно увеличивается. Поэтому компания сильно поработала над алгоритмами предсказания переходов ( Advanced Dynamic Execution ). Количество предварительно загружаемых инструкций увеличилось до 126 по сравнению с 48 у Pentium III. Буфер, хранящий адреса условных переходов, также увеличился с 512 байт до 4 КБ. Все это позволило увеличить вероятность правильного предсказания переходов на 33%.

Для ускорения работы целочисленных операций в Pentium 4 применена технология удвоения внутренней тактовой частоты ( Rapid Execution Engine ). Два блока АЛУ (арифметико-логическое устройство), выполняющие операции над целочисленными данными работают на частоте вдвое большей, чем частота самого процессора.

Кэш 1-го уровня в процессоре также претерпел значительные изменения. В отличие от Pentium III, кэш которого мог хранить команды и данные, Pentium 4 имеет всего 8 КБ кэш данных. Команды, поступающие на исполнение процессору, сохраняются в так называемом Trace Cache . Там они хранятся уже в декодированном виде, т.е. в виде последовательности микроопераций, поступающих для выполнения в исполнительные устройства процессора. Емкость этого кэша составляет 12000 микроопераций.

Кэш 2-го уровня в Pentium 4, сделанном на ядре Willamette, остался объемом 256 КБ. Ширина шины кэша L2 составляет 256 бит, но латентность кэша уменьшилась в два раза, что позволило добиться пропускной способности кэша в 48 ГБ при частоте 1,5 ГГц.

Самой интересной особенностью новых процессоров Pentium 4 является расширение набора команд процессора инструкциями Streaming SIMD Extensions 2 (SSE2). В отличие от AMD, которая сильно переработала блок FPU, Intel решила оставить его практически без изменений, но зато дополнила его множеством команд для работы с потоками данных. К 70 инструкциям SSE, работающим с потоковыми данными одинарной точности добавились 144 инструкции для работы с числами двойной точности, а также с целыми числами длиной от одного до восьми байт. Оптимизация программ под SSE2 должна увеличить их производительность от 2 до 5 раз.

Текущая версия процессора Pentium 4, основанного на ядре Willamette, производится по технологии 0,18 мкм, работает при напряжении питания 1,7 В и имеет частоты от 1,3 до 1,5 ГГц. Для этих процессоров требуются новые материнские платы на чипсете i850. Процессоры вставляются в новое гнездо Socket 423.

Чипсет i850

Для системных плат, предназначенных для работы с Pentium 4, Intel разработала новый чипсет i850. Он состоит, как и все новые чипсеты серии i8xx из 3 микросхем-хабов: MCH (Memory Controller Hub), ICH (Input/Output Controller Hub) и FWH (Firmware Hub).

Главным компонентом чипсета, отличающем его от других чипсетов этой серии, является MCH 82850. Он обеспечивает взаимодействие процессора, памяти, графического контроллера, а также осуществляет связь посредством высокоскоростной шины с пропускной способностью 266 МБ/сек с I/O Controller Hub. MCH 82850 поддерживает работу только одного процессора Pentium 4 (двухпроцессорных плат на i850 сделать невозможно). Для полноценной загрузки процессора работой требуется очень высокая пропускная способность шины, связывающей чипсет, процессор и память. Она работает на частоте 400 МГц (тактовая частота, составляющая 100 МГц, умножается на 4), что обеспечивает пропускную способность шины в 3,2 ГБ/сек. Поэтому, для полной загрузки этой шины чипсет работает одновременно с двумя каналами Rambus (модули RIMM устанавливаются на материнскую плату парами), обеспечивая требуемую пропускную способность. (с памятью PC800 RDRAM). MCH рассчитан для работы с памятью PC600 и PC800 RDRAM.

Для работы с графической картой MCH 82850 поддерживает стандарт AGP4x, работающий при напряжении 1,5 В. Разъем под этот стандарт отличается от обычного наличием перемычки в задней части разъема (наличие этой перемычки и послужило причиной невозможности установить в материнские платы под Pentium 4 видеокарт Voodoo 5).

В качестве I/O Controller Hub используется ICH2 82801BA, хорошо известный по чипсетам для Pentium III i815E, i815EP и i810E2. Основными его особенностями являются поддержка стандарта Ultra ATA100, наличие 6-ти канального звука AC97 и встроенного сетевого интерфейса на 100 Мбит/сек. Также он поддерживает одну шину PCI 2.2 и имеет два встроенных контроллера шины USB 1.1. Текущая версия ICH2 оказалась не совсем совместима с MCH 82850. Некоторые карты PCI (некоторые версии аппаратных DVD декодеров) оказались неработоспособными с этим чипсетом. В настоящее время Intel уже разрешило уже имеющиеся проблемы и в конце февраля должна начать выпуск нового степпинга микросхемы ICH2.

Firmware Hub в i850 также не изменился. Его роль выполняет чип 82802 и используется он для хранения BIOS материнской платы и в качестве генератора случайных чисел.

Корпус

Intel ужесточила требования для корпуса ATX под материнские платы с Pentium 4. Теперь корпус должен соответствовать стандарту ATX 2.03. Это выражается в некоторых дополнительных требованиях как к самому корпусу, так и к блоку питания.

Поскольку процессоры Pentium 4 работают на частотах порядка нескольких гигагерц, то для того чтобы избежать перегрева процессора, он имеет очень массивный радиатор (весит порядка 400 г.). Крепление такого радиатора к материнской плате невозможно, поэтому он закрепляется 4 винтами на шасси корпуса. Соответственно в корпусе должны быть необходимые отверстия под эти винты .

Для обеспечения стабильной работы материнской платы блок питания в корпусе должен иметь мощность 300 Вт. Также он должен иметь дополнительный 4-х контактный разъем для подключения к материнской плате, обеспечивающий дополнительное питание +5 и +12В для процессора.

Тестирование реальной системы.

К нам на тестирование поступила материнская плата производства Intel D850GB, основанная на чипсете i850 и процессор Pentium 4 с частотой 1,4 ГГц в комплекте с двумя модуля RIMM PC800 производства Kingston объемом по 64 МБ. Эти модули идут в комплекте с процессором.

D850GB

Основные возможности платы D850GB описаны ниже.

  • Процессор
    • Socket-423 процессор Intel Pentium 4 1,3-1,5 ГГц
    • Системная шина 400МГц
  • Чипсет
    • Memory Controller Hub — Intel 82850
    • I/O Controller Hub 2 — Intel 82801
    • Firmware Hub — Intel 82802AB
  • Системная память
    • 4 слота RIMM
    • Поддержка двух каналов RDRAM: до 2 гигабайт PC800/PC600 RDRAM памяти
    • Поддержка ECC
  • Слоты расширения
    • 1 слот AGP Pro/AGP 4x 1,5В
    • 5 слотов PCI стандарта 2.2
    • 1 слот CNR
  • Порты ввода/вывода
    • Один разъем для FDD
    • Один последовательный и один параллельный порты
    • Порты для PS/2 мыши и клавиатуры
    • Четыре встроенных порта USB
  • Интегрированный IDE контроллер
    • 2 канала IDE, поддерживающие протоколы ATA33/66/100 (с поддержкой до 4 ATAPI-устройств)
  • Интегрированное аудио
    • Аналоговый аудиокодек Analog Devices AD1881, подключенный к контроллеру AC97
  • Сетевой контроллер
    • Intel® 82562EM 10/100 Mб/сек, интегрированный в ICH2. Поддерживается функция Wake on LAN
  • BIOS
    • Intel/AMI BIOS, прошитый в 4 МБ флэш FMH
    • Поддержка ACPI, APM и PnP
  • Форм-фактор
    • ATX 24,4 см x 30см

Плата поставляется с двумя заглушками под разъемы RIMM. BIOS платы сделан на основе AMI BIOS и обладает минимумом настроек. Никаких возможностей разгона в BIOS не предусмотрено. При пуске системы автоматически определяются параметры установленного процессора и памяти и изменить из BIOS их невозможно.

Условия тестирования.

Тестирование платы с процессором проводилось с использованием следующего оборудования:

  • Материнская плата D850GB. BIOS версии P08-053.
  • Процессор Pentium 4 1,4 ГГц.
  • Жесткий диск IBM DTLA-307020
  • Видеокарта Asus V7700 32 МБ DDR SGRAM. DVD-ROM Asus 8x

Для cравнения использовались

  • Материнская плата Asus CUSL2. BIOS версии 1003
  • Процессор Pentium III 866 МГц
  • Память DIMM 128 МБ PC133. Все параметры памяти в BIOS’е материнской платы настроены на максимальную производительность CAS Latency — 2, SDRAM RAS to CAS Delay — 2, SDRAM Cycle Time — 5T/7T).
  • Звуковая карта SB Live 1024.

При тестировании использовалось следующее программное обеспечение:

  • Тестирование проводилось под управлением Windows 2000 Professional (English) с установленными Service Pack1, Internet Explorer 5.5, DirectX80 и WMP7.
  • Для видеокарты использовались WHQL драйвера от nVIDIA версии 6.62. Адресация по боковой полосе отключена.
  • Для интегрированного аудио на D850GB устанавливались драйвера SoundMAX2 3012.
  • Звуковая карта SB Live 1024 использовалась с драйверами LiveWare 3.0 для Windows 2000
  • На обе тестируемые системы устанавливались Intel Ultra ATA Storage Driver версии 6.03.009.
  • При тестировании использовался Quake 3 v1.17. Все параметры графики были настроены на максимальное качество изображения, разрешение экрана 1024x768x32 VSinc on. Звук был установлен High.
  • При тестировании в пакетах Winbench 99 и Content Creation Winstone 2000 выставлялось в 1024x768x32 при частоте 75Гц.
  • Для кодирования видеофайла применялась программа FlackMPEG, оптимизированная под SSE2, и кодек DivX;) версии 3.20.

Все тесты выполнялись по три раза. В качестве итогового значения бралось их среднее арифметическое.

Результаты тестирования.

Общую производительность системы можно оценить на основе Content Creation Winstone 2000. В этом тесте исследуется работа в таких приложениях, как Adobe Premier, Netscape Navigator, Microsoft Excel и т.п.

Для оценки производительности работы процессора вместе с памятью используются тесты CPUmark 99 и FPU WinMark из пакета Winbench 99 ver 1.1. Тест CPUmark99 измеряет производительность процессора при выполнении целочисленных операций. На результаты этого теста сильное влияние оказывает скорость работы процессора с оперативной памятью.

Тест FPU WinMark определяет производительность процессора на операциях с плавающей точкой. На величину этого теста большее влияние оказывает объем и скорость кэш памяти процессора.

Как мы видим Pentium 4 показывает очень низкие результаты во всех трех тестах. При разнице в частоте в 534 МГц (60%) разница в производительности не превышает 10% (в CPUmark 99 — 8%, в FPU WinMark и того меньше — 4%). Очевидно, что на проблемы с производительностью наибольшее влияние оказывает длинный конвейер. При ошибочном предсказании перехода весь конвейер процессора очищается и вычисления приходится начинать сначала, а от начала вычислений до выдачи результата в блоке FPU должно пройти не менее 20 тактов процессора. Также на результаты вычислений оказывает влияние очень низкая латентность памяти RDRAM.

Посмотрим, как Pentium 4 поведет себя в играх. В приложениях такого рода очень интенсивно используются операции с плавающей точкой с большим количеством однородных данных. В качестве тестов, позволяющих определить возможности Pentium 4 в играх, использовался Quake 3 и пакет 3Dmark2000 ver 1.1. Следует учесть, что эти программы не имеют никакой оптимизации под SSE2.

В целом результаты тестов соответствуют результатам в FPU WinMark. Однако скорость работы в таких 3D приложениях очень сильно зависит от возможностей видеокарты. Поскольку мощности обоих процессоров хватает, чтобы практически полностью загрузить работой GeForce 2 GTS. Для того, чтобы определить возможности самого процессора в тесте 3Dmark 2000 использовался программный блок T&L.

Здесь процессор проявил себя значительно лучше. Этот тест позволяет оценить возможности процессора в таких приложениях, как 3DStudio, Maya и им подобных, где окончательный рендеринг сцены строится только процессором. В данном тесте сам процессор обсчитывал сцену и возможности потоковой обработки данных позволили Pentium 4 улучшить результаты на 22% по отношению к Pentium III 866 МГц.

Для оценки возможности SSE2 мы решили посмотреть как справиться процессор с кодированием фильма из формата MPEG 2 в формат DivX;). Для кодирования использовалась программа FlackMPEG, оптимизированная под SSE2. Весь необходимый софт можно найти здесь. В качестве источника данных использовался vob файл с диска DVD. При кодировании параметры кодека оставлялись по умолчанию.

Благодаря технологии SSE2 и возможностям процессора и памяти работать с большими объемами данных время кодирования файла было более чем в 2 раза меньше, чем на Pentium III.

Выводы

Новый процессор фирмы Intel Pentium 4 не является рекордсменом ни по скорости компьютера, собранного на его основе, ни по стоимости этого компьютера. Выпуском этого процессора Intel хочет подготовить пользователей к смене аппаратной архитектуры процессора, которая не менялась уже 5 лет со времен PentiumPro. Пока что компьютеры на базе этого процессора выглядят не слишком привлекательно из-за их стоимости и производительности на обычных приложениях (по сравнению с Pentium III и Athlon). Похожая ситуация была у Intel и при выходе PentiumPro, поэтому можно ожидать, что с выходом во второй половине этого года процессоров, сделанных на ядре Northwood вместе с чипсетом под дешевую память SDRAM и появлением большого числа приложений оптимизированных под Pentium 4, этот процессор займет свое место в высокопроизводительных ПК (а со временем и вовсе вытеснит PentiumIII).

Сейчас компьютер на базе процессора Pentium 4 можно рекомендовать тем, кто профессионально занимается обработкой видео и звука, а также 3D анимацией и другими аналогичными задачами.

«Оптимизация для PENTIUM процессора» — читать интересную книгу автора

ОПТИМИЗАЦИЯ ДЛЯ PENTIUM ПРОЦЕССОРА
**********************************
Права на распространение Ангера Фога, (c) 1996
Перевод Дмитрия Померанцева, (c) 1997 FTS Labs.

0. примечание переводчика
1. введение
2. литература
3. отладка и проверка
4. модель памяти
5. выравнивание
6. кеш
7. блокировка генерации адреса (AGI)
8. спаривание инструкций
9. исполнение кода в цикле
10. неполное спаривание
11. замена сложных инструкций на более простые
12. переходы и ветви
13. префиксы
14. уменьшение длины кода
15. планирование операций с плавающей точкой
16. оптимизация цикла
17. обзор специальных инструкций

18. целые числа вместо чисел с плавающей точкой
19. числа с плавающей точкой вместо целых чисел
20. список целочисленных инструкций
21. список инструкций с плавающей точкой
22. скоростные испытания
23. соображения о других микропроцессорах

0. ПРИМЕЧАНИЕ ПЕРЕВОДЧИКА
=========================
Прежде всего я хочу сказать, что я не являюсь профессиональным переводчиком
и ранее не занимался переводами технической документации. Возможно, где то
в тексте будут встречаться литературные огрехи, но в любом случае —
документация на английском языке из любопытной вещи превратилась во вполне
понятное руководство, пригодное к повседневной работе.

И так, прежде всего несколько неточностей — что бы не загромождать текст
фразами типа: «инструкции, оперирующие с числами с плавающей точкой», я
просто называю их «инструкции с плавающей точкой», справедливо пологая, что
от технического руководства не будут требовать литературных изысков. Подобная
ситуация наблюдается и с целыми числами. Надеюсь, что теперь вы правильно меня
поймете и подобные выражения в тексте не будут вызывать праведный гнев.

В остальном же я старался при переводе сохранить первоначальный смысл текста,
передать его вам без искажений. Пользуйтесь на здоровье.

Оптимизация для pentium процессора планирование операций с плавающей точкой

ОПТИМИЗАЦИЯ
6.1. Приемы оптимизации для процессоров Intel Pentium

Все, что здесь написано, является выборкой наиболее важных на мой взгляд фактов из документации от Agner Fog. Если вы серьезно интересуетесь оптимизацией для Intel Pentium (plain, MMX, PPro, P2), найдите и прочтите эту документацию (я нашел на www.agner.org/assem .

6.1.1. Спаривание целочисленных команд

По-моему, основной прием ускорения. Дело в том, что у процессоров Pentium есть два конвейера обработки команд, U-pipe и V-pipe. В результате некоторые пары команд могут исполняться одновременно, а это практически удваивает скорость.

Эти команды могут быть исполнены и в U-pipe, и в V-pipe, и при этом могут быть спарены (с какой-либо другой командой):

mov reg/mem,reg/mem/imm
push reg/imm
pop reg
lea, nop, inc, dec, add, sub, cmp, and, or, xor
некоторые формы test

Эти команды могут быть исполнены только в U-pipe, но при этом все-таки могут быть спарены:

adc, sbb
shr, sar, shl, sal на заданное число
ror, rol, rcr, rcl на единичку

Эти команды могут быть исполнены в любом конвейере, но могут быть спарены только в V-pipe:

near call (близкий вызов)
short/near jump (короткий/близкий переход)
short/near conditional jump (короткий/близкий переход по условию)

Все остальные целочисленные команды могут быть исполнены только в U-pipe и не могут быть спарены вообще.

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

    Первая команда может быть исполнена и спарена в U-pipe, вторая, соответственно, в V-pipe.

Если первая команда записывает что-то в регистр, то вторая команда не может производить чтение/запись из регистра. Причем, в этом условии части регистров считаются за весь регистр (то есть, запись в al/ah расценивается как запись в eax, а запись в cf — как запись в flags).

  • Две команды, записывающие что-то в регистр флагов, могут быть спарены, несмотря на условие 2:
  • Команда, записывающая что-то в регистр флагов, может быть спарена с условным переходом, несмотря на условие 2:
  • Следующие пары команд могут спариться несмотря на то, что обе команды изменяют esp:
  • Существуют ограничения на исполнение команд с префиксом. Префиксы возникают в таких случаях:
    • команда, адресующаяся не к сегменту по умолчанию, имеет префикс сегмента (примеры: mov eax,es:[ebx]; mov eax,ds:[ebp])
    • команда, работающая с 16-битными операндами в 32-битном режиме или с 32-битными операндами в 16-битном режиме, имеет префикс разрядности операнда (примеры: mov ax,1234 в защищенном режиме; mov ax,word ptr [variable] в защищенном режиме; xor eax,eax в реальном режиме)
    • команды, использующая 32-битную адресацию в 16-битном режиме, имеет префикс разрядности адреса (пример: mov ax,[ebx] в реальном режиме)
    • rep, lock — префиксы (пример: rep stosd)
    • многие команды, которых не было на 8086, имеют двухбайтовый код команды, где первый байт равен 0Fh. На процессоре Pentium без MMX этот байт считается префиксом. Наиболее часто встречающиеся команды с префиксом 0Fh: movzx, movsx, push/pop fs/gs, lfs/lgs/lss, setXX, bt/btc/btr/bts/bsf/bsr/shld/shrd, imul с двумя операндами и без операнда-числа (immediate).

    На процессоре Pentium без MMX команда с префиксом может исполняться только в U-pipe, исключение — близкие переходы по условию (conditional near jumps). На процессоре Pentium с MMX команды с префиксами 0Fh и размера операнда или адреса может исполняться в любом конвейере; но команды с префиксами сегмента, rep или lock (повторения или блокировки шины) могут исполняться только в U-pipe.

    Команда, в которой одновременно участвует смещение (displacement) и заданное число (immediate) не может быть спарена на процессоре Pentium без MMX и может быть выполнена и спарена только в U-pipe на процессоре Pentium с MMX. Вот примеры:

    Спаривающаяся команда, которая читает из памяти, считает и записывает результат в регистр или в регистр флагов занимает 2 такта. Спаривающаяся команда, которая читает из памяти, считает и записывает результат обратно в память занимает 3 такта. Примеры таких команд:

    Существует также так называемое неполное спаривание (imperfect pairing), когда обе команды выполняются в разных конвейерах, но НЕ одновременно (возможно, частично перекрываясь по времени исполнения), а следующие за ними команды не могут начать исполнение, пока обе команды не закончатся. Такое случается в следующих случаях:

    1. Вторая команда вызывает AGI (address generation interlock, блокировка генерирования адреса). Это происходит, если адрес, используемый во второй команде зависит от регистров, измененных в первой команде. Примеры:
    2. Две команды одновременно обращаются к одному и тому же двойному слову памяти. Примеры (подразумевается, что esi делится на 4):
    3. Две команды одновременно обращаются к адресам, в которых одинковы биты 2-4 (это вызывает конфликт кэш-банков). Для dword-адресов это значит, что разница между двумя адресами делится на 32. Пример:
    4. Первая команда производит чтение, подсчет и запись одновременно; вторая — чтение и изменение; в этом случае число тактов, требующееся для выполнения пары команд, можно рассчитать по следующей таблице:
    первая команда
    вторая команда mov или
    регистровая
    чтение/
    подсчет
    чтение/подсчет/
    запись
    mov или регистровая 1 2 3
    чтение/подсчет 2 2 4
    чтение/подсчет/запись 3 3 5

    У процессора Pentium непосредственно на кристалле есть 8k кэш-памяти (это т.н. кэш-память первого уровня, L1 cache) для кода и 8k — для данных. Данные из L1 cache считываются/записываются за один такт; кэш-промах же может стоить довольно много тактов. Таким образом, для наиболее эффективного использования кэша необходимо знать, как он работает.

    Итак, L1 cache состоит из 256 кэш-линий (cachelines), по 32 байта в каждой. При чтении данных, которых нет в кэше, процессор считывает из памяти целую кэш-линию. Кэш-линии всегда выравнены на физический адрес, делящийся на 32; так что если прочитать байт по адресу, делящемуся на 32, то можно читать и писать в следующий за ним 31 байт без всяких задержек. Свои данные имеет смысл располагать с учетом этого факта — например, выравнивать массивы из структур длиной 32 байта на 32; перед записью в видеопамять читать оттуда один байт (один раз на 32 записываемых байта); используемые вместе данные располагать вместе; и так далее.

    Но кэш-линия не может быть связана с любым физическим адресом. У каждой кэш-линии есть некое 7-битное «заданное значение» (set-value), которое должно совпадать с битами адреса 5-11. Для каждого из 128 возможных значений set-value есть две кэш-линии. Отсюда следует то, что в кэше не может одновременно содержаться более двух блоков данных с одинаковыми битами адреса 5-11. Чем это чревато, покажем на примере.

    У используемых трех адресов будет одинаковое значение в битах 5-11. Поэтому к моменту самого первого чтения в ecx в кэше точно не окажется свободной кэш-линии, процессор выберет для нее наименее использованную (least recently used) линию, ту самую, которая была использована при чтении eax. При чтении ebx, соответственно, будет заново перекрыта линия, использованная при чтении ecx. В результате цикл будет состоять из сплошных кэш-промахов и съест порядка 60 тактов. Если же поменять 28 на 32, изменив, таким образом, на единичку биты 5-11 для адреса [esi+20*4096+28], то для чтения в eax и ebx будут как раз использованы две имеющихся линии, для чтения в ecx — третья, не совпадающая ни с одной из этих двух. В результате — скорость порядка трех тактов на один проход и ускорение примерно в 20 (. ) раз.

    Еще одна интересная вещь, которую стоит учесть — Pentium НЕ загружает кэш-линию при промахе записи; только при промахе чтения. При промахе записи данные пойдут в L2 cache или память (в зависимости от настроек L2 cache). А это довольно медленно. Поэтому, если мы последовательно пишем в один и тот же 32-байтовый блок, но не читаем оттуда, то имеет смысл сначала сделать холостое чтение из этого блока, чтобы загрузить его в L1 cache; тогда все последовательные операции записи будут есть только по одному такту.

    6.1.3. Разные трюки

    Трюков есть много, перечислим здесь только наиболее часто используемые:

    работа с fixed point вместо floating point иногда (если код не слишком сильно насыщен математикой) быстрее; практически всегда быстрее для клонов;

    все данные желательно выравнивать по адресам, кратным размеру данных (то есть, переменные-байты можно не выравнивать, слова — выравнивать на 2, двойные слова — на 4); обращение к невыравненной переменной влечет за собой задержку минимум на три такта;

    деление на заранее известное число можно заменить умножением на обратное ему число;

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

    Илон Маск рекомендует:  Вопpосы и ответы по directdraw
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL