vak: (Улыбка)
[personal profile] vak
Дополнение про украинский суперкомпьютер от Сергея Колисныка, на языке оригинала.

"Вони демонстрували симулятор. Звичайний симулятор-debugger, як для будь-якої архітектури. Вікно вихідного коду, даних, машинного коду. Мене дивувало, що за доволі традиційної (з точки зору 1960х) архітектури обчислювального модуля (так, у них жорсткий обчислювальний елемент) відсутній асемблер з мнемоніками - відображається лише цифровий машинний код. Отже, кожен процесор - звичайний, здається, гарвардський (мені казали точно, але я забув). На питання про асемблер казали, що їхній Паскаль і є замість асемблера (звісно, я згадав Ельбрус, але ж там був і звичайний мнемонічний асемблер). Але машинні коди досить традиційні. Особливість - АЛП комплексний з фіксованою комою."

Date: 2013-11-12 20:14 (UTC)
From: [identity profile] sab123.livejournal.com
Судя по описанию, они породили вариацию VLIW. Которую ХП так и не доделал сам по себе, а вместе с Интелом у них получилась жопа. Не исключено, что интельная компиляция из внешней системы команд во внутреннюю с учетом истории исполнения просто оказывается выгоднее, чем чистый VLIW. Не говоря уже про потребность поставки софта в промежуточном языке и компиляции его под конкретную модель процессора при установке.

Date: 2013-11-12 20:30 (UTC)
From: [identity profile] sab123.livejournal.com
В описании пишут, что компиляция непосредственно во внутренние сигналы, управляющие элементами процессора, якобы без системы команд. То есть самый что ни на есть классический VLIW (как он был изначально предложен ХП, а не как его дальше Интел извратил в упаковку трех команд в слово).

Собственно, и даже отвлекшись от вопросов совместимости процессоров, проблема классического VLIW очевидна - дофигища пропускной способности памяти будет уходить на выборку команд.

А кстати, вот и идея, как преодолеть эту проблему: сжимать последовательные участки программы чем-нибудь типа Зипа. И даже куски с большим числом переходов можно сжимать одним блоком и внутри блока делать переходы на расжатые адреса, держа весь блок временно расжатым. При нынешнем развитии железа засунуть разжималку в железо должно быть нетрудно.
Edited Date: 2013-11-12 20:37 (UTC)

Date: 2013-11-12 21:28 (UTC)
From: [identity profile] dom3d.livejournal.com
А я ничего не понял бы и на русском языке.

Date: 2013-11-12 22:44 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Линейные участки сами по себе невелики. Единственный разумный способ применить к ним сжатие - это плюнуть на границы слов и байтов и придумать коды операций из произвольного количества бит, а адреса переходов и смещения оставить как есть, но не выравнивать их. В результате получится примерно плотность интеловской системы команд. Собственно говоря, внутри, скажем, обычного интела уже и так фактически VLIW, перед которым стоит разжималка из "наружной" системы команд и переставлялка.

Date: 2013-11-12 23:03 (UTC)
From: [identity profile] sab123.livejournal.com
У классического VLIW очень длинные команды, что-нибудь типа 256 бит, которые в явном виде управляют каждым вычислительным элементом. Ну, а места, богатые переходами, можно соединять в блоки, разжимать целиком блок и сохранять его в быстрой памяти внутри процессора.

А про Интел - ну да, я и думаю, что этот подход оказался более выгодным, чем VLIW, потому VLIW никто в итоге и не использовал.

Кстати, другая проблема VLIW - небось, в комбинировании условных переходов и загрузки вычислительных элементов. Интельный подход позволяет загружать вычислительные элементы динамически, в соответствии с вычисленными до того переходами. А во VLIW они получаются жестко привязаны друг к другу на этапе компиляции, и переходы становятся барьерами для загрузки логических элементов. И это наверное причина того, что в IA64 изначальный VLIW превратился в систему формулирования последовательных кусочков, собираемых вместе практически через dataflow graph.

В-общем херня получается этот украинский "суперкомпьютер" :-)

Date: 2013-11-12 23:10 (UTC)
From: [identity profile] sab123.livejournal.com
А вот кстати, было бы любопытно попробовать придумать язык для писания программ в виде микротредов. Которые потом можно было бы шедулить (как это по-русски? "планировать" звучит неоднозначно) внутри процессора по мере готовности зависимостей. Может оно и оказалось бы лучше интельного поиска зависимостей внутри процессора.

Date: 2013-11-12 23:28 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Этим компиляторы с существующих языков должны заниматься. Нечего голову программиста ерундой загружать.

Date: 2013-11-13 00:06 (UTC)
From: [identity profile] sab123.livejournal.com
В существующих языках есть очевидная проблема того, что микротреды в них не уложить, как и вообще в последовательную модель программирования. А может быть можно придумать что-нибудь получше.

Date: 2013-11-13 00:29 (UTC)
From: [identity profile] archaicos.livejournal.com
Как бы не получилось, что дешевле просто увеличить кэш инструкции без сжиманий-разжиманий.

Date: 2013-11-13 02:42 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Микротреды надо писать последовательно, а компилятор должен понимать, что между ними нет зависимости (для этого ему можно помочь волшебным словом restrict, если надо), поэтому можно генерировать код, выполняющий их параллельно: хоть суперскалярно, хоть микротредно, хоть с помощью чёрта лысого.

Date: 2013-11-13 03:00 (UTC)
From: [identity profile] sab123.livejournal.com
Вряд ли она будет заметно увеличивать потребление. Логика-то там примитивная. И лишние такты тоже вряд ли добавит - она все равно будет частью prefetch, в котором память будет доминировать. А за счет уменьшения использования памяти может и наоборот ускорить.

Посмотрел thumb - это существенно другое, уменьшенное подмножество команд. У честного VLIW команды будут в 4 раза длиннее, чем у RISC, так что выгода в компрессии должна быть.

Date: 2013-11-13 03:03 (UTC)
From: [identity profile] sab123.livejournal.com
Ну я про то и говорю, что для этого в языке должны быть явные средства выражения отсутствия или присутствия зависимостей. Например, вызов функции не должен служить барьером для обращения ко всем глобальным переменным (и вообще ко всем переменным, от которых брался адрес), он должен быть барьером только для переменных, к которым эта функция действительно может обратиться.

Date: 2013-11-13 03:04 (UTC)
From: [identity profile] sab123.livejournal.com
О, про такое я вообще не в курсе.

Date: 2013-11-13 03:17 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Почему бы ему и не справиться?

for(....) { do something; }
for(....) { do something completely different; }

Отлично можно скомпилировать в два микротреда автоматически.

Date: 2013-11-13 03:20 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Явные средства выражения в данном случае будут в спецификации языка, а сам язык не изменится. Если компилятор видит весь код, то он способен определить, какие последовательные вызовы функций можно распараллелить.

Date: 2013-11-13 03:30 (UTC)
From: [identity profile] sab123.livejournal.com
Отнюдь. Когда начинаются обращения по указателям, заранее сказать при компиляции, какие указатели куда указывают, делается затруднительно.

Date: 2013-11-13 03:35 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Даже если так, ничего сверх хрестоматийных parbegin/parend придумывать не надо.

Date: 2013-11-13 06:53 (UTC)
From: [identity profile] lider.livejournal.com
"Ось ти, москалику, і попався!"
;)

Date: 2013-11-13 08:22 (UTC)
From: [identity profile] dom3d.livejournal.com
Ага. Тройной агент.
А еще мне череп замеряли и нашли еврейские корни.

Date: 2013-11-13 12:35 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
у интеловой системы команд очень говенная плотность.

Date: 2013-11-13 12:40 (UTC)

Date: 2013-11-13 15:57 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
У какой системы команд лучше?

Date: 2013-11-13 16:04 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
pdp-11, например

Date: 2013-11-13 16:07 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Ох, не уверен я. Например, команды регистр-регистр и стековые операции в интеле преимущественно 8-битные, поэтому сохранение-восстановление регистров в интеле делается прямым кодом, а в PDP-11 приходилось прибегать к подпрограммам csv/cret.

Date: 2013-11-13 16:13 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
аналогичный код на ассемблере pdp-11 занимал в 3 раза меньше места.
это проверялось практикой.

> PDP-11 приходилось прибегать к подпрограммам csv/cret.

чё?

Date: 2013-11-13 16:56 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
это проверялось практикой.

На 32-разрядной PDP-11 проверьте.

чё?

Ничё. Учите матчасть, например:

/ 32-bit multiplication routine for fixed pt hardware.
/  Implements * operator
/ Credit to an unknown author who slipped it under the door.
.globl	lmul
.globl	csv, cret

lmul:
	jsr	r5,csv
	mov	6(r5),r2
	sxt	r1
	sub	4(r5),r1
	mov	10.(r5),r0
	sxt	r3
	sub	8.(r5),r3
	mul	r0,r1
	mul	r2,r3
	add	r1,r3
	mul	r2,r0
	sub	r3,r0
	jmp	cret


Си-компилятором на PDP-11 пользовались? В ассемблер смотрели?

Date: 2013-11-13 17:12 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
> На 32-разрядной PDP-11 проверьте.

8086/80286 были точно так же 16-разрядными.
плотность кода с тех времен у уинтела не увеличилась.

> Си-компилятором на PDP-11 пользовались? В ассемблер смотрели?

ну. только все же наоборот: поскольку на pdp-11 такой трюк провернуть было можно, то все регистры сохранялись одной однословной коммандой, а на интеле надо было каждый раз использовать последовательность индивидуальных комманд, что выходило длинее.

Date: 2013-11-13 17:32 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
У 32-разрядного расширения PDP-11 плотность кода могла и снизиться (кстати о VAX-е).

http://www.researchgate.net/publication/224114307_Code_density_concerns_for_new_architectures/file/32bfe5118fd8e27899.pdf

И где там "3 раза"?

Date: 2013-11-13 19:08 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
у них примеров кода нет.
с ваксом я уже не сравнивал

Date: 2013-11-13 19:32 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
А у вас есть?

Они там пишут, что интеловский код от компилятора можно вручную ужать примерно вдвое. Мы знаем, что пидипишный код генерировался тоже очень рыхлый; возможно, его можно было бы ужать еще сильнее, и в результате аналогичный пидипишный код мог бы быть на пару десятков процентов меньше.

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

Date: 2013-11-13 19:43 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
ну вот и есть мое слово против их слова.
мы сравнивали ручной ассемблерный код.

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

Date: 2013-11-13 22:09 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Классический RISC практически без представления latencies на уровне инструкций, разве что в delay slots, и без явного назначения юнитов. А внутри интела на уровне его внутреннего представления и то, и другое явно присутствует.