На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Использование 128 бит FPU на C# , MULSS, DIVSS, SQRTSS etc
    Жил спокойно, работал в старом BCB6, потом узнал, что современные процессоры давно поддерживают 128 битную арифметику с плавающей точкой и даже корни умеют брать (например, MULSS, DIVSS, SQRTSS из набора команд SSE Intel).

    Какие есть наиболее короткие пути перекомпилировать готовый код под Windows API, чтобы арифметика выполнялась на 128 битном FPU?
      Под 128-битностью вы, небось, подразумеваете 4 раза по 32 бита!? А тогда сто́ит ли оно того, чтобы искусственно переводить на эти рельсы имеющийся код? В самом среднем случае - крайне сомнительно. :yes-sad:
        Цитата BenGan @
        современные процессоры давно поддерживают 128 битную арифметику с плавающей точкой
        Даже распространённые 64-битные плавающие (двойная точность) зачастую имеют избыточную точность, а тут сразу четверная. Эти числа предназначены, в основном, для решения плохо обусловленных задач. Повышение точности в этом случае позволяет немного отодвинуть наступление численной неустойчивости. Для обычных задач хватает двойной, а часто даже одинарной точности.
          Если речь идёт о о четверной точности, которая описана, например, в стандарте IEEE 754
          https://en.wikipedia.org/wiki/Quadruple-pre...ng-point_format
          то аппаратной поддержки такой арифметики нет (кроме IBM POWER9 и древних мэйнфреймов)

          Некоторые компиляторы операции с такими числами поддерживают, но софт-эмуляция, конечно, намного медленнее

          Цитата
          Ряд компиляторов, в том числе GCC (с версии 4.0, 2010[5]), IBM XL (10.1[5]), Intel, позволяет использовать числа точности "Quadruple" в программах на языках C/C++ и Fortran (например как тип __float128[6], long double, REAL*16), реализуя вычисления над ними программно, на 1-2 порядка более медленно, чем с точностью, поддерживаемой аппаратно


          А SSE, как Славян уже сказал, это совсем другое - параллельная обработка нескольких float или double.
            Да меня не точность привлекает, а корень одной командой (уж не знаю, сколько он тактов).
            Считается молекулярная механика, вычисление расстояния между взаимодействующими атомами - большая доля трудозатрат процессора (а там как раз корень).

            Цитата
            Под 128-битностью вы, небось, подразумеваете 4 раза по 32 бита!?

            Я почему-то уверен, что не обязательно загружать все 128 бит, можно и обычные double скормить FPU.

            Цитата
            А тогда сто́ит ли оно того, чтобы искусственно переводить на эти рельсы имеющийся код?

            Да, похоже, одним кликом не получится.

            А современные версии C++ Builder от Embarcadero Technologies не имеют настроек компиляции с использованием расширенного (по сравнению с X86) набора команд?
              Корень одной командой считался и на FPU x87, причём с лучшей точностью, чем в SSE (хотя, возможно, это относится только к RSQRT).
              В SSE можно посчитать 4 корня одновременно.

              64-разрядная компиляция использует SSE арифметику, а не FPU. Однако, как я понял, требуется распараллеливание вычислений.
              Умеет ли компилятор Билдера это сам делать - не знаю. Кажется, там можно использовать CLANG.
              Но как оно по сравнению с компиляторами, умеющими делать продвинутую автоматическю оптимизация - не скажу.
                Цитата
                Однако, как я понял, требуется распараллеливание вычислений.

                Нет, к распараллеливанию я пока не готов, более банальные вопросы не решены.
                Цитата
                Корень одной командой считался и на FPU x87, причём с лучшей точностью...

                Как я понял, по результатам обсуждения, пока достаточно будет посмотреть на критичные фрагменты кода на ассемблере, что-то мне кажется, BCB6 корень считает через ряд.
                  >Нет, к распараллеливанию я пока не готов
                  Толковый компилятор сам распараллелит, например, такой цикл

                  ExpandedWrap disabled
                    for (i=0; i < 1024; i++)
                       B[i] = sqrt(A[i])



                  >мне кажется, BCB6 корень считает через ряд
                  Нет, через FSQRT. Можно поставить точку останова в нужном месте кода и Ctrl-Alt-C покажет асм
                    Цитата
                    Нет, через FSQRT. Можно поставить точку останова в нужном месте кода и Ctrl-Alt-C покажет асм

                    Спасибо!
                      А покажите критический по времени кусок кода - может быть, что-то можно будет более конкретно посоветовать
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0349 ]   [ 16 queries used ]   [ Generated: 28.03.24, 15:00 GMT ]