Russian Qt Forum

Разное => Говорилка => Тема начата: __Heaven__ от Октябрь 21, 2014, 21:21



Название: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 21, 2014, 21:21
Привет друзья.
Мне стала интересна одна тема, понимание которой у меня расплывчатое. Побудило интерес изучение основ языка ассемблера.
Со времён процессора i386 прошло немало времени. Появилось большое множество расширений, соответственно, инструкций.
А все ли инструкции используются при работе процессора в современных ОС (Windows/Ubuntu...). Имея старенький pentium 4 и современный xenon мы будем выполнять одну и ту же программу (в Windows, по крайней мере) по одинаковым инструкциям. Означает ли это то, что в современном процессоре, возможно, существуют более эффективные инструкции для решения поставленной задачи, но при этом не будут подставлены при компиляции (я все ещё про Windows) в виду совместимости со старыми процессорами?
Также интересует тот факт, что в Ubuntu для обозначения 32 битных программ используется приписка i386. Означает ли это то, что при установке deb пакетов функционал процессоров, появившихся намного позже i386, может быть задействован не полностью?

Как выжимать из процессора все под обеими осями?


Название: Re: Расширения процессоров
Отправлено: Igors от Октябрь 22, 2014, 09:07
Побудило интерес изучение основ языка ассемблера.
Это хороший, здоровый интерес, дружок :) Да, есть более эффективные инструкции, напр simd (sse2.. avх_2). Смысл в том что одной инструкцией производятся действия сразу над 4(или 8, или 16) операндами и рез-т выдается сразу для 4. Компиляторы могут создавать код с использованием таких инструкций независимо от того поддерживаются ли они текущей машиной. Но выполняться такие приложения могут только на машине с нужным simd. То же самое для др команд (не simd). Напр в опциях intel компилятора можно установить какую модель процессора поддерживать.

Гораздо больший прирост (в разы) дает планирование приложения под simd (а не просто вкл опции). У intel есть специальный "суб-компилятор" позволяющий в runtime автоматом выбирать нужную ветку в зависимости от того на какой машине исполняется. Правда такая "сборка" у меня заняла 2 недели.

Также интересует тот факт, что в Ubuntu для обозначения 32 битных программ используется приписка i386. Означает ли это то, что при установке deb пакетов функционал процессоров, появившихся намного позже i386, может быть задействован не полностью?
Это означает что приложение 32-битное, и ничего более.


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 22, 2014, 13:12
А что с процессором случается, если он получает неизвестную инструкцию? Происходит ли проверка исполняемого файла перед запуском?


Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 22, 2014, 13:33
А что с процессором случается, если он получает неизвестную инструкцию?
Сработает прерывание #13 (общая защита) и ядро убьет процесс.

Происходит ли проверка исполняемого файла перед запуском?
Нет.

Насчет эффективного использования возможностей процессора, тут все от платформы зависит. Например, Linux Gentoo компилирует весь устанавливаемый софт и как правило делает это для процессора конкретной машины (то есть будут использоваться возможности конкретного процессора установленного у пользователя). Другие linux дистрибутивы выбирают некий средний процессор и собирают все пакеты под него. Пользователь всегда может пересобрать нужную ему программу сам под нужный ему процессор. Например, пользователь использует числодробилки или кодирует видео, софт для этого он может собрать именно для его процессора, скорее всего будет работать быстрее.
Под вендой особо никто с этим не заморачивается и собирают все без поддержки самых последних процессоров. Некоторые, выделяют самые "тяжелые" функции в отдельные библиотеки и собирают версии под разные технологии. При старте программа проверяет возможности процессора и подгружается самая эффективная для данного процессора библиотека.



Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 22, 2014, 13:51
А какие компиляторы под виндой могут использовать аналог gcc -march=native?
В cmd выполнил mingw32-make --help. Опций оптимизации не нашёл. Поиск в гугле тоже не помог...


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 22, 2014, 22:45
Насчет эффективного использования возможностей процессора, тут все от платформы зависит. Например, Linux Gentoo компилирует весь устанавливаемый софт и как правило делает это для процессора конкретной машины (то есть будут использоваться возможности конкретного процессора установленного у пользователя). Другие linux дистрибутивы выбирают некий средний процессор и собирают все пакеты под него. Пользователь всегда может пересобрать нужную ему программу сам под нужный ему процессор. Например, пользователь использует числодробилки или кодирует видео, софт для этого он может собрать именно для его процессора, скорее всего будет работать быстрее.
Под вендой особо никто с этим не заморачивается и собирают все без поддержки самых последних процессоров. Некоторые, выделяют самые "тяжелые" функции в отдельные библиотеки и собирают версии под разные технологии. При старте программа проверяет возможности процессора и подгружается самая эффективная для данного процессора библиотека.
Давно заметил такую вещь: На работе комп core i7 2600, две оси: винда 7 и linux.. Один и тот же код скомпилированный под линуксом (gcc 4.8.2) отрабатывает быстрее в 4 раза чем под виндой (mingw, не помню какая там версия: идёт с Qt 5.1).. В коде используется std::thread, причём никаких дата рейсингов нет - полное 100 процентное распараллеливание.. Я, допускаю, конечно, разницу в раза полтора, но чтоб в четыре..  ???
В общем, забил я после этого на винду и на работе) Или в чём может быть причина?      


Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 22, 2014, 23:00
Не уверен, что здесь дело в компиляторах, точнее в кодогенерации. Скорее дело в планировщиках ядер linux и венды.


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 22, 2014, 23:04
Не уверен, что здесь дело в компиляторах, точнее в кодогенерации. Скорее дело в планировщиках ядер linux и венды.
Да я вот тоже не думаю, что дело в компиляторах..  Причём в диспетчере задач (или как он там называется) все 8 потоков забиты под 100%..  

Антивирусник даже специально отключал под виндой) Ну, мало ли)


Название: Re: Расширения процессоров
Отправлено: Bepec от Октябрь 23, 2014, 00:56
В винде неполное использование ресурсов в силу того, что наивысший приоритет только у системных потоков и программ. (и даже поставив галочку в диспетчере "суперприоритетный процесс", мы не достигнем приоритета системы :) )
В линуксе любой поток и приложение может иметь наивысший приоритет.

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

На винде результат отличался в худшую сторону + зависание системы.
На линуксе в лучшую сторону, но зависание системы было аналогичным.

PS на деле быстрее всех плисы. Но и дороже :D


Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 23, 2014, 05:08
В винде неполное использование ресурсов в силу того, что наивысший приоритет только у системных потоков и программ. (и даже поставив галочку в диспетчере "суперприоритетный процесс", мы не достигнем приоритета системы :) )
В линуксе любой поток и приложение может иметь наивысший приоритет.
А причем здесь приоритеты? Думаете m_ax на разных платфоомах запускает потоки с разными приоритетами и сам удивляется, почему время выполнения отличается?

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

На винде результат отличался в худшую сторону + зависание системы.
На линуксе в лучшую сторону, но зависание системы было аналогичным.
Как результат может отличаться в худшую или лучшую сторону, если в обоих случаях происходит зависание системы? Или имеется ввиду подтормаживание?


PS на деле быстрее всех плисы. Но и дороже :D
На деле плисы с процессорами общего назначения сравнивать нельзя, в виду большой ограниченности первых.


Название: Re: Расширения процессоров
Отправлено: Bepec от Октябрь 23, 2014, 08:33
Очень просто объясняется.

1) Приоритет по умолчанию в линуксе и в винде различаются. У винды есть прослойка с системным приоритетом и только потом идут пользовательские, а у линукса прослойки нет. И у линукса приоритет получается выше.

2) Подвисание дольше, а работы выполняется медленнее. Да, я неверно выразился в предыдущем сообщении. Не зависание, а подвисание системы, которое оканчивается после выполнения программы.

3) Полностью согласен. Но специализированная аппаратура всегда быстрее аппаратуры широкого профиля :D




Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 23, 2014, 08:42
1) Приоритет по умолчанию в линуксе и в винде различаются. У винды есть прослойка с системным приоритетом и только потом идут пользовательские, а у линукса прослойки нет. И у линукса приоритет получается выше.
Чем они различаются? :) О приоритете можно говорить только в контексте конкретного планировщика. У linux и виндовс они совершенно разные, поэтому сравнивать их приоритеты бессмысленно.



Название: Re: Расширения процессоров
Отправлено: Bepec от Октябрь 23, 2014, 09:59
Не бессмысленно. Приоритет по умолчанию, повторюсь, у линукса выше.


Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 23, 2014, 10:06
Не бессмысленно. Приоритет по умолчанию, повторюсь, у линукса выше.
А какой это "выше"? А насколько "выше"? А почему микрософт сделала у себя ниже, что бы у них программы тормозили? :)

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

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


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 23, 2014, 10:07
Да я вот тоже не думаю, что дело в компиляторах..  Причём в диспетчере задач (или как он там называется) все 8 потоков забиты под 100%..  
Предположу, что у вас 4 физ ядра. Быть может HyperThreading внёс как-то свою роль? (Не знаю, на каком уровне он работает.)


Название: Re: Расширения процессоров
Отправлено: Old от Октябрь 23, 2014, 10:11
Предположу, что у вас 4 физ ядра. Быть может HyperThreading внёс как-то свою роль? (Не знаю, на каком уровне он работает.)
Была бы какая нибудь XP, можно было бы предположить, что венда не умеет какие технологии i7, в то время как linux умеет. Но у m_ax семерка.


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 23, 2014, 10:36
Для чистоты эксперимента, нужно попробовать воспроизвести эту ситуацию на другой машине с теми же осями..
Есть комп (проц AMD FX 8350) с линуксом (компилятор gcc 4.8.2) но винды нет. Нужно на него винду 7 рядышком поставить и посмотреть что там будет..

На днях попробую, потом отпишусь о результатах)
 
 


Название: Re: Расширения процессоров
Отправлено: kuzulis от Октябрь 23, 2014, 10:36
Гы. А Linux 64bit? А Windows 64 bit? А приложение скомпилено и там и там под 32/64 бит? А размер оперативки <= / >= 4 GB (а сколько доступно системе?)? А жесткие диски одинаковые (или на одном диске две системы)? :)


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 23, 2014, 10:46
Гы. А Linux 64bit? А Windows 64 bit? А приложение скомпилено и там и там под 32/64 бит? А размер оперативки <= / >= 4 GB (а сколько доступно системе?)? А жесткие диски одинаковые (или на одном диске две системы)? :)
Да, обе оси 64 bit, оперативки 8 GB (дело не в памяти), обе оси на одном диске (но это тоже не должно влиять..))


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 23, 2014, 10:53
Для чистоты эксперимента, нужно попробовать воспроизвести эту ситуацию на другой машине с теми же осями..
Есть комп (проц AMD FX 8350) с линуксом (компилятор gcc 4.8.2) но винды нет. Нужно на него винду 7 рядышком поставить и посмотреть что там будет..

На днях попробую, потом отпишусь о результатах)
 
 
m_ax, можно вас заранее попросить сделать замер с -march=native и без него?
Рад бы сам поэксперементировать, но нет возможности.


Название: Re: Расширения процессоров
Отправлено: Igors от Октябрь 23, 2014, 10:59
Давно заметил такую вещь: На работе комп core i7 2600, две оси: винда 7 и linux.. Один и тот же код скомпилированный под линуксом (gcc 4.8.2) отрабатывает быстрее в 4 раза чем под виндой (mingw, не помню какая там версия: идёт с Qt 5.1).. В коде используется std::thread, причём никаких дата рейсингов нет - полное 100 процентное распараллеливание.. Я, допускаю, конечно, разницу в раза полтора, но чтоб в четыре..  ???
В общем, забил я после этого на винду и на работе) Или в чём может быть причина?      
А в 30-40 раз не хотели? :) Вчера писал тот пример с табличным методом на MSVC, и наивно вызвал std::lower_bound - время в 4 раза больше Вашего. Там какая-то ужасная реализация std


Название: Re: Расширения процессоров
Отправлено: Igors от Октябрь 23, 2014, 11:07
m_ax, можно вас заранее попросить сделать замер с -march=native и без него?
Рад бы сам поэксперементировать, но нет возможности.
"Включение бубочек" не даст какого-то принципиального прироста, ну выиграете порядка 10%, это не компенсирует неудобств с версионностью. Нужно затачивать приложение под инструкции. Напр низкоуровневая обработка имеджа - там получается здорово, в разы.


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 23, 2014, 12:23
m_ax, можно вас заранее попросить сделать замер с -march=native и без него?
Рад бы сам поэксперементировать, но нет возможности.
Попробовал сравнить время с такими опциями (под линуксом gcc 4.8.2):
 -m64 -pipe -march=native -O2 -std=c++11
и без -march=native:
 -m64 -pipe  -O2 -std=c++11

Результат один и тот же..

А вот если вместо -O2 выставить -Ofast, результат уже ощутим) у меня примерно в 1.22 раза быстрее с -Ofast


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 23, 2014, 12:55
А вот если вместо -O2 выставить -Ofast, результат уже ощутим) у меня примерно в 1.22 раза быстрее с -Ofast
Так, на всякий случай выложу
Цитировать
-Ofast: Новое в GCC 4.7, состоит из -O3 плюс -ffast-math, -fno-protect-parens, и -fstack-arrays. Этот параметр нарушает строгое соответствие стандарту, и не рекомендуется для использования.


Название: Re: Расширения процессоров
Отправлено: Alex Custov от Октябрь 23, 2014, 23:46
А какие компиляторы под виндой могут использовать аналог gcc -march=native?
В cmd выполнил mingw32-make --help. Опций оптимизации не нашёл. Поиск в гугле тоже не помог...

MinGW - это порт GNU утилит и не более того. minw32-make - это аналог make, а не gcc (который идёт под тем же именем что и в линуксе - gcc, g++ и т.д.). Опции оптимизации gcc соответственно абсолютно те же что и для линукс версии.


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 24, 2014, 11:54
А какие компиляторы под виндой могут использовать аналог gcc -march=native?
В cmd выполнил mingw32-make --help. Опций оптимизации не нашёл. Поиск в гугле тоже не помог...

MinGW - это порт GNU утилит и не более того. minw32-make - это аналог make, а не gcc (который идёт под тем же именем что и в линуксе - gcc, g++ и т.д.). Опции оптимизации gcc соответственно абсолютно те же что и для линукс версии.

А как тогда настраивать gcc под виндой? Так понимаю, что установка CXXFLAGS должна помочь?


Название: Re: Расширения процессоров
Отправлено: Alex Custov от Октябрь 24, 2014, 18:37
А как тогда настраивать gcc под виндой? Так понимаю, что установка CXXFLAGS должна помочь?

Так как это предлагает используемый тобой тулкит или менеджер проектов (типа cmake). В qmake это можно сделать как-то так

Код:
win32-g++ {
    QMAKE_CXXFLAGS += -Ofast
    QMAKE_LFLAGS += -Wl,--no-undefined
}


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 30, 2014, 20:09
И так, поставил сегодня рядышком винду 8.1..

Проц: AMD FX 8350

Результаты теста у меня такие:
Linux (gcc 4.8.2)
(с ключом -Ofast) total time: 120 sec
(с ключом -O2) total time: 146 sec

Win 8.1 (gcc 4.8.2 (i686-w64-mingw32))
(с ключом -Ofast) tatal time: 240 sec
(с ключом -O2) total time: 845 sec

Для винды ключик -Ofast ускоряет аж чуть больше чем в 3.5 раза.. (не хило так)
Но всё равно под виндой результаты (240 sec) уступают в два раза, аналогичным замерам под линуксом (120 sec)..

В принципе, могу исходники приаттачить.. Может я что-то не правильно делаю)
  


  


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 30, 2014, 21:36
Очуметь!

Спасибо за тесты.


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 30, 2014, 21:48
Очуметь!

Спасибо за тесты.
Да не за что)
Но ещё раз повторюсь, это только в моём конкретном случае (типичная числодробилка, расспараллеленная на 8 потоков), где вся нагрузка идёт на вычисления с double.. 


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 30, 2014, 21:53
Интересно, почему так... Наверное винда теряет при переключении потоков.
m_ax, а не долго сделать эти же тесты с теми же настройками системы, но на 4 потока. Так, ради интереса. Волнует тема HyperThreading в вычислительных задачах.

Всем этот линукс хорош, но почему-то на всех моих устройствах, куда я его ставил, были проблемы с wi-fi...


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 30, 2014, 21:59
Цитировать
Всем этот линукс хорош, но почему-то на всех моих устройствах, куда я его ставил были проблемы с wi-fi...
У линукса с интернетом есть проблемы? O_o) Никогда не замечал) Wi-fi прямо из коробки работал)

Цитировать
а не долго сделать эти же тесты с теми же настройками системы, но на 4 потока. Так, ради интереса. Волнует тема HyperThreading в вычислительных задачах.
 
Это не долго, но это едва ли что то изменит.. На FX 8350 8 физических ядер..
Число независимых потоков в программе определяется std::thread::hardware_concurrency()..  Пользователь не должен себе  этим голову забивать..)


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 30, 2014, 22:25
Ясно. Я не знал, что там 8 физических.

Да, с вайфаем постоянные проблемы. Либо проблемы с wpa2.
На моем samsung n150 из коробки не работает. На x200ca (текущий мой зверек) постоянно идет обрыв соединения с интернетом. Пока что грешу на то, что в ядре присутствует галочка экономии энергии. Да и дрова какие-то подозрительные для rt3290…
Также грешу на кривость рук и малоопытность. Но ничего, я читаю тут одну известную библию по администрированию. Думаю, линукс поддастся.

Сорри за оффтоп, но накипело - задолбал вырубать интернет.


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 31, 2014, 11:41
Помогите разобраться, пожалуйста.

Я добавил в pro файл строчку
Код:
QMAKE_CXXFLAGS += -O2 -march=native

Не понимаю, почему у меня компилятор создал точно такой же файл, что создавал и без этой строчки...

Qt 5.3.1, MinGW32 4.8.2


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Октябрь 31, 2014, 12:20
В Makefile.Release записывается
Код:
CXXFLAGS      = -pipe -fno-keep-inline-dllexport -Ofast -march=native -O2 -frtti -Wall -Wextra -fexceptions -mthreads $(DEFINES)


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 31, 2014, 16:28
Цитировать
-Ofast -march=native -O2
Тут надо что одно: либо -Ofast либо -O2 оставить..


Название: Re: Расширения процессоров
Отправлено: m_ax от Октябрь 31, 2014, 16:41
В qmake есть ещё такие переменные:
QMAKE_CXXFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG

Попробуйте так:
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE += -march=native -Ofast



Название: Re: Расширения процессоров
Отправлено: lit-uriy от Ноябрь 01, 2014, 14:40
В cmd выполнил mingw32-make --help. Опций оптимизации не нашёл.
Здесь ты их и не найдёшь, т.к. это была справка по программе Make, а не по компилятору. Make - НЕ компилятор, а инструмент автоматизации сборки.


Название: Re: Расширения процессоров
Отправлено: __Heaven__ от Ноябрь 05, 2014, 09:18
В qmake есть ещё такие переменные:
QMAKE_CXXFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG

Попробуйте так:
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE += -march=native -Ofast



Спасибо. Не догадался сделать -= -O2.
Сейчас снова собрал с теми же установками проект (вообще ничего не менял). Почему-то на этот раз компилятор не стал дополнительно вставлять опцию -O2