Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 11:40   #11
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Машинное слово, почему нет.
Нет смысла в степенях > 64 при текущем выходном параметре. Хотя хз. как это на производительность влияет.
Цитата:
Полагаю, что из-за отсутствия ветвления в аргументах. Но это в нерекурсивный вызов компилятор не преобразует заведомо.
Да, это очевидно что не преобразуется, но и предыдущий тоже не преобразовывается =( судя по всему
Kostia вне форума Ответить с цитированием
Старый 11.12.2012, 13:50   #12
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
и компилятор мог бы допереть до этого и сделать очень мощную оптимизацию
"Допереть" - это не задача компилятора, это задача программиста.
Разные алгоритмы обладают разными характеристиками: ресурсоемкость в вычислениях в целых числах, ресурсоемкость в вычислениях с плавающей точкой, требования к памяти, требуемая глубина стека, баланс между операциями условного перехода и "линейным" кодом...
И в каждом случае для конкретных условий применения, о которых компилятор не имеет никакого понятия, выбор должен оставаться за программистом.

Глупо полагать, что если написать код кое как, компилятор потом "все равно все оптимизирует".
s-andriano вне форума Ответить с цитированием
Старый 11.12.2012, 23:20   #13
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Глупо полагать, что если написать код кое как, компилятор потом "все равно все оптимизирует".
Не кое как, а в так сказать "нормальной" форме.
Цитата:
"Допереть" - это не задача компилятора, это задача программиста.
Именно его задача, моя задача только явно указать ему места(написав код в соответствующей форме), которые можно оптимизировать и распараллелить, а не говорить ему как это делать.

Цитата:
Разные алгоритмы обладают разными характеристиками: ресурсоемкость в вычислениях в целых числах, ресурсоемкость в вычислениях с плавающей точкой, требования к памяти, требуемая глубина стека, баланс между операциями условного перехода и "линейным" кодом...
Алгоритмы тут совершенно не причем:

x = a + b;
y = x*2

и

x = a + b
y = (a+b)*2

Далеко не одно и тоже! В первом случае все будет выполняться последовательно, т.к. y зависит от x, во втором случае их можно выполнить параллельно. Пример высосан из пальца, но в целом все как-то так и подобные вещи компилятор должен сам распознавать и предпринимать соответствующие действия, вместо многословных методов распаривания.
И если бы процессоры не занимались оптимизацией команд которые им следует выполнять, то вообще труба дело. А так он сам разбирается что можно выполнить в разных вычислительных блоках, предсказывает переходы в памяти и заранее запрашивает предполагаемые данные у оперативки, пока сам выполняет вычисления. Из оперативки достает 64 байта и кладет их в кэш всегда(процессоры intel), грех этим не воспользоваться. И если есть возможность скомпоновать комманды таким образом, чтобы они были выполнены на процессоре в разных блоках, то этим нужно пользоваться, но гораздо лучше, если бы этим еще занимался и компилятор!
Kostia вне форума Ответить с цитированием
Старый 12.12.2012, 16:04   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
x = a + b;
y = x*2

и

x = a + b
y = (a+b)*2

Далеко не одно и тоже! В первом случае все будет выполняться последовательно, т.к. y зависит от x, во втором случае их можно выполнить параллельно. Пример высосан из пальца, но в целом все как-то так и подобные вещи компилятор должен сам распознавать и предпринимать соответствующие действия, вместо многословных методов распаривания.
В Дельфи есть такая оптимизация. Именно для данного примера переменная х использоваться не будет.
В функциональных языках это часто (традиционно) реализовано еще символически. То есть в первый проход
x = a + b;
y = x*2
будет заменено на y = (a+b)*2 на уровне токенов, еще до оптимизаций команд процессора. Это есть например в ocaml.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 12.12.2012, 18:08   #15
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
Далеко не одно и тоже! В первом случае все будет выполняться последовательно, т.к. y зависит от x, во втором случае их можно выполнить параллельно. Пример высосан из пальца, но в целом все как-то так и подобные вещи компилятор должен сам распознавать и предпринимать соответствующие действия, вместо многословных методов распаривания.
Т.е. Вы считаете, что 3 операции + накладные расходя на организацию "распаривания" и синхронизацию - оптимальнее?
Еще можно о чем-то говорить, если есть уверенность, что у нас всегда присутствуют свободные от работы процессоры/ядра (и то не в данном примере, но будем считать, что данный пример - лишь иллюстрация, а не реальный код).
А если у нас всего одно ядро?
Либо просто процессор загружен другой работой, и для него актуальна экономия именно процессорного времени, а не астрономического?

Еще раз: это не дело компилятора, распараллеливать или нет - должен решать программист.
s-andriano вне форума Ответить с цитированием
Старый 13.12.2012, 22:34   #16
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
А если у нас всего одно ядро?
Даже одно ядро может выполнять несколько команд одновременно, т.е. может быть несколько функциональных блоков, выполняющих одни и те же команды.
Цитата:
Либо просто процессор загружен другой работой, и для него актуальна экономия именно процессорного времени, а не астрономического?
Так называемое Фон-Неймановское горлышко, проблема архитектуры, с которой приходится мириться, увы.
Цитата:
Т.е. Вы считаете, что 3 операции + накладные расходя на организацию "распаривания" и синхронизацию - оптимальнее?
Никакой тут синхронизации и пр. просто будут выполнены параллельно в 2х функциональных блоках(источник: Оптимизация ПО Сборник рецептов. Intel Press).
Цитата:
организацию "распаривания" и синхронизацию - оптимальнее?
Проблема императивных языков
Kostia вне форума Ответить с цитированием
Старый 14.12.2012, 12:17   #17
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
Даже одно ядро может выполнять несколько команд одновременно, т.е. может быть несколько функциональных блоков, выполняющих одни и те же команды.
И что с того?
Все современные суперскалярные процессоры именно так и делают.
Но согласно программной модели, тем не менее, команды выполняются последовательно.
Цитата:
Никакой тут синхронизации и пр. просто будут выполнены параллельно в 2х функциональных блоках
Синхронизация как раз есть. Вплоть до сброса конвейера.
Но при чем здесь компилятор, который работает именно с программной моделью?
s-andriano вне форума Ответить с цитированием
Старый 14.12.2012, 13:53   #18
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Синхронизация как раз есть. Вплоть до сброса конвейера.
Я имел ввиду синхронизацию касательно побочных эффектов функций.
Цитата:
Но при чем здесь компилятор, который работает именно с программной моделью?
На втором курсе мы писали простенький транслятор обычных арифметических выражений на псевдоассемблер. Нужно было полученный код после трансляции оптимизировать, в последствии чего он сокращался раза в три, а то и больше. Было минимизировано кол-во операций работы с памятью и объем памяти необходимый для хранения промежуточных результатов, удалены бессмысленные команды типа x + 0, x * 1, -1 + 1.
Вопрос, кто же по вашему должен заниматься подобной оптимизацией? Кодер?
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Рекурсия <Tyz> Паскаль, Turbo Pascal, PascalABC.NET 3 18.12.2010 23:22
рекурсия DinaraIITU Помощь студентам 3 04.11.2010 15:39
Рекурсия на С++ Nitriyc Помощь студентам 0 28.04.2010 17:22
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36