Сколько циклов ЦП необходимо для каждой инструкции по сборке?

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

SELECT * FROM tableName
WHERE name IN (SELECT name FROM (SELECT name, COUNT(name) FROM tableName
                                 GROUP BY name 
                                 HAVING COUNT(name) = 1) AS subQuery)
48
задан Ciro Santilli 新疆改造中心法轮功六四事件 14 June 2015 в 10:35
поделиться

4 ответа

Учитывая конвейерную обработку, неисправную обработку, микрокод, многоядерные процессоры, и т.д. нет никакой гарантии, что конкретный раздел ассемблерного кода возьмет точно x циклы цикла/независимо от того, что циклов/часов ЦП.

Если такая ссылка будет существовать, то она только сможет обеспечить широкие обобщения, учитывая конкретную архитектуру, и в зависимости от того, как микрокод реализован, можно найти, что Pentium M отличается, чем Core 2 Duo, который отличается, чем двухъядерный AMD и т.д.

Обратите внимание, что эта статья была обновлена в 2000 и написана ранее. Даже Pentium 4 трудно придавить относительно синхронизации инструкции - PIII, PII, и исходный Pentium был легче, и тексты, на которые ссылаются, вероятно, были основаны на тех более ранних процессорах, которые имели более четко определенную синхронизацию инструкции.

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

30
ответ дан GEOCHET 26 November 2019 в 18:47
поделиться

Измерение и подсчет циклов ЦП не имеют смысла на x86 больше.

Прежде всего спросите себя, для которых ЦП Вы считаете циклы? Core 2? Athlon? Pentium-M? Atom? Все эти центральные процессоры выполняют x86-код, но у всех них есть различное время выполнения. Выполнение даже варьируется между различными продвижениями того же ЦП.

Последний x86, где подсчет цикла имел смысл, был Pentium Pro.

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

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

Так или иначе: можно оценить использование ресурсов пропускной способности и задержку инструкций для различных процессоров. Релевантная информация может быть найдена на сайтах AMD и Intel.

Вуаль Agner имеет очень хорошую сводку на его веб-сайте. Посмотрите таблицы инструкции для задержки, пропускной способности и количества uop. Посмотрите microarchictecture PDF, чтобы изучить, как интерпретировать их.

http://www.agner.org/optimize

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


Btw - так как Ваш пример кода является свободной от блокировок datastructure основой: Вы рассмотрели использование встроенных функций компилятора? На win32 можно включать intrin.h и использовать функции, такие как _InterlockedExchange.

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

13
ответ дан Peter Cordes 26 November 2019 в 18:47
поделиться

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

Точные задержки для Intels и процессоров AMD перечислены в таблицах инструкции Вуали Agner. См. также Intel® 64 и Справочник Оптимизации Архитектуры IA-32, и задержки Инструкции и пропускную способность для AMD и процессоров Intel x86 (из теперь удаленного ответа Болвана Güder Банки только для ссылки). AMD также имеет руководства PDF на их собственном сайте с их официальными значениями.

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

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

Это стоит отметить, хотя, что это - большая работа для оптимизации даже нескольких строк кода на этом уровне. И легко сделать что-то, что оказывается pessimization. Современные центральные процессоры являются чрезвычайно сложными, и они пытаются чрезвычайно трудно вытащить хорошую производительность из плохого кода. Но существуют также случаи, которые они не могут обработать эффективно, или где Вы думаете, что Вы - умный и делающий эффективный код, и это, оказывается, замедляет ЦП.

Редактирование, Смотрящее в руководстве оптимизации Intel, таблице C-13: первый столбец является типом инструкции, затем существуют многие столбцы для задержки для каждого CPUID. CPUID указывает, к какому семейству процессоров числа относятся и объяснены в другом месте в документе. Задержка указывает, сколько циклов требуется, прежде чем результат инструкции будет доступен, таким образом, это - число, Вы ищете.

Столбцы пропускной способности показывают, сколько из этого типа инструкций может быть выполнено на цикл.

Ища xchg в этой таблице, мы видим, что в зависимости от семейства ЦП, требуется 1-3 цикла, и mov берет 0.5-1. Это для форм от регистра к регистру инструкций, не для a lock xchg с памятью, которая намного медленнее. И что еще более важно, чрезвычайно переменная задержка и влияние на окружение кода (намного медленнее, когда существует конкуренция с другим ядром), таким образом смотря только на лучший случай ошибка. (Я не искал то, что означает каждый CPUID, но я предполагаю, что эти.5 для Pentium 4, который выполнил некоторые компоненты микросхемы в удвоенной скорости, позволив ему сделать вещи в половине циклов),

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

22
ответ дан Peter Cordes 26 November 2019 в 18:47
поделиться

lock xchg eax, dword ptr [edx]

Note the lock will lock for the memory fetch for all cores, it can take 100 cycles on some multi cores and a cache line must be flush. Это также затормозит конвейер. Поэтому я не буду беспокоиться об остальном.

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

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

6
ответ дан 26 November 2019 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: