реклама на сайте
подробности

 
 
> Float-ядро для double операций, Как использовать Float-ядро для double операций
AlexeyT
сообщение Nov 16 2013, 11:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-06-07
Пользователь №: 28 207



Ожидаем поставку процессора с ядром Cortex-M4F с аппаратно реализованными операциями с плавающей точкой (32-битные float).

Точности float для некоторых наших вычислений недостаточно, приходится использовать 64-битный double.

Вопрос - есть ли способ использовать float-сопроцессор для операций формата double? Хотя бы для самых простых - сложение и вычитание?
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 24)
Golikov A.
сообщение Nov 19 2013, 10:25
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я не ошибся, я имел ввиду другое

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

Хотя ваша правда, легче уже сразу переходить к перемножению мантис в целочисленной арифметике, чем мутить такое.
Go to the top of the page
 
+Quote Post
DASM
сообщение Nov 19 2013, 10:43
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(SII @ Nov 19 2013, 14:18) *
если для перемножения мантисс чисел одинарной точности достаточно лишь одной инструкции 32-разрядного целочисленного умножения, которая у ARMов есть, то для перемножения мантисс чисел двойной точности подходящей инструкции уже нет

ARM разные бывают, стоит уточнить. У ARMv6 хардворный дабл есть.
Go to the top of the page
 
+Quote Post
SII
сообщение Nov 19 2013, 13:55
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(DASM @ Nov 19 2013, 14:43) *
ARM разные бывают, стоит уточнить. У ARMv6 хардворный дабл есть.


Кажется, мы говорим о разных вещах: Вы о наличии ППЗ, обрабатывающего не только 32-разрядные, но и 64-разрядные вещественные числа, а я -- о программной реализации вещественной арифметики с помощью команд обработки целых чисел, т.е. без ППЗ. Для того, чтобы выполнить умножение мантисс вещественных чисел двойной точности, требуется команда умножения, операндами которой являются 64-разрядные числа. Реально мантисса, конечно, меньше -- если память не изменяет, 52 бита -- но в любом случае 32-разрядное умножение здесь не годится, а команд, умножающих более крупные целые числа, ни у каких ARMов нет.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 19 2013, 16:28
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а я о теоретической применимости 32 битного флотовского умножителя для ускорения 64 битной дабловской арифметики...%)
Go to the top of the page
 
+Quote Post
SII
сообщение Nov 20 2013, 05:35
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



В третий раз повторяю: изучите матчасть, а заодно и математику. Никакого "флотовского умножителя" в природе не существует. Для выполнения операций с вещественными числами используются схемы сложения, умножения, деления и сдвига целых чисел, не имеющие никаких принципиальных отличий от аналогичных узлов, предназначенных для выполнения целочисленной арифметики. Более того, разрядность у вычислительных блоков ППЗ, поддерживающего лишь вещественную арифметику одинарной точности, меньше, чем у аналогичных блоков основного процессора. Например, обычный целочисленный умножитель в основном процессоре позволяет умножить два 32-разрядных целых числа с получением 64-разрядного результата, а пресловутый умножитель в ППЗ, который никакой не "флотовый", а опять-таки самый что ни на есть обычный целочисленный -- лишь два 24-разрядных целых числа (поскольку мантисса вещественных чисел одинарной точности содержит 24 бита). То же самое относится и к другим схемам.

Может быть, теоретически удалось бы извернуться и использовать ППЗ одинарной точности для обработки чисел двойной точности, вот только реализация всего этого будет принципиально такой же, как на целочисленном процессоре без всякого ППЗ, только намного более муторной. Например, для умножения кусков мантисс вещественных чисел двойной точности (размер 53 бита) в любом случае придётся мантиссы разбивать на части и выполнять умножение по кусочкам, а потом складывать промежуточные результаты. На 32-разрядном умножителе основного процессора потребуется 4 операции умножения (32*32 бита с 64-разрядным результатом), а на 24-разрядном умножителе ППЗ -- целых 25 (12*12 бит с 24-разрядным результатом), т.е. даже по одному умножению ППЗ будет проигрывать основному процессору более чем в шесть раз. А ведь требуются ещё сдвиги и сложения, которые на ППЗ реализовать тоже сложней, чем на основном процессоре (если вообще удастся такое сделать -- тут надо думать). Так что такая реализация арифметики двойной точности на ППЗ одинарной точности будет во много медленней, чем её реализация на основном процессоре -- и, что весьма интересно, при этом никакие "плавающие" возможности ППЗ реально использовать невозможно, они лишь мешают.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 20 2013, 07:05
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну вот теперь понятно...

а 32 битный умножитель целых, дает 64 бита?

int32_t A;
int32_t B;
int64_t Result;

всегда писал Result = (int64_t)A * (int64_t)B, и тем самым заставлял проц делать сразу все в 64 битах и за несколько тактов. То есть мне стоило писать Result = A * B? или такую хитрость только явным ассемблером получить можно?



Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2013, 08:21
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Golikov A. @ Nov 20 2013, 10:05) *
всегда писал Result = (int64_t)A * (int64_t)B, и тем самым заставлял проц делать сразу все в 64 битах и за несколько тактов. То есть мне стоило писать Result = A * B?
Вы и ваш компилятор делали так, как и надо делать согласно стандарта языка. Если включить оптимизатор, то хороший компилятор должен выкинуть лишние операции и оставить лишь [32]*[32]=[64]


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SII
сообщение Nov 20 2013, 08:54
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(Golikov A. @ Nov 20 2013, 11:05) *
а 32 битный умножитель целых, дает 64 бита?


Физически -- да, умножение 32-разрядных чисел даст 64-разрядный результат. Однако удастся ли "в лоб" использовать это на языке высокого уровня (на Си, в частности), я не знаю. На ассемблере ручками -- всегда пожалуйста sm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 20 2013, 11:40
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



в лоб без оптимизации
[32]*[32]
дает [32]....
имеется ввиду
Result = A * B,
а Result = (int64_t)A * (int64_t)B,
без оптимизации дает больше команд чем просто 32 на 32 умножение, а с оптимизацией я чет не допер посмотреть...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2013, 12:54
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Golikov A. @ Nov 20 2013, 14:40) *
без оптимизации дает больше команд чем просто 32 на 32 умножение, а с оптимизацией я чет не допер посмотреть...
Без оптимизации получаете ровно то, что просите. Без оптимизации, как и просите.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016