Денормализованная плавающая точка в Objective-C? - PullRequest
7 голосов
/ 19 февраля 2012

Какое значение имеет вопрос / ответ переполнения стека Почему изменение от 0,1f до 0 замедляет производительность в 10 раз? для Objective-C?Если есть какое-либо отношение, как это должно изменить мои привычки кодирования?Есть ли какой-нибудь способ отключить денормализованные числа с плавающей запятой в Mac OS X?

Кажется, что это совершенно не имеет отношения к iOS.Это правильно?

1 Ответ

16 голосов
/ 19 февраля 2012

Как я уже сказал в ответ на ваш комментарий:

это больше процессор, чем проблема языка, поэтому, вероятно, имеет актуальность для Objective-C на x86. (iPhone ARMv7 не поддерживает денормализованные числа с плавающей запятой, по крайней мере, со стандартными настройками времени выполнения / сборки)

Обновление

Я только что проверил. В Mac OS X на x86 наблюдается замедление, на iOS на ARMv7 это не так (настройки сборки по умолчанию).

И, как и следовало ожидать, при работе на симуляторе iOS (на x86) снова появляются денормализованные поплавки.

Интересно, что FLT_MIN и DBL_MIN соответственно определены для наименьшего неденормированного числа (в iOS, Mac OS X и Linux). Странные вещи происходят с использованием

DBL_MIN/2.0

в вашем коде; компилятор успешно устанавливает денормализованную константу, но как только процессор (arm) прикасается к нему, он устанавливается в ноль:

double test = DBL_MIN/2.0;
printf("test      == 0.0 %d\n",test==0.0);
printf("DBL_MIN/2 == 0.0 %d\n",DBL_MIN/2.0==0.0);

Выходы:

test      == 0.0 1  // computer says YES
DBL_MIN/2 == 0.0 0  // compiler says NO

Так что быстрая проверка времени выполнения, если поддерживается денормализация, может быть:

#define SUPPORT_DENORMALIZATION ({volatile double t=DBL_MIN/2.0;t!=0.0;})

(«дано даже без подразумеваемой гарантии пригодности для любых целей»)

Вот что ARM должен сказать в режиме сброса в ноль: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204h/Bcfheche.html

Обновление << 1 </strong>

Вот как вы отключаете режим сброса в ноль на ARMv7:

int x;
asm(
    "vmrs %[result],FPSCR \r\n"
    "bic %[result],%[result],#16777216 \r\n"
    "vmsr FPSCR,%[result]"
    :[result] "=r" (x) : :
);
printf("ARM FPSCR: %08x\n",x);

со следующим неожиданным результатом.

  • Столбец 1: число с плавающей запятой, деленное на 2 для каждой итерации
  • Колонка 2: двоичное представление этого числа с плавающей точкой
  • Столбец 3: время, необходимое для суммирования этого числа с плавающей точкой 1 * 7 раз

Вы можете ясно видеть, что денормализация происходит с нулевой стоимостью. (Для iPad 2. На iPhone 4 он стоит 10% замедления).

0.000000000000000000000000000000000100000004670110: 10111100001101110010000011100000 110 ms
0.000000000000000000000000000000000050000002335055: 10111100001101110010000101100000 110 ms
0.000000000000000000000000000000000025000001167528: 10111100001101110010000001100000 110 ms
0.000000000000000000000000000000000012500000583764: 10111100001101110010000110100000 110 ms
0.000000000000000000000000000000000006250000291882: 10111100001101110010000010100000 111 ms
0.000000000000000000000000000000000003125000145941: 10111100001101110010000100100000 110 ms
0.000000000000000000000000000000000001562500072970: 10111100001101110010000000100000 110 ms
0.000000000000000000000000000000000000781250036485: 10111100001101110010000111000000 110 ms
0.000000000000000000000000000000000000390625018243: 10111100001101110010000011000000 110 ms
0.000000000000000000000000000000000000195312509121: 10111100001101110010000101000000 110 ms
0.000000000000000000000000000000000000097656254561: 10111100001101110010000001000000 110 ms
0.000000000000000000000000000000000000048828127280: 10111100001101110010000110000000 110 ms
0.000000000000000000000000000000000000024414063640: 10111100001101110010000010000000 110 ms
0.000000000000000000000000000000000000012207031820: 10111100001101110010000100000000 111 ms
0.000000000000000000000000000000000000006103515209: 01111000011011100100001000000000 110 ms
0.000000000000000000000000000000000000003051757605: 11110000110111001000010000000000 110 ms
0.000000000000000000000000000000000000001525879503: 00010001101110010000100000000000 110 ms
0.000000000000000000000000000000000000000762939751: 00100011011100100001000000000000 110 ms
0.000000000000000000000000000000000000000381469876: 01000110111001000010000000000000 112 ms
0.000000000000000000000000000000000000000190734938: 10001101110010000100000000000000 110 ms
0.000000000000000000000000000000000000000095366768: 00011011100100001000000000000000 110 ms
0.000000000000000000000000000000000000000047683384: 00110111001000010000000000000000 110 ms
0.000000000000000000000000000000000000000023841692: 01101110010000100000000000000000 111 ms
0.000000000000000000000000000000000000000011920846: 11011100100001000000000000000000 110 ms
0.000000000000000000000000000000000000000005961124: 01111001000010000000000000000000 110 ms
0.000000000000000000000000000000000000000002980562: 11110010000100000000000000000000 110 ms
0.000000000000000000000000000000000000000001490982: 00010100001000000000000000000000 110 ms
0.000000000000000000000000000000000000000000745491: 00101000010000000000000000000000 110 ms
0.000000000000000000000000000000000000000000372745: 01010000100000000000000000000000 110 ms
0.000000000000000000000000000000000000000000186373: 10100001000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000092486: 01000010000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000046243: 10000100000000000000000000000000 111 ms
0.000000000000000000000000000000000000000000022421: 00001000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000011210: 00010000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000005605: 00100000000000000000000000000000 111 ms
0.000000000000000000000000000000000000000000002803: 01000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000001401: 10000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...