2014-11-21 17 views
5

Mam problem z tym, że optymalizator wydaje się usuwać linie kodu, które są niezbędne. Niektóre tła: Mam program, który łączy ze sobą sterownik PCIe. Mam wskaźnik liczbowy UINT32 *bar_reg;, który wskazuje na adres przestrzeni użytkownika rejestru BAR, z którym się komunikuję. Aby napisać do rejestru, po prostu odwołuję się do wskaźnika. *(bar_reg + OFFSET) = value;Optymalizator usuwania linii odwijających wskaźnik

Bez optymalizacji działa to dobrze. Jednak zaraz po włączeniu dowolnego poziomu optymalizacji usuwane są wszystkie linie, które odwołują się do wskaźnika. Sposób, w jaki to odkryłem, polegał na przejściu przez Visual Studio. Jednak zdarza się to niezależnie od platformy. Do tej pory udało mi się uzyskać optymalizację, ale ktoś, kto używa mojego kodu bibliotecznego w Linuksie, chce teraz włączyć optymalizację. Więc jestem ciekawy, dlaczego ten problem występuje i jaka jest najrozsądniejsza naprawa/obejście problemu.

+0

Zoptymalizowany kod zachowuje się inaczej, zwykle ze względu na niezdefiniowane zachowanie. –

Odpowiedz

6

Użyj słowa kluczowego volatile, aby zapobiec optymalizacji tej zmiennej.

Na przykład:

volatile UINT32 *bar_reg; 

Problem jest to, że kompilator zakłada, że ​​skoro pamięć nie jest dostępne w programie, to oznacza to, że pamięć pozostanie na niezmienionym poziomie, a więc może spróbować zoptymalizować niektóre z pism do tej pamięci.

2

Problem, który napotykasz, polega na tym, że as-if rule umożliwia optymalizatorowi przekształcenie kodu w dowolny sposób, o ile nie wpływa to na obserwowalne zachowanie programu.

Więc jeśli piszesz tylko do zmiennej, ale nigdy nie używasz jej w swoim programie, optymalizator uważa, że ​​nie istnieje obserwowalne zachowanie i zakłada, że ​​może skutecznie zoptymalizować zapis.

W Twoim przypadku dane są obserwowane spoza programu i sposób poinformować o tym kompilator i Optimizer jest przez volatile kwalifikacjach, cppreference mówi nam (kopalnia nacisk będzie forwrd):

obiekt, którego typem jest volatile kwalifikowany, lub obiekt podrzędny obiektu ulotnego lub zmienny obiekt podrzędny obiektu niestabilnego. Każdy dostępu (odczytu lub zapisu, członek wywołanie funkcji, etc.) na lotny obiekt jest traktowany jako widoczny efekt uboczny dla celów optymalizacji [...]

odsyłającym jak, jeśli reguła jest określone w projekcie C++ standard w przekroju 1.9 który mówi:

[...] Przeciwnie, zgodne implementacje są będą naśladować (tylko) OB ervable zachowanie abstrakcyjnej maszyny, jak wyjaśniono poniżej.

i względem as-jeśli reguła lotny jest również objęte w sekcji 1.9 i mówi:

Dostęp do lotnych obiektów oceniane są ściśle według reguł abstrakcyjnej maszynie .

Powiązane problemy