Войти
ПрограммированиеФорумОбщее

Отключить FPU (решено)

Страницы: 1 2 Следующая »
#0
15:06, 13 июля 2008

Нужно каким-то образом убедиться, что определённый участок программы не использует FPU.
Каким образом это можно реализовать?

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

upd:
всем спасибо.
остановился вот на таком решении:

void disableFpu()
{
  _controlfp(_EM_OVERFLOW, _MCW_EM);  
  __asm
  {
    fldpi
    fldpi
    fldpi
    fldpi
    fldpi
    fldpi
    fldpi
    fldpi
    wait
  }
}

void enableFpu()
{
  __asm
  {
    fcompp
    fcompp
    fcompp
    fcompp
  }
  _controlfp(_EM_INEXACT | _EM_DENORMAL, _MCW_EM);  
}

#1
15:09, 13 июля 2008

а может просто посмотреть ассемблер и сдеть Ctr+f на команды fld/fst ?

#2
15:15, 13 июля 2008

FROL
вообще да, можно заставить компилятор сгенерировать асмовский файл а потом автоматом искать операции с фпу =)
остаётся проблема - функции, которые вызываются из этих модулей тоже надо проверять.

этот кусок программы будет размером ~5000 строк, хочеться чего-нибудь более автоматического.

#3
15:16, 13 июля 2008

Можно полностью заполнить стек FPU, и включить исключение при переполнении стека FPU.
Любая операция с плавающей точкой начинается с помещения значения в стек FPU, а тут бац-исключение.
На всякий случай - присваивание двух float-ов или возврат числа с плавающей точкой из функции также задействует FPU.

#4
15:21, 13 июля 2008

Конишуа
>> Можно полностью заполнить стек FPU
кажется, подойдёт.

на всех х86 одинаковая глубина стека фпу?

#5
15:22, 13 июля 2008

Imp5
напиши программу на Python или Perl, которая ищет строки в asm файле с этими командами и выдает в качестве результата в какой-нибудь другой файл соответствующие им строки в cpp файлах. В asm файлах Visual Studio сохраняет как комменты соответствующие номера строк, так что это будет не сложно сделать.

а как исключение тебе поможет - я не очень понимаю.  Даже если твоя программа в рантайме падать с  сообщением "Using FPU instructions", то что тебе это дает?
другое дело, если нет ни одной из команд в asm файле, использующих стек FPU - тогда точно не используется.

#6
15:28, 13 июля 2008

FROL
>>а как исключение тебе поможет - я не очень понимаю.
Это нужно только на стадии разработки, чтобы убедиться, что таких операций нет.

#7
15:29, 13 июля 2008

Imp5
>>Это нужно только на стадии разработки, чтобы убедиться, что таких операций нет.
тогда тем более непонятно, зачем исключение в рантайме кидать

#8
15:45, 13 июля 2008

FROL
>>тогда тем более непонятно, зачем исключение в рантайме кидать
если я правильно понимаю, то ты предлагаешь ловить операции с фпу на стадии генерации кода?
у этого подхода есть минус - невозможно проверить, содержат ли вызываемые функции операции с фпу.

вот, например, случай:

..... a.cpp ........
void must_not_use_fpu()
{
  int a = 4;
  int b = some_function_in_dll(a);
}

...... some_dll.cpp ........
int some_function_in_dll(int a)    <<< черный ящик для внешнего мира, у меня вообще нет исходников этой библиотеки
{
  return sin(a) / float(a) + 1.1231f;
}


если у меня программа свалиться с ексепшеном, то я буду знать что в функции some_function_in_dll что-то не так и я не буду её использовать

#9
15:58, 13 июля 2008

Imp5
только если у тебя нет исходников всех частей проекта. в противном случае, можно искать по всем asm файлам.

#10
16:36, 13 июля 2008

Imp5
Просто интересно. А зачем?

#11
16:45, 13 июля 2008

есть кусок кода, который на всех х86 должен выдавать одинаковые результаты.
но так как в операциях с плавающей точкой нет единого стандарта, поцессоры интел и амд могут выдавать различные результаты.
поэтому для куска кода принято решение использовать фиксированную точку.
в связи с этим надо быть уверенным, что никакая из фунуций не использует фпу.

#12
16:52, 13 июля 2008

Imp5
>но так как в операциях с плавающей точкой нет единого стандарта
IEEE 754\854

#13
16:55, 13 июля 2008

Хм, с такой проблемой не встречался... В VS я не нашел этого, но как вариант скомпилить часть кода старым компилятором (например BC31) - там можно было выставлять Floating-point Emulation или None. Или просто скопировать оттуда сгенерированный ассемблерный листинг.

#14
16:57, 13 июля 2008

ffinder
это понятно, но вот как считать sin/cos каждый решает сам.
и ещё при каких-то операциях расхождения встречаются в последнем бите

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.