Ключевые понятия для изучения в блоке

1.0e-08 довольно низок. Не могли бы вы попытаться с помощью g_tol=1.0e-6 увидеть, что оно сходится?

results = optimize(f, lower, upper, initial_x, Fminbox(inner_optimizer), Optim.Options(iterations=0, store_trace=true, show_trace=true, g_tol=1.0e-6))
7
задан Spodi 30 April 2012 в 08:56
поделиться

9 ответов

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

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

Вы, вероятно, думаете, что целочисленные операции являются самыми быстрыми. Если Вы хотите найти, что целочисленный квадратный корень целого числа (т.е. пол (sqrt (i))) лучше использовать стандартную программу приближения только для целого числа, правильно?

Nah. Математический сопроцессор (на x86, который является) имеет fsqrt инструкцию. Преобразование в плавание, пущение квадратного корня и преобразование в интервал снова быстрее, чем все-целочисленный алгоритм.

Затем существуют вещи как доступ к памяти, за которой можно следовать, но не правильно apprecatiate, пока Вы не копались в блоке. Скажите, что у Вас был связанный список, и первый элемент в списке содержит переменную, к которой необходимо будет часто получать доступ. Список редко переупорядочивается. Ну, каждый раз, когда необходимо получить доступ к той переменной, необходимо загрузить указатель на первый элемент в списке, затем с помощью этого, загрузить переменную (предположение, что Вы не можете сохранить адрес переменной в регистре между использованием). Если Вы вместо этого сохранили переменную за пределами списка, Вам только нужна единственная операция загрузки.

Конечно, сохранение нескольких циклов тут и там обычно не важно в эти дни. Но если Вы планируете написание кода, которое должно быть быстро, этот вид знания может быть применен и со встроенным ассемблерным кодом и обычно на других языках.

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

Существуют небольшие приемы как ПРОДВИЖЕНИЕ обратного адреса и затем JMPing в процедуру; когда возвраты процедуры это перейдет к ПРОДВИНУТОМУ адресу. Это отклонение от обычного образа мыслей о вызовах функции - другой тех "состояний просвещения". Если бы необходимо было когда-либо разрабатывать язык программирования с инновационными функциями, то необходимо знать о забавных вещах, что аппаратные средства способны к.

Знание ассемблера преподает Вам архитектурно-зависимые вещи о компьютерной безопасности. Как Вы могли бы использовать переполнение буфера или ворваться в привилегированный режим, и как предотвратить такие нападения.

Затем существует ubercoolness самоизменения кода, и как связанная проблема, механизмы для вещей, таких как перемещения и применение патчей к коду (этому нужно расследование машинного кода также).

Но все эти вещи нуждаются в правильном виде ума. Если Вы - вид человека, который может поместить

while(x--)
{
  ...
}

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

5
ответ дан 6 December 2019 в 08:17
поделиться

Выделение регистра и управление

Блок дает Вам очень хорошую идею того, каким количеством переменных (целые числа размера машинного слова) ЦП может манипулировать одновременно. Если можно сломать циклы так, чтобы они включили только несколько временных переменных, они все поместятся в регистры. В противном случае Ваш цикл будет медленно работать, поскольку вещи выгружаются к памяти.

Это действительно помогло мне с моим кодированием C. Я пытаюсь сделать все циклы трудными и простыми с как можно меньшим количеством спагетти.

x86 является немым

Изучение нескольких ассемблеров заставило меня понять, как Ламе x86 система команд. Инструкции переменной длины? Твердо предсказываемая синхронизация? Неортогональные способы адресации? Тьфу.

Мир был бы лучше, если бы все мы выполнили MIPS, я думаю, или даже ARM или PowerPC :-) Или скорее если Intel/AMD взял их полупроводниковые экспертные знания и использовал их для создания многоядерных, сверхбыстрых, ультрадешевых процессоров MIPS вместо x86 процессоров со всеми теми, которые искупают качества.

7
ответ дан 6 December 2019 в 08:17
поделиться

Хорошо знать ассемблер для получения лучшей оценки для того, как компьютер работает "под капотом", и помогает, когда Вы отлаживаете что-то, и весь отладчик может дать Вам, список ассемблерных кодов, который, по крайней мере, дает Вам борющийся с шансом выяснения, какова проблема могла бы быть. Однако пытаться применить знание низкого уровня к высокоуровневым языкам программирования, таким как попытка использовать в своих интересах, как инструкции по кэшам ЦП и затем пишущий wonky высокоуровневый код, чтобы вынудить компилятор произвести суперэффективный машинный код, является, вероятно, знаком, что Вы пытаетесь микрооптимизировать. В большинстве случаев обычно лучше не попытаться перехитрить компилятор, если Вам не нужно увеличение производительности, в этом случае, Вы могли бы также записать те биты в блоке так или иначе.

Так, хорошо знать блок ради лучшего понимания того, как вещи работают, но полученное знание не обязательно непосредственно применимо к тому, как Вы пишете код на высокоуровневых языках. На той ноте, однако, я нашел, что, учась, как работа вызовов функции над уровнем ассемблерного кода (приобретение знаний о стеке и связал регистры, приобретение знаний о том, как параметры передаются стеку, учась, как автоматическое хранение работает, и т.д.) сделало намного легче понять проблемы, которые я имел в высокоуровневом коде, такой как "из стекового пространства" ошибки и "недопустимое соглашение о вызовах" ошибки.

4
ответ дан 6 December 2019 в 08:17
поделиться

Самое важное понятие является SIMD и творческим использованием его. Надлежащее использование SIMD может дать огромные выигрыши в производительности в серьезном множестве приложений в пределах от всего от строковой обработки до видео управления к матричной математике. Это - то, где можно преобладать 10x, производительность повышает по чистому коду C - это - то, почему блок все еще полезен вне простой отладки.

Некоторые примеры из проекта, я продолжаю работать (все числа являются тактом, рассчитывают на Core 2):

Инверсия 8x8 H.264 DCT (частота преобразовывают):

c: 1332
mmx: 187
sse2: 127

8x8 компенсация движения Цветности (фильтр билинейной интерполяции):

c: 639
mmx: 144
sse2: 110
ssse3: 79

4 16x16 Сумма операций Абсолютной разности (поиск движения):

c: 3948
mmx: 278
sse2: 231
ssse3: 215

(да, правильно - по 18x быстрее, чем C!)

Среднеквадратическая ошибка 16x16 блок:

c: 1013
mmx: 193
sse2: 131

Различие 16x16 блок:

c: 783
mmx: 171
sse2: 106
3
ответ дан 6 December 2019 в 08:17
поделиться

Я сказал бы, что способы адресации чрезвычайно важны.

Моя alma mater довела до крайности это, и потому что x86 не имел достаточного количества из них, мы изучили все на средстве моделирования PDP11, который, должно быть, имел по крайней мере 7 из них, что я помню. Ретроспективно, это было хорошим выбором.

0
ответ дан 6 December 2019 в 08:17
поделиться

Я сказал бы, что изучение рекурсии и циклов в блоке учило меня много. Это заставило меня понять базовое понятие того, как компилятор/интерпретатор языка я использую вещи нажатий на стек и выталкиваю их прочь, поскольку этому нужны они. Я также изучил, как использовать печально известное переполнение стека. (который все еще удивительно легок в C с некоторыми, получают - и помещают - команды).

Кроме использования asm в повседневных ситуациях, я не думаю, что использовал бы любой блок понятий, учил меня.

1
ответ дан 6 December 2019 в 08:17
поделиться

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

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

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

2
ответ дан 6 December 2019 в 08:17
поделиться

синхронизация

быстрое выполнение:

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

быстро к медленному доступу к устройству хранения данных:

  • регистры
  • кэш и различные уровни кэша
  • неупорядоченное хранение памяти и стек
  • виртуальная память
  • внешний ввод-вывод
0
ответ дан 6 December 2019 в 08:17
поделиться

В наше время x86 asm не является прямой линией к кишкам ЦП, но большим количеством API. Ассемблерные коды операций, которые Вы пишете, самостоятельно компилируются в совершенно другую систему команд, перестроенную, переписанную, зафиксированную и обычно искажаемую до неузнаваемости.

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

Этот ряд статей затрагивает последнюю тему довольно полностью.

0
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: