Pull to refresh
0
0
Send message
Часто стиль написания кода сам по себе сильно мешает компилятору оптимизировать.
На днях наткнулся на интересную особенность в GCC (возможно справедливо и для остальных компиляторов, я не проверял) — при векторизации циклов результат зависит от мест слагаемых из-за редукции:
Векторизуется
for(i=0;i<n;i++) s += a[i] + b[i];
и
for(i=0;i<n;i++) s = a[i] + b[i] + s;
Не векторизуется
for(i=0;i<n;i++) s = s + a[i] + b[i];
Tizen не ограничен архитектурой x86, на том же арме он прекрасно работает.
Тут скорее надо кросскомпиляцию — оперативки маловато, внизу в комментах про llvm пишут, для gcc я думаю тоже кто-нибудь бэкенд сделает ;)
Не любая инструкция может выполнятся условно, например вызов функции (bl, blx) или предзагрузка в память (pld).
С предзагрузкой, кстати есть много фокусов, типа fast memcpy, который на объёмных данных работает раза в полтора-два быстрее чем обычный.
*плагины. Если интересует, могу узнать подробнее.
Насколько я помню, у них на сайте раньше можно
было онлайн потестить немного кода.
Кроме интеграции в VS еще вроде были планины для eclipse и IntelliJ Idea. Точно я не помню, я работал у них, но давно, года 4 назад… :)
Весёлые были времена, да, я попал на виток с дискетками, деталей как прятался скрипт не помню, по смыслу это были javascript вставки, которые по клику в определённое место левой кнопкой искали буфер обмена в ответах, а правой кнопкой в полном тексте лекций, и подменяло какой-то левый текст на странице на нужную инфу.
Скрипт писали сами, т.к. популярного в те времена скрипта мы почему-то не нашли :)
А почему заставили всех гадать где и что это было?
В первую очередь — вынести из цикла инвариатны, в формуле не зря «4» стоит до интеграла.
С разрезанием странный пример — введение временной переменной на этой же итерации не поможет сократить количество необходимых регистров. В случае с gcc временная переменная повлияет только на название операнда в SSA (static single assignment) — вместо сделанного автоматически будет tmp.
«как бы не улучшала оптимизация характеристики программы, она обязательно должна сохранять изначальный смысл программы при любых условиях. Именно поэтому, например, в GCC существуют различные уровни оптимизации»

По моему уровни оптимизации существуют не поэтому — в идеале любая оптимизация должна сохранять смысл программы (в gcc это к сожалению не так, и встречаются опции, которые меняют результат, в основном правда при вычислениях с плавающей запятой).
Есть отличная статья про уровни оптимизации.
В gcc, если мне не изменяет память, есть опция -funroll-loops, которая может разворачивать циклы. Более хитрая оптимизация — swing modulo scheduling, которая умеет выносить из цикла пролог и эпилог с целью уменьшить зависимость по данным внутри одной итерации цикла. А вообще, с циклами много всего есть, поэтому это действительно тема для отдельной части.
Если я не путаю, то это ещё бета версия. Разработчики молодцы :)
Порадовал маленький общий размер и установщик.
2

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity