Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
Возникла необходимость посмотреть, сколько тактов в среднем уходит на выполнение простейших арифметических операций у CPU.
Были написаны подобные простенькие функции (в Borland C++ Builder 6):
Код:
Cardinal __fastcall DepALUM(Cardinal count) { Cardinal ttsca1,ttsca2,ttscd1,ttscd2; Cardinal rnd1=random(0x000011FF); Cardinal rnd2=random(0x000011FF); Cardinal rnd3=random(0x000011FF); asm { pushad mov ecx,count mov esi,rnd1 mov ebx,rnd3 rdtsc mov ttsca1,eax mov ttscd1,edx mov eax,1 @rp: mul eax,rnd3 mul eax,esi mul eax,eax mul eax,rnd2 mul eax,ebx dec ecx jnz @rp rdtsc mov ttsca2,eax mov ttscd2,edx popad } return ((0xFFFFFFFF*(ttscd2-ttscd1)+(ttsca2-ttsca1))); }
для add/sub,mul,fadd,fmul,fdiv.
И отдельно функция с пустым циклом для измерения затрат на организацию этого цикла.
Что получилось в результате:
1. FPU у К7 и К8 обладают одинаковыми показателями такты/инструкции (с точностью до 2 знака после запятой). ALU у К7 в 1,5-2 раза медленнее, чем у К8.
2. FPU Pentium MMX медленнее K7 и К8 в 5 раз. ALU - в 2 раза медленнее, чем у К7.
3. ALU Pentium 4 находится между К7 и К8, а вот FPU - в 10 раз медленнее, чем у Pentium MMX.
Насколько справедливы такие выводы? Неужели и правда FPU у Р4 такое жуткое? Может, мне надо было пару лет назад это написать и показать Северу НН?
Или это какая-то ерунда в идее/алгоритме/реализации функции?
Member
Статус: Не в сети Регистрация: 07.05.2004 Откуда: Rostov-on-Don
Tod Schwarzkaiser писал(а):
Северу НН
не поминай в суе.....подальше от греха
Tod Schwarzkaiser писал(а):
И отдельно функция с пустым циклом для измерения затрат на организацию этого цикла.
может дело в этом, пока пень подготавливает свой длинющий конвеер к циклу этож уйма времени.
Кроме того, из-за той же причины, выполнение простейших операций также дело доолгое.
инструкция попала в конвеер за 3-4 такта выполнилась, а пока до конца дошла.... скоко у пня ступеней конвеер 20-30, а потом перезагрузка в случае неправильного предсказания ветвления.
В теории можно написать такой код, не шибко сложный но который будет постоянно преводить к перезагрузке конвеера, что теоритически может сделать из пня 4 - пень 2
_________________ Первичность разума над материей? Существует ли материя без разума? И наоборот?
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Tod Schwarzkaiser тут похоже наложилось все. Все-таки цикл, т.е. условные переходы, а это значит прямое влияние эфективности блока предсказания ветвлений.
Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
merlex, Daemon Относительно предсказания ветвлений у меня было такое соображение: теоретически, если у процессора % правильных предсказаний около 95 и есть некоторый порог срабатывания БПВ, то после некоторого количества итераций предсказание ветвлений значимого влияния не оказывает.
Но могу ошибаться, ибо далеко не бог и не микроархитектор...
Судя по значениям, ALU начинает показывать стабильный результат где-то с 40-48 итераций, а FPU - с 16-24.
Member
Статус: Не в сети Регистрация: 30.01.2003 Откуда: Москва
Конвейер не будет тут задействован, поскольку (если ) идет постоянное чтение-запись в одну и ту же ячейку FPU стека. Когда-то давно проводил такие опыты, и для того, чтобы P4 мог обогнать K8, надо было использовать чуть ли не весь стек Предсказания тоже не должны были влиять...тут нет никаких исключений из правил перехода, практически все время переход выполняется.
Может быть по умолчанию разная точность вычислений?
Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
S.Q.Lapp
Цитата:
здесь есть ответ
Да... Ответ есть. Но на другой вопрос. А именно - на вопрос про отвратительное поведение П4 в тесте ПСП. Но в данном случае операнды грузятся в регистры до первого снятия TSC, поэтому здесь реплей не должен вмешиваться.
Asteroid
Цитата:
Может быть по умолчанию разная точность вычислений?
Это намёк на то, что Пень в 10 раз точнее? И как мне эту версию проверить?
Ещё странно то, что целочисленное умножение почти в 7 раз медленнее у П4 происходит. Странно потому, что, вроде бы, у него Fast ALU есть... Похоже, что оно у него тоже чисто маркетинговое...
Tod Schwarzkaiser А ты уверен что у тебя там исключения возникают? Хотя б и замаскированные. Вообще же fdiv [практически] не перекрывается, так что зависимые или нет - пофиг.
Member
Статус: Не в сети Регистрация: 25.01.2003 Откуда: UA
Не факт что этот код на современных CPU работает так как должен.
Распаралеливание может привести к тому что rdtsc будет выполнена _раньше_ чем завершен цикл. Я когда писал модуль подсчета тактов для увеличения точности создавал в памяти сегмент размером ~40kb и забивал его нужными инструкциями, получается линейный код который хочешь-нехочешь а придется выполнить, последняя команда возврат туда куда нам нужно. Попробуй, в этом случае точно никакие издержки цикла и суперскалярность мешать не будут.
Member
Статус: Не в сети Регистрация: 25.01.2003 Откуда: UA
Daemon Я не про многопоточность. Даже в одном потоке суперскалярный CPU может изменить последовательность выполнения команд, естественно на разных камнях алгоритмы перекомпиляции и исполнения 'наперед' разные.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения