yigal_s: (general)
[personal profile] yigal_s
Valgrind is in essence a virtual machine using just-in-time (JIT) compilation techniques, including dynamic recompilation. Nothing from the original program ever gets run directly on the host processor. Instead, Valgrind first translates the program into a temporary, simpler form called Intermediate Representation (IR), which is a processor-neutral, SSA-based form. After the conversion, a tool (see below) is free to do whatever transformations it would like on the IR, before Valgrind translates the IR back into machine code and lets the host processor run it. Even though it could use dynamic translation (that is, the host and target processors are from different architectures), it doesn't. Valgrind recompiles binary code to run on host and target (or simulated) CPUs of the same architecture.

Мне стыдно, что не знал этого раньше. Эти черти перехватывают каждое обращение к памяти, на уровне базовой платформы инструментации (под которую можно писать клиенты-плагины), после чего поиск data-races - вполне решаемая задача, что собственно, уже и имплементировано. О всякой прочей фигне, вроде поиска дедлоков, мемликов и говорить не приходится. До кучи, решаются задачи поиска обращений к непроинициализированной памяти и выхода за пределы памяти проаллоцированной. Вот так. Одним махом.

Еще, правда, не понятно как они делают на этой платформе профайлер, раз уж они пределывают весь код процесса. Неужели же эмулируют конвеер процессора? ))).

Date: 2013-08-04 04:40 pm (UTC)
From: [identity profile] igor-abramov.livejournal.com
Если мы программируем на C/C++ мало чем можем влиять на конвееры, потому, что компилятор весьма агрессивно переупорядочивает код. (За очевидными исключениями, когда мы используем asm директивы, ну и некоторые интринсики могут необосновано смутить кодогенератор).

Улучшенные интелом версии gcc одно время давали выигрыш процентов до 20. Вроде gcc и clang прибавили в последнее время, но я не изучал текущее положение дел.

Вот за чем можно следить, так это за локальностью и порядком обращений к памяти. Правильно разложенные (и выровненные) поля в структурах данных, возможно, даже поля следующие в порядке обращения к ним в самом типичном случае.

Date: 2013-08-04 05:15 pm (UTC)
From: [identity profile] igor-abramov.livejournal.com
Чисто теоретически, да, такая аномалия возможна, особенно на уже изрядно прооптимизированном коде.
Ну на этот случай есть Intel Vtune . Я его очень успешно использовал для оптимизации кода, генерируемого Just-In-Time.

Date: 2013-08-04 09:29 pm (UTC)
From: [identity profile] igor-abramov.livejournal.com
Фишка в том, что Vtune строит весьма точный профиль но под конкретный процессор. А вот процессоры разных микроархитектур от интела (про АМД не вспоминаем, но так уж давно и это было очень актуально) умеют отличаться, и в некоторых областях (достаточно экзотических, правда) очень сильно.

И вот в ситуации, когда мне нужно профильнуть код относительно многих процессорных семейств, в том числе и не вышедших, штука типа Valgrind может оказаться более полезной.
Edited Date: 2013-08-04 09:30 pm (UTC)