[holy war] Big-Endians vs. Little-Endians

psihodog

maggi14

Ниасилил. Резюмируй конспективно, предлагает ли автор какой-нибудь способ решения проблемы, и если да - то какой.

psihodog

прокрути на два экрана вверх... там специально есть conclusion.
если одной фразой, то
How about tossing a coin ?

maggi14

А, так это очень разумное предложение, только кто на него пойдет? Разве что монетку бросит какая-нибудь ИСО.

Marinavo_0507

My BIG-endian will eat your little-endian (c)

Chupa

> will eat
чото всё никак

daru

Дата у документа своеобразная...

pupsik77

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

sergey_m

> для программистов на С - это пох.
Не правда.

Ivan8209

Здесь это слово пишется слитно: "неправда."
Им не понять, они не различают указатели и ссылки.
---
...Я работаю антинаучным аферистом...

pupsik77

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

Dasar

Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.

sergey_m

Посмотри /usr/include/machine/endian.h. Дефайны определенные в этом файле применяются повсюду в различных примитивах. Конечно большая часть проблем скрыта от разработчика, но это не заслуга языка C.

sergey_m

Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.
Автономные устройства обязаны общаться друг с другом в net byte order.

pupsik77

Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.
неважно. устройство отдаст тебе уже готовые байт или слово.
если конечно ты не пишешь низкоуровневый драйвер.

pupsik77

а что в коде "высокоуровневого" языка делают вставки на ассемблере?
пример не считается...

sergey_m

Из этого файла включается sys/_types.h. Обрати внимание на то, что многие стандартные типы данных будут разными на архитектурах с различным endianness.

Dasar

> Автономные устройства обязаны общаться друг с другом в net byte order.
Дык все равно надо в машинное представление переводить.

Ivan8209

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

Dasar

> устройство отдаст тебе уже готовые байт или слово
так оно и отдает готовый, только он может быть записан c правильным расположением байт, а может и нет.

sergey_m

Да и кроме общения со внешними устройствами есть места,
где надо будет учитывать порядок в памяти.
Да, вот в sys/ata.h встречались #if BYTE_ORDER ==.

pupsik77

1. это именно общение со внешним устройством.
2. в 4.11 этого нет. значит это ЗАЧЕМ-ТО придумали в 5.

Ivan8209

Очевидно, ранее это было просто зашито в код без объявления,
что, мол, порядок октетов в слове такой-то.
---
...Я работаю антинаучным аферистом...

rosali

устройство отдаст тебе уже готовые байт или слово.
Есть такая вещь как DMA. Ты даешь устройству void * (ну не совсем, на самом деле ты даешь ему _физический_ адрес, но сейчас это не важно а оно в память по этому адресу выкладывает данные. И этот адаптер работает в некотором byte-sex, и может быть совершенно не в курсе, какой процессор вставлен.

rosali

для программистов на С - это пох.
Ну пипец! Это Си-то высокоуровневый?! Там типа арифметика на указателях есть...
Что ты доказать то вообще хочешь? Что проблемы с порядком байтов в принципе разрешимы? Это и так всем понятно. Что программист может вообще не знать о существовании этих проблем? Очевидно, что это не так...

Codcod

Пофигу... разницы между ними никакой
UInt8* он и в африке UInt8*

Ivan8209

Если ты ещё не в курсе, то сообщаю: не на всех архитектурах
можно из памяти читать октеты, бывает так, что можно читать
только полные слова.
---
...Я работаю антинаучным аферистом...

Codcod

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

bastii

в пнях вроде в кэше строка 32байта

Codcod

да

bastii

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

rosali

а байтовые операции есть у всех
У всех, которые ты знаешь... Чему вообще противоречит отсутствие такой операции - записать байт? Бит же нельзя записать - никто не страдает...

rosali

в каком случае это принципиально
Ты не понимаешь при чем тут sys/ata.h или вообще не понимаешь?
PS. Ваще не в курсе, что такое sys/ata.h

bastii

нет, не в курсе
объясни почему там возникает ситуация, что код должен быть разным

bastii

просто я не очень ясно представляю чем они друг от друга отличаются
вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае?

Dasar

> вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае?
сдвиг влево всегда означает умножение. Вне зависимости от платформы.

bastii

тогда в чем разничаца между Big-Endians и Little--Endians, только как проц из памяти в регистры загружает?

Dasar

Есть шняга с которой приходят байты.
Для того, чтобы принять int - на одной платформе надо делать:

BYTE data[4];
data[0] = ReadByte;
data[1] = ReadByte;
data[2] = ReadByte;
data[3] = ReadByte;
int *i = (int*)data;

на другой:

BYTE data[4];
data[3] = ReadByte;
data[2] = ReadByte;
data[1] = ReadByte;
data[0] = ReadByte;
int *i = (int*)data;

можно, конечно, делать:

int i = ReadByte << 8) + ReadByte << 8) + ReadByte<<8) + ReadByte;
но это будет менее оптимально

Dasar

да, зависит, как числа хранятся в памяти.

Codcod

По большому счету тебе всё равно ...
по принципу что в память записал что и считал, тут LE BE без разницы
да и вообще всё пофигу... просто сидели мужики и думали как им проще смотреть на мир
мир линеен с лева на право
0 1 2 3 4 5 6 7 8 ...
по-этому в регистры так и записывается eax [0 1 2 3]
Другие от нех делать... так что всё что слева то младше
а самое что интересное вы что об этом паритесь?
обычное программирование на С/С++ не ведает что у него
А на счет процессоров... предложи пример процессора у которого нет считать байт? я искренне буду рад, посмотреть на то что ещё не видел ... с меня даже сок

Codcod

Это смотря опять на каком процессоре

Dasar

> Это смотря опять на каком процессоре
в смысле?

Codcod

на х86 это так
на TM130x или Gx быстрее последний вариант

bastii

ага, понятно, спасибо

bastii

Вроде слышал, что есть архитектуры, где можно считывать слова только по выровненному адресу, а в x86 иначе будет медленнее. Хотя к байтам это наверно не относится.

rosali

int i = ReadByte << 8) + ReadByte << 8) + ReadByte<<8) + ReadByte;
Так вообще писать нельзя - Си не гарантирует, что вызовы ReadByte в выражении будут происходить слева направо (Причем на LE тебе вообще-то надо как раз справа налево! )
А вообще разумный пример на byte-sex проблему - это именно передача данных _между_ разными архитектурами. Если написать скажем
 
//общий header
struct packet_format_t
{
int x;
int y;
short int z;
};
//на одной машине
struct packet_format_t packet;
provide(&packet);
write(socket_descr, &packet);
//на другой машине
struct packet_format_t packet;
read(socket_descr, &packet);
use(&packet);

то ничего не будет работать. Те же проблемы с форматами файлов, BMP там какой-нибудь и т.д...

rosali

с меня даже сок
Давай!
...The Alpha AXP architecture has no byte load or store instructions, and no implicit
unaligned accesses...
http://www.google.ru/search?hl=ru&q=Architecture+"has+no+byte"&lr=
Вторая ссылка
PS Фиг знает чего с ubb? Он мне " заменяет на " ? Причем в Preview все ок, а постит неправильно...

rosali

Не, ну вообще финиш! В предыдущем посте знак " нужно заменить на %<нет пробела>22 первые три раза...

ava3443

да вроде нормально делается ссылка:
ищем в гугле Architecture 'has no byte'

Codcod

ага только читай дальше
Instead of including byte load/store, we followed the RISC philosophy
of exposing hidden computation as a sequence of many simple, fast
instructions. In the Alpha AXP architecture, a byte load is done as an
explicit load/shift sequence; a byte store as an explicit load/modify/store
sequence. We tuned the instruction set to keep these sequences short. The
instructions in these sequences can be intermixed, scheduled, and issued as
multiples with other computation, as can the rest of the instructions in
the architecture. Table 1 gives a summary of the Alpha AXP instruction set.
:Р и ещё скажи что байт нельзя загрузить

rosali

Я не знаю, что тебе ответить. В этом процессоре (и многих других) нет инструкций побайтного доступа к памяти. То что такой доступ можно выразить с помощью других инструкций как то не вызывало сомнения.
А по твоей логике получается, что в Pentium-e есть инструкции побитного обращения в память, или скажем инструкции возведения в степень? Ну раз эти действия можно записать через имеющиеся команды...

rosali

обычное программирование на С/С++ не ведает что у него

void main
{
int x = 0x12345678;
char * p = (char *)&x;
if(*p == 0x12)
printf("BE\n");
else if(*p == 0x78)
printf("LE\n");
else
printf("mistery...\n");
}
Тут я по всей видимости нечто необычное закодировал...

pupsik77

Тут я по всей видимости нечто необычное закодировал...
некорректно. зачем выдирать кусок ИНТа?
если тебе нужно обращение к кускам ИНТа, то делай сдвиг или умножение/деление или используй 4 переменных типа byte.
а такой код будет ambiguous

rosali

некорректно. зачем выдирать кусок ИНТа?
А что для тебя означает слово "некорректно"? Заодно расскажи, если знаешь, что называет "обычным программированием"...

Ivan8209

Что значит "некорректно?"
Ссылку на нарушенное положение стандарта языка, пожалуйста!
---
...Я работаю антинаучным аферистом...

pupsik77

код двусмысленный.
теряется читабельность, появляется архитектуро-зависисимость.
еще в самом начале я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначе, чем опираясь на знания о LSB MSB.
пока нормальным примером был только Ata.h
но надо читать код! и это вовсе не тот случай когда при написании программы на С необходимо знать LSB/MSB. это стыковка с конкретной железкой, и знания программиста тут не причем.

Ivan8209

И в чём двусмысленность?
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
---
...Я работаю антинаучным аферистом...

rosali

я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначе
что прямо таки НЕВОЗМОЖНО?
Любую программу можно написать на машине Тьюринга, а потом написать на С интерпретатор машины Тьюринга. Так и надо делать? Ну, для платформонезависимости

pupsik77

И в чём двусмысленность?
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
ты не знаешь конечный результат.
если тебе нужен MSB прочитай полностью ИНТ и раздели его на (нет не на 4 а на 256*sizeof(int) и это будет правильным. а если ты читаешь какой-то байт из какой-то структуры и не понимаешь что прочитал, потому что кто-то завел структуру не так как ты привык - это уже никак не связано с проблемами LSB/MSB

pupsik77

что прямо таки НЕВОЗМОЖНО?
ну естественно в пределах разумного.
как переписать твой код - я пример привел.
Так и надо делать? Ну, для платформонезависимости
а платформонезависимость - это тот идеал к которому и стремятся все программисты и языко-компиляторо-писатели (конечно, для языков "высокого" уровня).
С к низкоуровневым языкам отношения не имеет.

Julie16

BYTE data[4];
data[0] = ReadByte;
data[1] = ReadByte;
data[2] = ReadByte;
data[3] = ReadByte;
int *i = (int*)data;
А вот за такой код убивать надо. На месте.
PS:
1 вариант):

union
{
int val;
BYTE bytes[ sizeof( int ) ];
} data;
для общения с оборудованием еще может понадобиться attribute__packed__ (или его замена)
2 вариант):

union
{
uint32_t val;
BYTE bytes[ 4 ];
} data;

rosali

и раздели его на (нет не на 4 а на 256*sizeof(int)
На что, простите?

sergey_m

:
появляется архитектуро-зависисимость
Значит С - архитектурно зависимый язык. чтд.

evgen5555

А вот за такой код убивать надо. На месте.
А за что именно?

Julie16

А за то. BYTE a[4] не обязан быть выровненым. int же может быть обязан быть выровненым.

Ivan8209

LSI-11 не требует выравнивания.
---
...Я работаю антинаучным аферистом...

Ivan8209

И что?
Ссылку на два положения из стандарта, которые описывают
правильное, но различное толкование приведённого кода.
Ты не путай двусмысленность, которая является свойством языка,
с аппаратной зависимостью.
---
...Я работаю антинаучным аферистом...

pupsik77

Значит С - архитектурно зависимый язык. чтд.
в С есть возможность писать архитектурно-независимы код. все остальное - ихержки программистов.

Ivan8209

И что он сможет, этот твой архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...

pupsik77

Ты не путай двусмысленность, которая является свойством языка,
с аппаратной зависимостью.
хех, вот ты сам и ответил, что для программиста на С не важно LSB или MSB. потому что языку С, до этого нет дела, хотя он и позволяет сделать код, в котором об этой проблеме придется задуматься. Но так же позволяет писать код не думая о такой проблеме. причем даже на различных архитектурах.
так, что или мы теоретизируем об абстрактном языке С в вакууме с абстрактными кусками кода, которые написаны, только для того чтобы быть написаными. или все-таки разговариваем о реальной проблеме LSB/MSB.

pupsik77

И что он сможет, этот твой архитектурно-независимый код?
тоже самое, что и архитектурно зависимый, только на разных архитектурах.
Плюс, большая читабельность кода.

Ivan8209

Для программиста на Си очень важно, на какой именно машине он работает.
И именно поэтому и существуют все эти заморочки с порядком октетов.
---
...Я работаю антинаучным аферистом...

Ivan8209

Хм.
А ты когда-нибудь писал этот архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...

Dasar

функцию htonl можешь реализовать без знания о том, какая архитектура используется?

Ivan8209

Она тоже нужна для общения с аппаратурой.
---
...Я работаю антинаучным аферистом...

Dasar

в первую очередь она нужна для общения с другими программами, а потом уже для общения с железом.

Ivan8209

Это лишь постольку, поскольку один из способов общения с другими
программами сделан тем же, что и способ общения с аппаратурой.
Если идти более разумным путём, то для общения с другими
программами надо использовать более простые и быстрые способы.
---
...Я работаю антинаучным аферистом...

pupsik77

А ты когда-нибудь писал этот архитектурно-независимый код?
у меня специфика работы такая, что я пишу архитектурно-зависимый.
но, все-таки, я считаю, что использование высокоуровневых языков наклфдывает обязательства по написанию "высокоуровневого кода".

Ivan8209

Си не является таким уж высокоуровневым.
---
...Я работаю антинаучным аферистом...

rosali

Но так же позволяет писать код не думая о такой проблеме.
Ну чего глупости то говорить? Может еще скажешь, не зная о такой проблеме?

rosali

Си не является таким уж высокоуровневым.
"Таким уж" он вообще никаким высокоуровневым не является...

Ivan8209

Твои признаки высокоуровневости?
Низкоуровневости?
---
...Я работаю антинаучным аферистом...

rosali

То, что все относительно и субъективно, это конечно понятно. Но мне картина примерно вот так видится:
asm < (Си, Fortran, Pascal) < С++ < (Java, .NET, Python, ...) < Lisp < (SML, Haskell, ...) < Пролог
Ну остальные можно по желанию вписывать, и по всей видимости правильнее не линейную структуру, а деревянную, но точно не знаю какую.

Ivan8209

А из каких соображений Лисп расположен ниже МЛей?
Только из-за поддержки одной структуры данных?
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?
Интерпретацией? Псевдокодом?
Так UCSD-p не самое новое изобретение.
Про язык ".NET" вообще не знаю.
Шо це таке?
---
...Я работаю антинаучным аферистом...

rosali

А из каких соображений Лисп расположен ниже МЛей?
нетипизированый
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?
сборкой мусора
Про язык ".NET" вообще не знаю.
Ну для меня все .NET языки на одно лицо. C#, J#, VB, ... только декоративный отличия в синтаксисе, а выразительность одинаковая.
Я повторяю, тема субъективная, у меня нет цели тебя в чем-то убедить.

Ivan8209

> нетипизированный
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.
Даже их байт-код?
---
...Я работаю антинаучным аферистом...

Marinavo_0507

байт-код - это то, что от них останется, если лицо содрать

Ivan8209

Пофиг.
IL.
---
...Я работаю...

rosali

> нетипизированный
Кто тебе такое сказал?
Ну ладно, остановимся на том, что я на lisp-ах никогда ничего не писал.
> Ну для меня все .NET языки на одно лицо.
Даже их байт-код?
В данном контексте, да. То есть высокоуровневость IL такая же, как скажем у C#. Он оперирует настолько же высокоуровневыми понятиями как "объект", "поле", "виртуальный метод", вместо низкоуровневых "байт", "смещение"...

Ivan8209

В RnRS можно встретить примерно такой заголовок:
"Disjointness of types."
Говорят, под .NET Хаскелл есть. Или я что-то путаю?
---
...Я работаю антинаучным аферистом...

rosali

SML.NET есть. Наверное его нужно считать и выше SML и выше .NET Правда он сыроват, его не в microsoft, а в microsoft research делали... А так - крутой язык, наверное: SML + виртуальные вызовы методов Никогда не пользовал...
PS. не тред а помойка

Marinavo_0507

Насколько я знаю, у всех "неродных" языков там проблемы сопряжения систем типов.
То есть распознаются только простые типы и ссылки на объекты, а более осмысленные проверки - только в рантайме.

Marinavo_0507

Вот про SML.NET: Limitations:
Only CLR types at boundaries of compiled code
The exposed interfaces of applications or DLLs compiled by SML.NET may only refer to CLR types (classes, interfaces, delegates, etc.). They may not expose SML-specific types (functions, datatypes, records, etc.). In particular, this restriction means that one cannot compile an arbitrary SML module into a DLL for consumption even by other SML.NET programs: the module must be either linked into the client program at compile-time or use only CLR types at its interface.
То есть есть родные языки, которые все на одно лицо, и есть остальные, которые сбоку.

pupsik77

Таким уж" он вообще никаким высокоуровневым не является...
бред.
он именно высокоуровневый.
Язык высокого уровня - согласно ГОСТ 19781-90 - язык программирования, понятия и структура которого удобны для восприятия человеком.
Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных.

A programming language such as C, FORTRAN, or Pascal that enables a programmer to write programs that are more or less independent of a particular type of computer. Such languages are considered high-level because they are closer to human languages and further from machine languages. In contrast, assembly languages are considered low-level because they are very close to machine languages.

rosali

Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных
Сам все сказал...

pupsik77

вот именно.
в Си когда ты пишешь ты не знаешь (только предполагаешь) на каком проце это будет исполнятся и в какой МАШИННЫЙ код это преобразуется. и как выглядят операции с памятью и регистрами ты тоже не знаешь. ты просто пишешь программу.

Dasar

> в Си когда ты пишешь ты не знаешь
может быть C чуть-чуть скрывает особенности железки, но C уж очень далеко от потребностей программистов.
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?

sergey_m

может быть C чуть-чуть скрывает особенности железки, но C уж очень далеко от потребностей программистов.
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?
Тебе не кажется, что ты (опять) ушел от темы треда, и начал (опять) поливать грязью С?

Ivan8209

Может быть, ты и не знаешь, на какой машине будет исполняться
твоя программа. Да только много ли ты разных машин видел?
Кроме LSI/KS-11 и семейства x86-x88 есть много других машин.
---
...Я работаю антинаучным аферистом...

pupsik77

машин не много, а среда компиляции?
простой пример int в BCC3 = 2 байта, в других 4 (где-то может и иначе).
хотя регистры процессора и там и там 32 разрядные (386). ты же не знаешь об особенностях архитектуры. и мало того, даже не задумываешься о них.
конечно до тех пор пока не начинается жесткая оптимизация на скорость/размер. но язык то сделан для отвлечения от особенностей архитектуры. то есть написание программы переведено на "более высокий уровень" относительно железки.

Ivan8209

Я знаю об особенностях архитектуры.
Хотя бы потому, что знаком не только с семейством Intel x86/x88.
И я бы не сказал, что даже во времена 8088 не использовал
машинозависимых особенностей.
В частности, при сравнении указателей.
"Более высокий уровень относительно железки" может быть,
например, связкой m4+gas.
А что? Тоже можно скрыть некоторые особенности железки.
---
...Я работаю антинаучным аферистом...

pupsik77

что-то я уже не улавливаю сути....
это все к чему? к тому что Си низкоуровневый язык?
или ты просто со мной не согласен?

Ivan8209

К тому, что Си куда ближе к низкоуровневым языкам, чем к высокоуровневым.
В особенности --- в настоящее время, когда алголоиды считаются
слишком низкоуровневыми для некоторых задач.
А Си, пожалуй, один из самых низкоуровневых среди алголоидов,
в чём можно легко убедиться, взглянув на Аду или Алгол-68.
И даже, страшно сказать, Алгол-60.
---
...Я работаю антинаучным аферистом...

pupsik77

сразу не сообразил, что много ли я знаю машин кроме x86. да много: MSP430, AVR, i8051, PIC, TMS320.
и что самое главное под все почти есть С компиляторы.
и я когда пишу код, его можно перенести с одной платформы на другую поменяв примерно 20 процентов кода, а если использовать "низкоуровневость" С, то переписывать придется заново. но дело даже не в этом. а в том, что С ОТВЯЗАН от особенностей архитектуры, но до них можно добраться. но язык это высокоуровневый! язык низкого уровня - ассемблер.
ведь написав программу на Си, ты не имеешь никакого представления, что получится в машинном коде.
конечно использование знаний архитектуры может оптимизировать код, и я когда-то занимался потактовой оптимизацией и т.п. но в большинстве случаев это бессмыслено, потму что компиляторы умеют генерировать достаточно быстрый код, который еще к тому же и будет работать.

rosali

Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных.
Согласись, что програмист на Си предполагает, что в системе обработки данных

  • есть процессор. Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной. С функциональными языками дело обстоит на порядок лучше.
  • этот процессор один. То есть программист пользуется понятием "current control point", которое применимо далеко не ко всем архитектурам. Компиляция Си программы под SMP архитектуру (= автоматическое распараллеливание) - неподъемная задача над которой бьются уже десятки лет. Про системы с распределенной памятью я вообще молчу. Функциональные же языки с автоматическим распараллеливанием существуют. Тот же Erlang.

Ivan8209

Ключевые слова: "поменяв примерно 20 процентов кода."
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
---
...Я работаю антинаучным аферистом...

shlyumper

С функциональными языками дело обстоит на порядок лучше.
Кстати да, вот этот момент меня очень интересует: а есть ли достойные реализации функциональных языков для однокристалок?

Dasar

Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.

shlyumper

Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.
Ну никто не утверждал, что ФЯ на однокристалке обязан быть чистым.

sergey_m

Компиляция Си программы под SMP архитектуру (= автоматическое распараллеливание) - неподъемная задача над которой бьются уже десятки лет.
У меня работают мультитредовые программы на C. Что я делаю не так?
Конечно, ты скажешь, что там распараллеливание не автоматическое. Тогда расскажи как по-твоему выглядит автоматическое.

Dasar

Автоматическое - это что-то такое:
есть код суммирование массива:

int sum = 0;
for (int i= 0; i < array.Length; ++i)\
sum += array[i];

Далее говорим - хотим, чтобы этот код выполнялся на двух процессорах причем быстро.
В итоге код сам превращается в:

//thread1
int sum1 = 0;
for (int i = 0; i < array.Length/2; ++i)
sum1 += array[i];

//thread2
int sum2 = 0;
for (int i = array.Length/2; i < array.Length; ++i)
sum2 += array[i];

int sum = sum1 + sum2;

sergey_m

Предположим, что такой волшебный компилятор существует.
Во-первых, не все примеры будут такие простые, как этот. Не всегда под силу компилятору найти возможность распараллелить там, где найдет человек.
Во-вторых, если тупо параллелить всё участки кода, где это возможно, то могут быть следующие препятствия. Цена создания треда не равна нулю, иногда выгоднее обойтись без разпараллеливания. Треды не выполняются с одинаковой скоростью. Например в приведенном тобой примере, тред1 может быстро завершить свою половину работы, а тред2 не получит процессора, потому что все процессоры заняты. Поэтому тред2 сразу уснет, а тред1 завершит свою половину работы и уснет, отдав при этом процессор. В лучшем случае процессор получит тред2 и завершит свою половину работы. Задача выполнена, но сколько лишний переключений было! А еще может случиться так, что когда тред1 закончит и уснёт процессор будет отдан другому процессу.

Ivan8209

Оптимизация распараллеливания --- это уже совершенно другой вопрос.
Когда-то языки программирования высокого уровня тоже считались
бредом, поскольку человеку лучше, чем компилятору видно,
где можно оптимизировать, а где не надо.
---
...Я работаю антинаучным аферистом...

rosali

Да не знаю я об этом ничего Просто сказал, потому что сомнения не вызывает... Вот так в гугле набрал - там то же самое говорят
... Implement a robust design language for FPGA design ... The Functional nature of the language is important ...

rosali

Что я делаю не так?
Ты пользуешься (вынужден пользоваться) знаниями о "возможностях системы обработки данных", потому что язык Си в недостаточной мере "отражает потребности программиста"...

Julie16

Это скорее кандидат на векторизацию. Распараллеливание тут не катит, по причинам которые изложил Глеб. Кстати, компилятор от Интела скорее всего сумеет векторизовать этот цикл(под рукой сейчас нет, позже проверю).

Marinavo_0507

Распараллеливание покатит, если каждый элемент массива нужно сначала долго-долго считать.
Кстати, распараллеливание, которое предложил , использует ассоциативность операции сложения,
что уже не будет выполняться в случае с числами с плавающей точкой.

rosali

Такой "сложный" цикл он сможет по твоей терминалогии и векторизовать (= уложить на SSE) и распараллелить (= уложить на HyperThreading). Но все автоматическое распараллеливания ограничивается линейными выражениями в индексах. Стоит написать A[B[ i ]] и привет

Julie16

Если долго считать - то конечно. Но я говорил про конкретный пример Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.

Julie16

В том-то все и дело, что распараллелить может быть очень дорого. Может там всего 10 итераций в среднем. Тогда создание/завершение треда съест весь выиигрыш.

rosali

не будет выполняться в случае с числами с плавающей точкой
Ну, с помощью соответствующих опций компилятор можно убедить в чем угодно в том числе в ассоциативности операций с плавающей точкой
По-моему в компиляторах даже более типична опция типа -preserve-float-presision, то есть по умолчанию он на такие тонкости кладет.
К тому же я уже гже-то писал, что SSE регистры короче чем регистры в стеке сопроцессора, так что потери точности будут даже если сохранить порядок операций.

rosali

Intel предоставляет средства для автоматического профилирования с последующим автоматическим адекватным распараллеливанием.

Marinavo_0507

> Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
Поэтому тут и упомянули функциональную парадигму, в которой их отсутствие - нормальная ситуация,
а наличие нужно оформлять специальными конструкциями.

Julie16

Функциональное программирование - это конечно хорошо. Но вот вопрос: если запустить одну и ту же задачу:
1) Написанную на С/С++ на одном проце
2) На функциональном языке, распараллеленную(автоматически) на 4 таких же процах
То кто победит? В общем, существуют ли эффективные оптимизирующие компиляторы для функциональных языков?

sergey_m

> Распараллеливание покатит, если каждый элемент массива нужно сначала долго-долго считать.
А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.

Julie16

Ну один тред сможет начать помогать другому. Но тогда уже не обойтись без блокировок. А это уже не очень хорошо.

Marinavo_0507

Насколько я знаю, это сильно зависит от конкретной задачи.
Кроме использования функциональных языков, есть гибридные подходы:
тело чистой функции реализуется на низкоуровневом языке типа C/С++,
и отсутствие побочных эффектов гарантирует программист;
программа в функциональном стиле состоит из вызова таких функций,
и распараллеливается автоматически. Таким образом можно получить
эффективные микрооптимизации и автоматическое распараллеливание одновременно.

Julie16

Вот это уже интереснее А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.

pupsik77

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

Marinavo_0507

> А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блоки
раскидываются между процессорами по мере надобности.

sergey_m

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

pupsik77

Согласись, что програмист на Си предполагает, что в системе обработки данных
есть процессор.
а на Java не предполагает?
Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной.
причем тут ПЛИС? ты когда-нибудь писал модель для ПЛИС? это не программа - это описание модели.
а программирование на Си именно написание программы - последовательности команд. которая, да будет исполнятся на процессоре, но программа на Java будет исполняться на Java-машине - суть процессоре.
этот процессор один
кое-какой код распаралеливать сейчас умеют (это тут уже обсуждают). впрочем это даже не важно. на пресловутой Java у тебя тоже одна Java-машина, из-за этого Java становится низкоуровневым языком?

Ivan8209

Существуют.
Например, для OCaml и SML.
---
...Я работаю антинаучным аферистом...

Julie16

А они точно эффективные? Например перемножение матриц на С и OCaml как будет сравнимо по скорости?

Ivan8209

Я не знаю, что такое "портируемый."
Да, если поработать напильником, то, наверное, много чего
можно перенести.
В частности, если понавставлять в код "#ifdef"/"#ifndef",
как это любят делать насильники.
---
...Я работаю антинаучным аферистом...

Ivan8209

В частности, быстрое БПФ переносилось на Си компиляцией с ОКамла.
По крайней мере, так говорят. И такое вполне даже возможно.
---
...Я работаю антинаучным аферистом...

pupsik77

хорошо, не нравится портируемый - скажем так.
переписывание 20 процентов кода, который, по мнению большинства обязан быть "машинозависимым" для переделки на другую платформу - это не написание программы с нуля. #ifndef - Не считаем написанием одной программы.
можно подойти иначе - если у тебя есть примерное описание архитектур с некоторыми различиями, то на С ты можешь написать программу которая скомпилируется в разных средах под разные архитектуры.

Ivan8209

Необходимость переписывания пятой части кода --- весьма странным
образом сочетается с восторженными криками о переносимости.
Вот, к примеру, программу, написанную на Схеме (например, R5RS
можно переносить куда угодно без исправлений.
У меня на компьютере стоит мелкий схемоподобный Лисп, где мне
потребовалось лишь доопределить несколько слов из R5RS, чтобы
всё сразу заработало.
И никакой одной пятой.
---
...Я работаю антинаучным аферистом...

sergey_m

Я Мишино мнение и упорство не поддерживаю, но замечу, что цифра 20% завышена. Например:

think:~/NetBSD/src/sys:|>du -ksh .
150M .
think:~/NetBSD/src/sys:|>du -ksh arch/*
8,0K arch/CVS
2,0K arch/Makefile
6,0K arch/README
806K arch/acorn26
1,3M arch/acorn32
662K arch/algor
3,1M arch/alpha
1,0M arch/amd64
3,7M arch/amiga
292K arch/amigappc
1,2M arch/arc
3,7M arch/arm
2,6M arch/atari
794K arch/bebox
276K arch/cats
372K arch/cesfic
516K arch/cobalt
600K arch/dreamcast
1,7M arch/evbarm
546K arch/evbmips
620K arch/evbppc
234K arch/evbsh3
312K arch/evbsh5
1,8M arch/hp300
1,1M arch/hp700
2,1M arch/hpc
454K arch/hpcarm
3,1M arch/hpcmips
622K arch/hpcsh
1,0M arch/hppa
3,7M arch/i386
348K arch/ibmnws
262K arch/iyonix
494K arch/luna68k
4,3M arch/m68k
1,6M arch/mac68k
1,2M arch/macppc
2,1M arch/mips
656K arch/mipsco
362K arch/mmeye
1,2M arch/mvme68k
482K arch/mvmeppc
252K arch/netwinder
640K arch/news68k
788K arch/newsmips
854K arch/next68k
548K arch/ofppc
12K arch/openblocks405
988K arch/pc532
320K arch/pdp10
586K arch/playstation2
1,4M arch/pmax
358K arch/pmppc
1,8M arch/powerpc
906K arch/prep
390K arch/sandpoint
504K arch/sbmips
1,2M arch/sgimips
802K arch/sh3
1,1M arch/sh5
1,2M arch/shark
2,7M arch/sparc
1,9M arch/sparc64
750K arch/sun2
1,6M arch/sun3
476K arch/sun68k
1,9M arch/vax
1,8M arch/x68k
538K arch/x86
994K arch/xen

pupsik77

одна пятая - потому что я так пишу.
можно написать так, что придется только переопределить физические порты и ножки (10-20 #define + инициализация ножек (строк 50 кода
и он будет полностью переносим. просто я так не делаю, потому что скорее всего не понадобится...
НО! это не означает, что Си низкоуровневый язык.
к низкому уровню из Си добраться можно, как и из С++, но почему-то С++ поднимают по "уровням" выше. из С# тоже можно писать непосредственно в регистры процессора? так почему же это не низкоуровневый язык?

rosali

написание программы - последовательности команд
не лечится...

pupsik77

откомпилированный код - это что?

Ivan8209

А можно сделать такое:

du -kd 1 arch/* | awk '{ sum+=$1;}
END { print sum/NR;}
?
А то так мало что ясно.
---
...Я работаю антинаучным аферистом...

rosali

частности, быстрое БПФ переносилось на Си компиляцией с ОКамла.
По крайней мере, так говорят. И такое вполне даже возможно.
Если ты про fftw.org, то там на каком то фя (возможно и ОКамль) был написан _генератор_ Си программы, так что это немного не то.

pupsik77

написание программы - последовательности команд
по отношению к программированию ПЛИС - программирование на С именно написание последовательности команд.

Ivan8209

Это то же самое.
Сишная же программа не была создана человеком?
---
...Я работаю антинаучным аферистом...

rosali

откомпилированный код - это что?
Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования", то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код" Компилятор преобразует программу на одном языке в программу на другом языке. Природа этих языков может быть произвольной.

rosali

по отношению к программированию ПЛИС - программирование на С именно написание последовательности команд
Языки, в которых программа является в той или иной степени последовательностью комманд - называются императивными. Такими языками многообразие языков программирования не ограничивается. Если ты не знаешь про функциональное программирование, то уж по крайней мере слышал про Пролог или про SQL.

pupsik77

Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования",
наконец-то.
давайте определимся о чем этот тред...
то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код" Компилятор преобразует программу на одном языке в программу на другом языке.
предлагаю отделить машинный код, который непосредственно исполняется на железке, от эмуляций, рантаймов и прочего. тогда есть программа на языке, а есть реальный код исполняемый процессором.
кажется именно для того чтобы не писать программы единичками и ноликами и были придуманы сначала ассемблер, который является только семантической интерпретацией машинного кода, а потом иные языки более высокого уровня.

rosali

а есть реальный код исполняемый процессором
Да отстань ты со своим процессором , dataflow архитектуры например есть.

pupsik77

Языки, в которых программа является в той или иной степени последовательностью комманд - называются императивными. Такими языками многообразие языков программирования не ограничивается. Если ты не знаешь про функциональное программирование, то уж по крайней мере слышал про Пролог или про SQL.
хорошо, моя фраза про "программа - последовательность команд" сильно отстает от жизни... когда-то это имело право на существование...
про функциональое я только слышал общие слова, но
не уверен, что это все имеет какое-то отношение к BE/LE (MSB/LSB или к низко-высоко-уровневости програмирования на С. (или же о чем тред?)

sergey_m

du -kd 1 arch/* | awk '{ sum+=$1;} END { print sum/NR;}'
Не вижу смысла в -d 1. Если ты хотел узнать среднее арифметическое, то так:

think:~/NetBSD/src/sys:|>du -ks arch/* | grep -v CVS | awk '{ sum+=$1;}
END { print sum/NR;}'
1157,07
think:~/NetBSD/src/sys:|>

pupsik77

Да отстань ты со своим процессором
первым про процессор вспомнил ты
dataflow архитектуры например есть.
при некотором уровне абстракции Java-машина - суть процессор, то есть исполняющий модуль.
все-таки разговаривая о LSB/MSB или об уровнях "высоты" языков нельзя отвязываться от аппаратного обеспечения. это точка отсчета.

rosali

низко-высоко-уровневости програмирования на С.
Ну, язык программирования не может быть каким-то-уровневым сам по себе, он может быть каким-то-уровневым по сравнению с другим языком. Когда ты говоришь "Си - высокоуровневый", как бы подразумевается, что по сравнению с большинством языков. Вот я тебе и пытаюсь доказать, что "большинство" как раз по другую сторону... Ниже Си - только различные ассемблеры, а выше - навалом всего

pupsik77

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

Ivan8209

Это вместо -s.
А общий размер?
Или без arch.
Чтобы было с чем сравнить.
---
...Я работаю антинаучным аферистом...

sergey_m

> Это вместо -s.
Тогда -d 0
> А общий размер?
> Или без arch.
В первой цитате в самом начале был размер с arch.

Ivan8209

А что насчёт детища разных там Symbolics?
---
...Я работаю антинаучным аферистом...

rosali

при некотором уровне абстракции Java-машина - суть процессор
А вот и нет. Ты постоянно думаешь _как_ будет происходить вычисление, а Java-машина лишь специфицирует _что_ является правильным результатом вычисления, а _как_ он будет получен - не обсуждается. Да, чтобы объяснить или понять семантику байткода удобно представить себе стековый вычислитель у которого есть последовательность состояний и т.д., но не более чем _удобно представить себе_.
об уровнях "высоты" языков нельзя отвязываться от аппаратного обеспечения
Почему? Нормальная математическая (ну и немного философская ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера... Компьютер конечно помогает убедиться в отсутствии ошибок, но не является необходимым.
LSB/MSB
А про это уже в середине треда забыли

Ivan8209

Потерял бдительность.
У тебя локаль русская, что ли, стоит? Запятая разделителем.
Да, команда "Нет ЛСД" постаралась.
Только я сомневаюсь, что внутри того кода, который не "arch",
нет так любимых насильниками "#ifdef"/"#ifndef".
---
...Я работаю антинаучным аферистом...

pupsik77


80-е годы...
убедил программа - это не последовательность команд.
это описание того что программист хочет от некой виртуально-абстрактной машины? или как?

pupsik77

Ты постоянно думаешь _как_ будет происходить вычисление, а Java-машина лишь специфицирует _что_ является правильным результатом вычисления, а _как_ он будет получен - не обсуждается.
потому что я не абстрагируюсь от аппаратной части.
ведь пока обсуждался программно-аппаратный комплекс
Почему? Нормальная математическая (ну и немного философская ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера...
кроме ассемблера! нет компьютера - нет ассемблера.
уровень 1. далее пошло остальное

sergey_m

Да, команда "Нет ЛСД" постаралась.
Только я сомневаюсь, что внутри того кода, который не "arch",
нет так любимых насильниками "#ifdef"/"#ifndef".
Совершенно верно. NetBSD очень постаралась. Например в sys/kern, sys/uvm, sys/netinet вообще нет архитектурных ifdef. Именно поэтому им удается так быстро писать порт под очередную платформу.

rosali

программа - [...] это описание того что программист хочет от некой виртуально-абстрактной машины? или как?
Ну давай разведем теорию
    Определение. Языком программирования называется тройка L = (D,S,F где
  • D - некоторое множество, называемое "доменом" языка, по смыслу это множество данных с которыми могут оперировать программы языка L. Множество D считается достаточно богатым, чтобы вмещать в себя в том или ином виде тексты программ языка L. Множество D предполагается заданым конструктивно.
  • S - разрешимый предикат на D называемый "синтаксисом" языка. Если для некоторого p<-D выполнено S(p то p называется программой языка L. Обозначим множество всех программ через P = { p<-D | S(p) }
  • F - вычислимая частично определенная функция P x D -> D, называемая "семантикой" языка.

Что-то вроде того...

Ivan8209

Хм.
Ну надо же!
Тогда перехожу на "НетЛСД."
Если правда.
---
<<Скажи "нет" наркотикам!>>

shlyumper

А они точно эффективные? Например перемножение матриц на С и OCaml как будет сравнимо по скорости?
Перемножением матриц задачи не исчерпываются. Конкретно на этой задаче - нет. А вообще, http://shootout.alioth.debian.org/
OCaml и MLton (SML compiler) зажигают.

Julie16

В последнее время мне почему-то очень часто эту ссылку кидают В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).

Ivan8209

Тебе может быть любопытно, но удивительно отсутствие bigForth-а.
Он должен побыстрее gforth-а быть.
---
...Я работаю антинаучным аферистом...

Ivan8209

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

Julie16

А что мешает тебе реализовать перемножение внутриязыковым образом? Именно для оценки оптимизатора.

Ivan8209

Например, размер компилятора, сложность его.
Компилятор может быть очень хорошо машинозависимым.
Как интеловский сишный, например.
---
...Я работаю антинаучным аферистом...

Ivan8209

Поизвращаться, что ли, попытаться поднять своих?
Посмотрел, сразу нашёл несколько мест, где очевиден способ ускорить.
---
VARIABLE 1

Marinavo_0507

Т-cистема
Cilk
Sisal
Glasgow Parallel Haskell
это что сразу нашлось

shlyumper

Для разных языков их пишут разные люди. С разным опытом и уровнем.
Говноаргумент. Исходники всех тестов выложены, если ты считаешь, что существуют более эффективные реализации этого же решения на данном языке, то напиши свою и отошли авторам тестов.
и следовательно нерепрезентативные.
Какой тест считать репрезентативным? Dhrystone? Whetstone? SPECint? SPECfloat?
Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).
Нет. Существуют задачи, которые эффективнее решать на алгоритмических языках. Существуют задачи, которые эффективнее решать на функциональных. Перемножение матриц относится к первой категории.

Julie16

1) Ничего подобного. Ерунду ты какую-то написал. ИМХО.
2) SPECint, SPECfloat - весьма уважаемые тесты. ИМХО на них и нужно ориентироваться
3) Какие же задачи относятся ко второй категории?

Dasar

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

shlyumper

SPECint, SPECfloat - весьма уважаемые тесты.
Возможно, они и уважаемые, но их исходники недоступны. Или я что-то путаю?
Оставить комментарий
Имя или ник:
Комментарий: