Автор Тема: Дискуссия на тему производительности DF  (Прочитано 3198 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Echo-Six

  • Ветеран
  • *****
  • Сообщений: 769
    • Просмотр профиля
Re: Дискуссия на тему производительности DF
« Ответ #15 : 27 Август 2015, 07:07:41 »
Хотите ликбез на тему производительности?
Все конечно есть в интернете, но кто будет специально искать.
Хотим!!!  >>(
Но хочется услышать (увидеть) не копипасту, а собственное мнение, собственное понимание, собственную точку зрения живого человека. Я считаю, это дорого стоит. 8-)

Оффлайн Holkin

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Дискуссия на тему производительности DF
« Ответ #16 : 27 Август 2015, 15:24:42 »
Главная проблема в том, что сигнал во вселейнной не может распрастраняться быстрее скорости света. По крайней мере пока нет технологии, которая этот барьер перешагнет. А это значит, что если ваш компьютер имеет компоненты в разных точках пространства, то сигнал будет проходить какое-то время. Отсюда получается, что производительность не может быть бесконечно в принципе, чем меньше компьютер тем она теоретически может быть больше, но есть предел.
Транзисторы сейчас вроде уже делают слоями в три атома. Меньше уже вряд ли можно. Может какие-то графеновые технологии и дадут некоторый прорыв, но дно там уже близко.
Вторая проблема это прохождение сигнала по проводнику. Так получается, что чем больше частота и длина проводника, тем больше искажается сигнал и становится труднее понять где ноль, а где единица. Можно конечно поднять напряжение и немножко эту границу по частоте отодвинуть, но резко возрастает энергопотребление. А поскольку энергия никуда не девается, то излучается она в виде тепла, отводить которое часто бывает нелегко. Оверклокинг это больше частоты/напряжение и резко больше тепла, производители хотят чтобы оно отслужило гарантийный срок, потому могут занижать возможности.
Еще насколько мне известно есть сама проблема в физических транзисторах. В процессорах сейчас уже наверное используются полевые тразисторы, а там есть какая-то ненулевая емкость затвора (или хз что, я не эксперт в тразисторах), которая влияет на скорость переключения. Я пока не видел тразисторов, работающих на гигагерцах. 500 МГц это хорошие тразисторы.
Таким вот образом работает ваш процессор на 500 МГц на низком напряжении.
Процессор сам по себе это сумматор, хранение состояния  и коммутация. Сумматор это простая штука. Удивительно простая.
Вычитание делается просто добавлением отрицательного числа. Если у вас скажет 3 десятичных разряда, то 10-271 будет 1000-(10+1000-271) = 1000-(10 + 729) = 1000-739 = -261. Операция 1000-Х это инверсия цифр +1. В двоичном коде это тупо нули на единицы заменить и наоборот, в десятичном просто цифру от 9 отнять. Т.е. -271 это 728+1. Процессор будет работать с числом 729, а перед запись в память оно будет превращено обратно в отрицательное. Вот и вся магия. Умножение тоже можно на одних сумматорах собрать, с делением так красиво не выходит, поэтому эта операция занимает много времени. Если вам жалко сумматоров (т.е. тразисторов, коммутации и питания), то умножение тоже можно сделать более длинным по времени. 32-битный процессор это будет делать в 32 такта. 500 МГц это по-хорошему 500 млн тактов.
Люди достаточно давно поняли, что пока команда читается с памяти, процессор определяет какую именно операцию он будет делать и загрузит для нее данные, то отдельные части просто стоят без дела. Решили поставить это все на конвеер. Теперь сумматор не ждет пока устройство управления поймет какую команду делать, он уже берет готовую команду. И пока поток идет непрерывно все идет отлично. Но есть еще условное ветвление, так что 100% эффективность конвееров мы не получаем. Если команда проходила весь цикл за 100 тактов, то она и будет проходить, не важно если в среднем за 2 проходила.
Идеально было бы конечно иметь прямые проводки от процессора к каждой ячейке памяти. Но реально это вряд ли хорошая идея. Потому в вас платка памяти на миллиарды байт, а контактов там всего штук 300, среди которых питание и все прочее. Как вы можете догадаться там внутри стоит коммутатор, а это задержка. Да и память пишется не мгновенно.
В новой памяти там внутри вероятно тоже стоят конвееры. Вряд ли оно будет только по одной ячейке читать, оно вам целый блок выдаст. И теперь еще вишенка сверху: кеш. Память реально построена в яруса четыре, а может и больше. Процессор думает что в два: собственные регистры и оперативная память. Но реально процессор за данными бежит в кеш, который отдает данные если у него они уже есть, либо бежит на уровень ниже и так далее. Поскольку высока вероятность того что обрабатываемые данные и программный код будут находиться близко от прошлых, этот фокус прокатывает и очень даже хорошо. Но весь процесс похода в глубины памяти это тысячи процессорных тактов.
Но тут магия еще не кончается. Есть еще виртуальная память. Это по многим причинам хорошо, но тоже не бесплатно. Те данные, которые процессор ожидает видеть в оперативной памяти, реально могут лежать где-нибудь еще, например на диске (файл подкачки). Оперативная память дала неиспользованное пространство другому процессу и все работет просто отлично. Но как только процесс такую страницу просит, оперативная память посылает запрос на диск, контроллер диска читает в свой кеш блок с ФИЗИЧЕСКИ_ДВИЖУЩЕГОСЯ диска (вот почему ССД лучше, там просто микросхемы), блокирует доступ к памяти (и все, в т.ч. проссеро ждут пока этот блок кончится) и пишет данные в нужное место. Потом ОС эти данные (страницу памяти) берет и модифицирует. Потому что в коде написано "перемножить ячейку 50 с 52, перейти на ячейку 101", реально физически эта 52 ячейка будет лежать где-нибудь в 122143451 ячейке. Но теперь есть аппаратная поддержка виртуально памяти и эта вся магия уже должна вычисляться внутри процессора, точно так же конвеером.
Беда начинается когда у ОС много процессов и они постоянно замещают свои странцы. Потому рекомендуют перед тем как играть в игры повыключать все что только можно.
Это что касается однопроцессорных систем.
Есть конечно другие подходы, их достаточно много, но они специфические. Например, вычислять графику. Так работа с координатами по известных алгоритмам, так что целый массив координат может обрабатывать одновременно. Там тысячи ядер. Конечно не общего назначения, а более простых, но суть та же: сумматор, состояние и коммутация. Раньше суперкомпьютеры делали на обычных процессорах, а потом решили на видеокартах делать. И что, в астрономии тоже куча координат по известных агоритмам. Это как раз то место где Минский был неправ. Есть задачи, для которых еще можно много чего сделать.
Кстати, элементы этих специфических процессоров используются и в обычных. Современный интел это такая навороченная фигня, что я наверное и не смогу понять всей глубины инженерной мысли. Но все эти вещи достаточно просты сами по себе. Там никакого секрета мироздания не лежит.
С многопроцессорными системами главная проблема это взаимодействие. Две главных модели предполагают либо общую память либо посылку сообщений. Простая модель когда десять процессоров делят одну память достаточно ограничена. В промышленных целях так навереное никто не делает, у каждого есть своя собственная, а в общую он бежит при крайней необходимости. На обычном десктопе вероятно примерно тот же результат за счет кешей. Но кеши относительно маленькие. И при 10 процессорах вы только представьте, если всем сразу понадобятся данные из разных кусков. Это 9 раз нужно ждать полный поход в глубины памяти. Возможно, если бы эти процессы работали по два на одно ядро, то каждый бы из них выиграл за счет кеша памяти и это было бы быстрее. А одновременный доступ давать нельзя, потому что будут нехорошие баги. Потому я считаю, 8 ядер для домашнего использования более чем. Кстати, показать эти 8 ядер как 16 это навреное гипертрединг и есть, как раз для случая парой строчек выше.
Так вот эта самая маркетинговая пиковая проивзодительность считается по самому оптимистичному сценарию. Реальная будет отличаться и реально зависит от исполняемого кода и условий экплуатации. 8 ядер по 3 ГГц это может быть что-то типа 400 млн операций в секунду реально.
Перспективы конкретно такого подхода с разделяемой памятью я вижу в поиске таких всяких трюков, возможно каких-то графеновых технологий и/или оптимизации самого кода, выдаваемого компилятором. Но часто так вглубь ходить не нужно, того что есть уже достаточно. Хотеть больше могут всякие сервера, а это уже более другие задачи, чем симулятор вселенной.
Кстати, может еще одну хитрую штуку вам открою, не знаю имеет ли отношение. Все те прелести что в процессоре могут быть уже там вероятно есть. Вот прям все. А чтобы иметь разные ценовые категории, некоторые части просто выключаются. Реально дешевле в серию пустить хороший процессор, чем десяток разных.
За это сообщение 4 участников сказали спасибо: ICC, FearOfTheLight, Echo-Six, Hibou