Инструкции с плавающей точкой в ​​x86 Разборка пакета PolyBench - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь подсчитать количество динамических инструкций с плавающей запятой, выполняемых ЦП, в двоичном файле, созданном GCC для 30 различных программ из теста Bench Poly, используя инструмент pin. Все плавающие инструкции в x86 находятся в категории X87_ALU согласно документации x86 Encoder-Decoder (XED).

По некоторым причинам я получаю его равным нулю для всех программ в отличие от всех других категорий командкак Binary, load, store, nop и т. д. Я разобрал бинарный файл с помощью objdump и не вижу ни одной строки с кодом операции, начинающимся с f.

Кроме того, я создал двоичные файлы веб-сборки (.wasm) длявсе программы, использующие emscripten (emcc), а затем преобразовали двоичный файл .wasm в разобранный файл .wat. В этих файлах я также не вижу никаких инструкций с плавающей запятой.

PS: Из поисков в Google, которые я выполняю, я понимаю, что x86 имеет совершенно другую единицу с плавающей запятой и обработку на основе стекадля этих. Может быть, я что-то упустил в этой области?

Есть ли какие-либо указания на то, как увидеть инструкции с плавающей запятой в разобранном двоичном файле?

1 Ответ

1 голос
/ 03 ноября 2019

Почти для всего современного кода FPU не используется, вместо этого используется скалярное SSE.

Причины использования FPU (а не скалярного SSE):

  • тот же двоичный файлдолжен поддерживать процессоры 20 лет назад, которые не поддерживают SSE. Это подразумевает, что это 32-разрядный код, а не 64-разрядный код (поскольку устаревшие для SSE процессоры также не поддерживают 64-разрядные).
  • использование SSE снижает производительность из-за увеличения затрат на переключение задач (стоимость сохранения / загрузки состояния SSE при переключении задач). Это не относится к большинству случаев;либо потому, что операционная система сохраняет / загружает состояние SSE независимо от того, использовалось оно или нет;или потому что SSE в любом случае используется для других целей (например, SIMD).
  • вам нужна расширенная точность 80-битной плавающей запятой. В большинстве случаев этого не происходит - существует небольшая ниша между «64-битным (или меньше) достаточно» и «80-битным недостаточно».
  • вам нужно делать такие вещи, как sin() и sqrt() или используйте BCD, но размер кода значительно важнее производительности. Это крайне маловероятно.
...