Eugene
Может, и до fault'а :)
Anonymous
спасибо, ну теперь хотя бы ясно, что это именно из за 0 в rdx )
Dolphin
Dolphin
почему минус 1 ?
ну типа, если это счетчик, то он декрементируется вконце цикла пересылки, после чего проверяется на ноль. А так как ты отправляешь ноль, то на выходе получишь -1 :)
Ну это предположение, да.
Dolphin
Хотя я уже заебался этот тест покрывать в разных кейсах :D
Dolphin
Проверь, с чем программеры не шутят ;)
Anonymous
получается системный вызов при первом срабатывании сначало декременирует счетчик и только потом уже проверяет на ноль
Anonymous
странно как-то
Anonymous
если бы в конце декремент был, то вначале проверка на ноль, и так как ноль выход получается из цикла ничего не выводя
Dolphin
Dolphin
Ладн забей
Anonymous
может я не совсем корректно выражаюсь, но интересна логика вызова системного, почему именно так получается
Anonymous
при 0
Eugene
Сделай
xor ecx,ecx
blabla:
...
loop blabla
И посмотри сколько будет выполнено итераций. В 64 битах, боюсь, даже завершения не дождёшься :)
Eugene
Странно, что нет защиты, но уж что есть, то есть...
Eugene
Поскольку это всё же системный интерфейс, то такую простую защиту можно было бы и сделать.
Но чего обмусоливать? Как есть, так и есть.
Aiwan \ (•◡•) / _bot
Это торвальдс виноват когда ядро писал
Ivan
норм практика вывести текст на экран и сделать x: jmp x
Aiwan \ (•◡•) / _bot
Eugene
cli главное не забыть (из рута) :)
Vyacheslav
Anonymous
Слопай пряник.
Artem
надеюсь картинка по теме чата
Artem
Aiwan \ (•◡•) / _bot
http://sasm.narod.ru
Anonymous
Мне кажется или она "слегка" не закончена?)
Eugene
Приветище всем!
Кто шарит в оптимизациях и устройстве Intel?
Забавная ситуация. Написал небольшой тестовый код (на коленке) для запуска из-под Windows.
На C и на C++ тестовый код одинаковый. Запускаю – разница ≈1.1 секунда(!), т.е. 7.4 и 8.5. сек.
Прилично, согласитесь (15%).
Смотрю листинги на асме – один в один, отличаются только регистры (r8 вместо r9 и т.п.).
Смотрю в HIEW и вижу забавную картину: на C++ основной цикл, который крутится выравнен по 16 байтам, а на C сдвинут на 1 байт относительно 16. При этом на C как раз быстрее.
Добавляю в начало незначительный код (volatile int x = 5;) и C начинает работать на секунду медленнее, т.е. как C++.
Очень хочется понять в чём тут прикол!
Аномалия какая-то, но это как-то должно же объясняться. Тем более, такое не только у меня, но и ещё у одного чувака как минимум.
Eugene
Чтобы не постить сюда подробности и код скину просто ссылку на тему васма
https://wasm.in/threads/pochemu-ehtot-kod-bystree-chem-tot.32990/
Eugene
У меня Intel Core i5-2500K (Sandy Bridge), если что.
kitsu
Anonymous
Меня не пускает на тот сайт
Eugene
nop внутрь цикла не попадает
Anonymous
АХТУНГ АЛЕРТ
Anonymous
и баста
Eugene
Кто пишет алерт?
Eugene
Eugene
Ну тогда см. тут
kitsu
Eugene
gcc -O2 -s
g++ -O2 -s
исходники соответственно:
gcc -S -O2 -masm=intel
g++ -S -O2 -masm=intel
Anonymous
А на что жалобы?
Eugene
Почему у одинакового кода разница 1 сек?
Eugene
15% скорости
Anonymous
Щя у себя прогоню
kitsu
kitsu
kitsu
Eugene
Это прекрасно. Теперь хочется понять причину.
Eugene
И это именно на GCC/G++, на Clang нет такого.
Eugene
Да там ж нет вывода в цикле :)
Eugene
Картина будет наверняка другая, т.к. код сдвинется :)
kitsu
хз
kitsu
гм, забавно
у clang у меня плюсовый код работает незначительно быстрее
Eugene
и такое бывает :)
Anonymous
У меня 6 и 7 сек соответственно
Anonymous
Под виндой у меня нету gcc
Eugene
С -g уже так не работает, одинаково показывают.
Там в архиве есть картинки и кусочек асм-листинга
Anonymous
неважно
Anonymous
для анализов оно надо
Anonymous
если там что-то плохое есть, оно покажет
Eugene
Тогда чуть позже, я пока ушёл.
А что он может показать? Код меду clock-ами одинаковый :)
Anonymous
Address Line Assembly Total Time % Self Time % Traits
0 0x402d4e test rdx, rdx 6.515s 29.89% 6.515s 89.68%
Anonymous
6,5 сек на эту инструкцию тратит
Eugene
Чем смотрите?
Anonymous
Address Line Assembly Total Time % Self Time % Traits
0 0x402cff test rdx, rdx 5.873s 31.33% 5.873s 94.00%
Anonymous
Intel Advisor
Eugene
Там вообще число передаётся простое, потому только внешний цикл будет крутиться, как раз между add r8,1 и этим test/jnz.
Anonymous
Вот с дебажным ключиком я бы мог полностью прогнать
Anonymous
Кстати
Anonymous
различие только в том, что gcc в одном случае, а g++ в другом?
Eugene
Ок, чуть позже будет :)
Anonymous
Если так, то наверное, надо и версию стандарта одинаковую вбить
Eugene
Один код на С, другой на плюсах. Ну т.е. cout. Я сишный не пробовал через g++, надо потестить тоже.
Anonymous
А-а-а-!