Вопросы с тегом «compiler-optimization»

Оптимизация компилятора включает в себя адаптацию компилятора для уменьшения времени выполнения или размера объекта или того и другого. Это может быть выполнено с помощью аргументов компилятора (например, CFLAGS, LDFLAGS), подключаемых модулей компилятора (например, DEHYDRA) или прямых модификаций компилятора (таких как изменение исходного кода).

2247
Почему поэлементное сложение намного быстрее в отдельных циклах, чем в комбинированном цикле?

Предположим a1, b1, c1иd1 точка в динамической памяти , и мой числовой код имеет следующий основной цикл. const int n = 100000; for (int j = 0; j < n; j++) { a1[j] += b1[j]; c1[j] += d1[j]; } Этот цикл выполняется 10000 раз через другой внешний forцикл. Чтобы ускорить его, я изменил код на: for...

2120
Почему GCC не оптимизирует a * a * a * a * a * a до (a * a * a) * (a * a * a)?

Я делаю некоторую числовую оптимизацию для научного приложения. Одна вещь, которую я заметил, заключается в том, что GCC оптимизирует вызов pow(a,2), компилируя его a*a, но вызов pow(a,6)не оптимизируется и фактически вызовет библиотечную функцию pow, что значительно снижает производительность. (В...

1424
Замена 32-разрядного счетчика циклов на 64-разрядный вводит сумасшедшие отклонения производительности с _mm_popcnt_u64 на процессорах Intel

Я искал самый быстрый способ для popcountбольших массивов данных. Я обнаружил очень странное действие: Изменение переменного цикла из unsignedк uint64_tвысказанному падению производительности на 50% по сравнению с ПК. Бенчмарк #include <iostream> #include <chrono> #include...

928
Быстрая бета-версия: сортировка массивов

Я реализовывал алгоритм в Swift Beta и заметил, что производительность была очень плохой. Покопавшись глубже, я понял, что одним из узких мест является нечто такое же простое, как сортировка массивов. Соответствующая часть здесь: let n = 1000000 var x = [Int](repeating: 0, count: n) for i in...

445
Почему GCC генерирует код на 15-20% быстрее, если я оптимизирую размер вместо скорости?

Я впервые заметил в 2009 году, что GCC (по крайней мере, в моих проектах и ​​на моих машинах) имеет тенденцию генерировать заметно более быстрый код, если я оптимизирую для size ( -Os) вместо скорости ( -O2или -O3), и с тех пор я удивляюсь, почему. Мне удалось создать (довольно глупый) код, который...

301
Почему компилятор Rust не оптимизирует код, предполагая, что две изменяемые ссылки не могут иметь псевдоним?

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

289
Как скомпилировать Tensorflow с инструкциями SSE4.2 и AVX?

Это сообщение получено от запуска скрипта, чтобы проверить, работает ли Tensorflow: I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally I...

195
Что такое &&& операция в C

#include <stdio.h> volatile int i; int main() { int c; for (i = 0; i < 3; i++) { c = i &&& i; printf("%d\n", c); } return 0; } Выход вышеуказанной программы составлен с использованием gccв 0 1 1 С опцией -Wallили выдает предупреждение:-Waddressgcc warning: the address of ‘i’...

184
Почему GCC генерирует такую ​​радикально отличную сборку для почти одного и того же C-кода?

При написании оптимизированной ftolфункции я обнаружил очень странное поведение в GCC 4.6.1. Позвольте мне сначала показать вам код (для ясности я отметил различия): fast_trunc_one, C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent =...

173
Можно ли намекнуть оптимизатору, указав диапазон целого числа?

Я использую intтип для хранения значения. В соответствии с семантикой программы значение всегда изменяется в очень небольшом диапазоне (0 - 36), и int(не a char) используется только из-за эффективности процессора. Кажется, что многие специальные арифметические оптимизации могут быть выполнены для...

171
Почему лямбды могут быть лучше оптимизированы компилятором, чем обычные функции?

В своей книге The C++ Standard Library (Second Edition)Николай Йосуттис утверждает, что компилятор может оптимизировать лямбды лучше, чем простые функции. Кроме того, компиляторы C ++ оптимизируют лямбда-выражения лучше, чем обычные функции. (Стр. 213) Это почему? Я думал, что когда дело доходит до...

165
Как посмотреть, какие флаги -march = native активируют?

Я компилирую свое приложение C ++, используя GCC 4.3. Вместо того, чтобы вручную выбирать флаги оптимизации, которые я использую -march=native, теоретически следует добавить все флаги оптимизации, применимые к оборудованию, на котором я компилирую. Но как я могу проверить, какие флаги он...

151
Пределы типа Nat в Shapeless

В бесформенном типе Nat представлен способ кодирования натуральных чисел на уровне типа. Это используется, например, для списков фиксированного размера. Вы даже можете выполнять вычисления на уровне типа, например, добавлять список Nэлементов в список Kэлементов и возвращать список, который, как...

148
Почему улучшенный оптимизатор GCC 6 нарушает практический код C ++?

В GCC 6 появилась новая функция оптимизатора : она предполагает, что thisона всегда не равна нулю, и оптимизирует на основе этого. Распространение диапазона значений теперь предполагает, что указатель this функций-членов C ++ не равен NULL. Это исключает обычные проверки нулевого указателя, но...

133
Почему компилятор не может (или не может) оптимизировать предсказуемый цикл сложения в умножение?

Этот вопрос пришел в голову при чтении блестящего ответа Mysticial на вопрос: почему обрабатывать отсортированный массив быстрее, чем несортированный ? Контекст для задействованных типов: const unsigned arraySize = 32768; int data[arraySize]; long long sum = 0; В своем ответе он объясняет, что...

131
Как сделать бесконечный пустой цикл, который не будет оптимизирован?

Стандарт C11, по-видимому, подразумевает, что итерационные операторы с постоянными управляющими выражениями не должны быть оптимизированы. Я беру свой совет из этого ответа , который конкретно цитирует раздел 6.8.5 из проекта стандарта: Оператор итерации, управляющее выражение которого не является...

122
Использование этого указателя вызывает странную деоптимизацию в горячем цикле

Недавно я столкнулся со странной деоптимизацией (точнее, упущенной возможностью оптимизации). Рассмотрим эту функцию для эффективной распаковки массивов 3-битных целых чисел в 8-битные целые числа. На каждой итерации цикла он распаковывает 16 int: void unpack3bit(uint8_t* target, char* source, int...

97
Эффективность преждевременного возврата в функцию

Это ситуация, с которой я часто сталкиваюсь как неопытный программист, и меня это интересует, особенно для моего амбициозного, требовательного к скорости проекта, который я пытаюсь оптимизировать. Для основных C-подобных языков (C, objC, C ++, Java, C # и т. Д.) И их обычных компиляторов будут ли...

94
Уровни оптимизации Clang

На НКУ, руководство объясняет , что -O3, -Osи т.д. переводить с точки зрения аргументов оптимизации конкретных ( -funswitch-loops, -fcompare-elimи т.д.) Я ищу такую ​​же инфу для clang . Я искал в Интернете и в man clangкотором дается только общая информация ( -O2оптимизирует больше -O1,...

81
Почему 'd / = d' не генерирует исключение деления на ноль, когда d == 0?

Я не совсем понимаю, почему я не получаю исключение деления на ноль: int d = 0; d /= d; Я ожидал получить деление на нулевое исключение, но вместо этого d == 1. Почему не d /= dгенерирует исключение деления на ноль, когда d == 0?...