Optymalizacja programu pod komputer na którym kompiluje się program

0

Witam,
chciałem się zapytać czy jeśli piszę program w C++ w VS na systemie Win7 (nie wiem, czy ma to znaczenie) to czy jest możliwość zoptymalizowania kodu pod konkretną maszynę (komputer) na którym kompiluje się program? Chodzi mi o automatyczną optymalizację w czasie kompilacji. Tak jak są różne optymalizacje typu: O1, O2, Ox to czy da się jakoś ustawić, by kompilator kompilował program optymalizując pod wykorzystywany procesor, pamięć RAM, płytę główną etc.?
Czy są w ogóle takie kompilatory/IDE?

Z góry dzięki za odpowiedź.

0

Każdy kompilator wykonuje optymalizację względem twojego CPU. Dlatego masz różne wersje kompilatorów pod różne architektury ;]

0
Shalom napisał(a):

Każdy kompilator wykonuje optymalizację względem twojego CPU. Dlatego masz różne wersje kompilatorów pod różne architektury ;]

No tak, ale czy to jest to samo co argument za Java/C#, które podobno mogą jakoś (?) optymalizować kod pod dane urządzenie?
Czyli jak skompiluję u siebie na komputerze program to będzie działać "optymalnie", ale jak go zainstaluję np. u kolegi to będzie działać już nieoptymalnie, bo nie był optymalizowany pod jego urządzenie?
Słyszałem, że można programować optymalizując pod dane urządzenie więc zastanawiam się, czy nie dałoby się zrobić tego jakoś automatycznie? Chodzi szczególnie o pewne obliczeniożerne procesy, które mogą trwać godzinami a nawet miesiącami...

0

Jest coś takiego jak JIT, wiec optymalizacja dla danego procesora może nastąpić jeszcze po kompilacji (rozwiązanie występuje nie tylko w Java i C#).
Poza tym, kompilator często ma dostępne ustawienia pozwalające na skonkretyzowanie docelowego procesora by poprawić optymalizację, a to trzeba doczytać już w dokumentacji danego kompilatora.

Co do płyty głównej to to już kwestia sterowników samej płyty oraz BIOS/UEFI i tu kompilator niewiele może zawojować.

0

@Wielki Lew po kolei bo mieszasz wiele różnych wątków.
Java / .NET ma JIT wiec może optymalizować kod w trakcie wykonania. Faktycznie może to zrobić jakieś optymalizacje względem aktualnego CPU, ale efekt będzie taki sam jak skompilowanie programu pod konkretną architekturę. Siłą JITa jest raczej fakt, że maszyna wirtualna może "zauważyć" optymalizacje których nie widać w trakcie kompilacji. Krótki przykład:

Wyobraź sobie że masz w kodzie gdzieś dzielenie. Wykonujesz je miliony razy w jakiejś wielkiej pętli. Nie da sie tego specjalnie optymalizować bo dzielnik nie jest znany na etapie kompilacji. Ale po uruchomieniu okazuje się, że dzielnik zwykle ustawia sie na 2. W przypadku języka natywnego niewiele można zrobic, bo kod maszynowy ma gołe dzielenie i tyle. Ale JIT może zauważyć że dzielnikiem jest 2 i zamiast dzielenia można sobie tą instrukcję zamienić na przesunięcie bitowe sprawiając że kod zaczyna śmigać wielokrotnie szybciej.

Jeśli chodzi o optymalizacje na poziomie kodu to dotyczą zwykle takich rzeczy jak rozmiary rejestrów procesora i cpu cache. Chodzi o to, żeby tak ustawiać dostęp do danych w pamięci żeby cały czas korzystać z cache, unikać cache-miss, unikać wielu zmian w jednej linii cache, unikać przełączania wątków między procesorami, żeby nie tracić cache, unikać false-sharing itd. To wymaga wiedzy o tym jakie cache ma rozmiary i czasem np. wpływa na to, że dodajesz wyrównanie do struktur danych żeby idealnie mieściły się w liniach cache. Tego właściwie nie da sie zrobić "automatycznie".

0

Czy są w ogóle takie kompilatory/IDE?
Jeśli napiszesz jakiś skrypt który rozpoznaje procka i na podstawie tego ustawia parametry kompilacji...

1 użytkowników online, w tym zalogowanych: 0, gości: 1