АЛУ GPU

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

АЛУ GPU

Сообщение BratSinot »

Доброго времени суток!

Начну издалека. Многим известно, что разрядность процессора не совпадает с разрядностью АЛУ, что приводит к невозможности использовании больших констант на битовых операциях (причем это проявляется не только при использовании ассемблеров, но и, к примеру языка C). Например, на современных amd64 системах, АЛУ 32-разрядный, поэтому чтоб например сделать битовый сдвиг влево на 52 бита придется делать:

Код: Выделить всё

так
a=(a<<31)<<21;

или так
a*=0x10000000000000;

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

А теперь вопрос, как с этим обстоят дела на GPU?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: АЛУ GPU

Сообщение watashiwa_daredeska »

BratSinot писал(а):
18.06.2012 23:18
поэтому чтоб например сделать битовый сдвиг влево на 52 бита придется делать:

Код: Выделить всё

так
a=(a<<31)<<21;
Бред. Нормально работает a <<= 52. Причем, если заглянуть в ассемблерную выдачу компилятора, то вполне себе обнаружится salq $52, %rsi, т.е. сдвиг в одну инструкцию. Где-то там внутри, процессор возможно и делает этот сдвиг в два шага, но это уже его проблемы.

BratSinot писал(а):
18.06.2012 23:18

Код: Выделить всё

или так
a*=0x10000000000000;

Соотвественно можно замерить что быстрее выполняется (на x86 умножение/деление настолько кривое, что я почти не сомневаюсь, что два сдвига быстрее).
Да, умножение кривое, но компиляторы достаточно умные. Ассемблерная выдача при компиляции этого выражения полностью идентична предыдущей.

BratSinot писал(а):
18.06.2012 23:18
[code]
А теперь вопрос, как с этим обстоят дела на GPU?
Полагаю, что точно так же компилятор заботится о соблюдении спецификации языка и если в спецификации не сказано, что сдвигать на более чем 31 бит запрещено, то значит можно, и компилятор об этом позаботится. А если не позаботится, то это баг, который надо репортить.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: АЛУ GPU

Сообщение BratSinot »

watashiwa_daredeska писал(а):
19.06.2012 00:57
BratSinot писал(а):
18.06.2012 23:18
поэтому чтоб например сделать битовый сдвиг влево на 52 бита придется делать:

Код: Выделить всё

так
a=(a<<31)<<21;
Бред. Нормально работает a <<= 52. Причем, если заглянуть в ассемблерную выдачу компилятора, то вполне себе обнаружится salq $52, %rsi, т.е. сдвиг в одну инструкцию. Где-то там внутри, процессор возможно и делает этот сдвиг в два шага, но это уже его проблемы.

А, точно. Про битовый сдвиг я наврал. Но константы все равно не работают, вот a = a*(1<<52), работать не будет.

watashiwa_daredeska писал(а):
19.06.2012 00:57
BratSinot писал(а):
18.06.2012 23:18
[code]
А теперь вопрос, как с этим обстоят дела на GPU?
Полагаю, что точно так же компилятор заботится о соблюдении спецификации языка и если в спецификации не сказано, что сдвигать на более чем 31 бит запрещено, то значит можно, и компилятор об этом позаботится. А если не позаботится, то это баг, который надо репортить.

Я и спрашиваю. В спецификации языка (насколько я знаю), не прописано насчет больших констант для битовых операций, с CPU узнать не сложно, спецификации более, менее есть, а вот про GPU такого не скажешь.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: АЛУ GPU

Сообщение /dev/random »

BratSinot писал(а):
19.06.2012 09:35
А, точно. Про битовый сдвиг я наврал. Но константы все равно не работают, вот a = a*(1<<52), работать не будет.

1 - это int, а он на x86_64 32-битный. Чтобы был 64-битный, нужен long, т.е. 1L << 52
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: АЛУ GPU

Сообщение sciko »

Не могу не заметить, что в стандарте C размер типов даннных никак не оговорен. Только соотношение типа long>=int>=short. Поэтому в той же glib есть специальные типы с чётко заданной длиной в битах. Вот с ними-то и имеет смысл проводить битовые операции, иначе можно нарваться на вышеуказаннный эфект.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: АЛУ GPU

Сообщение BratSinot »

sciko писал(а):
19.06.2012 21:51
Не могу не заметить, что в стандарте C размер типов даннных никак не оговорен. Только соотношение типа long>=int>=short. Поэтому в той же glib есть специальные типы с чётко заданной длиной в битах. Вот с ними-то и имеет смысл проводить битовые операции, иначе можно нарваться на вышеуказаннный эфект.

Да речь вообще не о том.
Спасибо сказали: