Pytania otagowane jako compiler-optimization

Optymalizacja kompilatora polega na dostosowaniu kompilatora w celu zmniejszenia czasu wykonywania lub rozmiaru obiektu lub obu. Można to osiągnąć za pomocą argumentów kompilatora (np. CFLAGS, LDFLAGS), wtyczek kompilatora (na przykład DEHYDRA) lub bezpośrednich modyfikacji kompilatora (takich jak modyfikacja kodu źródłowego).


12
Dlaczego GCC nie optymalizuje * a * a * a * a * a do (a * a * a) * (a * a * a)?
Robię optymalizację numeryczną w aplikacji naukowej. Zauważyłem tylko, że GCC zoptymalizuje wywołanie pow(a,2), kompilując je a*a, ale wywołanie pow(a,6)nie jest zoptymalizowane i faktycznie wywoła funkcję biblioteki pow, co znacznie spowalnia działanie. (Natomiast kompilator Intel C ++ , wykonywalny icc, wyeliminuje wywołanie biblioteki pow(a,6)). Jestem ciekaw co o to, że kiedy …

10
Zastąpienie 32-bitowego licznika pętli 64-bitowym wprowadza szalone odchylenia wydajności od _mm_popcnt_u64 na procesorach Intel
Szukałem najszybszego sposobu na popcountduże tablice danych. Spotkałem bardzo dziwny efekt: zmiana zmiennej pętli z unsignedna uint64_tsprawiła, że ​​wydajność spadła o 50% na moim komputerze. Benchmark #include <iostream> #include <chrono> #include <x86intrin.h> int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr << "usage: array_size …


6
Dlaczego GCC generuje kod o 15-20% szybszy, jeśli optymalizuję rozmiar zamiast prędkości?
Po raz pierwszy zauważyłem w 2009 roku, że GCC (przynajmniej w moich projektach i na moich maszynach) ma tendencję do generowania zauważalnie szybszego kodu, jeśli optymalizuję pod kątem rozmiaru ( -Os) zamiast prędkości ( -O2lub -O3), i od tego czasu zastanawiam się, dlaczego. Udało mi się stworzyć (raczej głupiutki) kod, …

1
Dlaczego kompilator Rust nie optymalizuje kodu, zakładając, że dwa zmienne odwołania nie mogą aliasu?
O ile mi wiadomo, aliasing odniesień / wskaźników może utrudniać kompilatorowi generowanie zoptymalizowanego kodu, ponieważ muszą one zapewnić, że wygenerowany plik binarny zachowuje się poprawnie w przypadku, gdy dwa odniesienia / wskaźniki faktycznie są aliasami. Na przykład w poniższym kodzie C void adds(int *a, int *b) { *a += *b; …

12
Jak skompilować Tensorflow z instrukcjami SSE4.2 i AVX?
Oto wiadomość otrzymana z uruchomienia skryptu, aby sprawdzić, czy Tensorflow działa: 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 tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 …

2
Co to jest operacja &&& w 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; } Dane wyjściowe powyższego programu skompilowane przy użyciu gccto 0 1 1 Z opcją -Walllub wydaje ostrzeżenie:-Waddressgcc warning: the address of …


4
Czy mogę wskazać optymalizatorowi, podając zakres liczby całkowitej?
Używam inttypu do przechowywania wartości. Zgodnie z semantyką programu, wartość zawsze zmienia się w bardzo małym zakresie (0 - 36) i int(nie a char) jest używana tylko ze względu na wydajność procesora. Wygląda na to, że na tak małym zakresie liczb całkowitych można przeprowadzić wiele specjalnych optymalizacji arytmetycznych. Wiele wywołań …

2
Dlaczego lambdy mogą być lepiej zoptymalizowane przez kompilator niż zwykłe funkcje?
W swojej książce The C++ Standard Library (Second Edition)Nicolai Josuttis stwierdza, że ​​kompilator może lepiej zoptymalizować lambdy niż zwykłe funkcje. Ponadto kompilatory C ++ optymalizują lambdy lepiej niż zwykłe funkcje. (Strona 213) Dlaczego? Pomyślałem, że jeśli chodzi o inlining, nie powinno już być żadnej różnicy. Jedynym powodem, dla którego mogłem …


2
Granice typu Nat w Shapeless
W bezkształtnym typ Nat reprezentuje sposób kodowania liczb naturalnych na poziomie typu. Jest to używane na przykład w przypadku list o stałym rozmiarze. Możesz nawet wykonać obliczenia na poziomie typu, np. Dołączyć listę Nelementów do listy Kelementów i otrzymać listę, która w czasie kompilacji zawiera N+Kelementy. Czy ta reprezentacja jest …


7
Dlaczego kompilator nie może (lub nie może) zoptymalizować przewidywalnej pętli dodawania do mnożenia?
To pytanie, które przyszło mi do głowy, czytając genialną odpowiedź Mysticial na pytanie: dlaczego szybciej jest przetwarzać posortowaną tablicę niż nieposortowaną ? Kontekst dla zaangażowanych typów: const unsigned arraySize = 32768; int data[arraySize]; long long sum = 0; W swojej odpowiedzi wyjaśnia, że ​​kompilator Intel (ICC) optymalizuje to: for (int …

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.