Arhn - архитектура программирования

_ftol2_sse, есть более быстрые варианты?

У меня есть код, который вызывает много

int myNumber = (int)(floatNumber);

который занимает в общей сложности около 10% моего процессорного времени (согласно профилировщику). Хотя я мог бы оставить все как есть, мне интересно, есть ли более быстрые варианты, поэтому я попытался поискать и наткнулся на

http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/ http://stereopsis.com/FPU.html

Я попытался реализовать приведенную здесь функцию Real2Int (), но она дает неверные результаты и работает медленнее. Теперь мне интересно, есть ли более быстрые реализации для преобразования значений double / float в целые числа, или версия SSE2 работает так же быстро, как и получается? Страницы, которые я нашел, немного устарели, поэтому они могут быть просто устаревшими, а более новый STL работает быстрее.

Текущая реализация:

013B1030  call        _ftol2_sse (13B19A0h)

013B19A0  cmp         dword ptr [___sse2_available (13B3378h)],0  
013B19A7  je          _ftol2 (13B19D6h)  
013B19A9  push        ebp  
013B19AA  mov         ebp,esp  
013B19AC  sub         esp,8  
013B19AF  and         esp,0FFFFFFF8h  
013B19B2  fstp        qword ptr [esp]  
013B19B5  cvttsd2si   eax,mmword ptr [esp]  
013B19BA  leave  
013B19BB  ret  

Связанные вопросы, которые я нашел:

Быстрое смещение к int преобразование и точность с плавающей запятой на ARM (iPhone 3GS / 4)

Какой самый быстрый способ конвертировать float в int на x86

Поскольку оба они старые или основаны на ARM, мне интересно, есть ли современные способы сделать это. Обратите внимание, что в нем говорится, что лучшее преобразование - это такое, которого не происходит, но оно мне нужно, поэтому это будет невозможно.

06.03.2013

Ответы:


1

Это будет сложно превзойти, если вы ориентируетесь на обычное оборудование x86. Среда выполнения не знает наверняка, есть ли на целевой машине модуль SSE. Если бы это было так, он мог бы делать то, что делает компилятор x64, и вставлять код операции cvttss2si. Но поскольку среда выполнения должна проверять, доступен ли модуль SSE, остается текущая реализация. Вот что делает реализация ftol2_sse. Более того, он передает значение в регистр x87, а затем передает его в регистр SSE, если модуль SSE доступен.

Вы можете указать компилятору x86 целевую машину с модулями SSE. Тогда компилятор действительно выдал бы простой встроенный cvttss2si код операции. Это будет максимально быстро. Но если вы запустите код на более старой машине, он потерпит неудачу. Возможно, вы могли бы предоставить две версии: одну для машин с SSE, а другую - без.

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

Чтобы изменить настройки компилятора из IDE, используйте «Проект»> «Свойства»> «Свойства конфигурации»> «C / C ++»> «Генерация кода»> «Включить расширенный набор команд». В командной строке это / arch: SSE или / arch: SSE2.

06.03.2013

2

Для double я не думаю, что вы сможете значительно улучшить результаты, но если у вас есть много float для преобразования, которое может помочь с помощью упакованного преобразования, следующий код nasm:

global _start

section .data
  align 16
  fv1:  dd 1.1, 2.5, 2.51, 3.6

section .text
  _start:

  cvtps2dq  xmm1, [fv1] ; Convert four 32-bit(single precision) floats to 32-bit(double word) integers and place the result in xmm1 

Должен быть внутренний код, который позволяет вам делать то же самое более простым способом, но я не так хорошо знаком с использованием встроенных библиотек. Хотя вы не используете gcc, эта статья Авто-векторизация с помощью gcc 4.7 открывает глаза на то, насколько это сложно. можно заставить компилятор генерировать хороший векторизованный код.

06.03.2013

3

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

Это также означало бы, что ABI также оптимизирован для SSE; и что вы можете векторизовать вычисления, когда они доступны, а также что логика управления оптимизирована для архитектуры.

Кстати. даже последовательность FLD; FIST не должна занимать больше ~ 7 тактов на Pentium.

06.03.2013
  • Вам нужно изменить режим округления, чтобы получить правильное усечение. Насколько я знаю, изменение слова состояния x87 происходит медленно. 06.03.2013
  • Комментарий @infact является точным 06.03.2013
  • Хорошая точка зрения. Тогда имеет смысл не менять слово состояния часто. 06.03.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..