На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> SSE (SSE42, SSE41, SSSE3, SSE3, SSE2, SSE1)
    Подскажите фреймворк \ библиотеку которая будет на базе SSE (SSE42, SSE41, SSSE3, SSE3, SSE2, SSE1) проверять строку на равенство, а так же работать арифметическими операциями. А ля strcmp("StringA", "StringB") И SumAdd(20349, 54356)

    Самый главный аспект, именно если процессор не поддерживает SSE42 и SSE41 то он бы использовать версию ниже
    Сообщение отредактировано: Няшик -
      Няшик, зачем это? Современные компиляторы и так используют SSE, для некоторых нужно указать соответствующий ключ.
        Мне нужно написать плагин, к другому языку что бы использовать возможности SSE там. По этому мне этот функционал нужен.


        Сам язык - интерпретатор, и должен работать на всех процессорах в штатном режиме
            Цитата MBo @


            Проблема в том, что не у всех на компьютере есть 41 а уж тем более 42 как у меня... Вот по этому я и задался вопросом есть ли готовый функционал, который бы в себе содержал пометки в зависимости от того, какой SSE последний поддерживается

            Ну действительно <_< Не плевать же на всех, у кого SSE41 и выше не поддерживается


            А тот пример я видел, и на гите сидел не мало в поисках решений.
              Няшик, cpuid в помощь.

              Добавлено
              И еще инфа к размышлению:
              https://habrahabr.ru/company/intel/blog/133962/
                Цитата shm @
                cpuid в помощь.


                Да ладно! :sarcasm: Серьёзно??? :blink:

                Я прекрасно понимаю, и знаю как определять какой процессор какие команды поддерживает SSE

                Вопрос был не в этом, а в том - есть ли инструментарий который умеет работать со всеми SSE в зависимости поддерживаемого процессора


                Важно, что бы он работал от последней 4.2 если поддерживает процессор, если Не поддерживает, а поддерживает к примеру SSSE3 то переключался на этот функционал.

                Или хотя бы есть заготовки реализаций ??? Сравнения к примеру, а то я не вдупляю как к примеру 16 байт сверять например на SSSE3 или на SSSE1

                Список команд просто зашкаливает на уровне верёвки и стула со сломанной ножкой чтоб наверняка.

                Что бы разобраться что к чему, уйдёт неделя если не две, с учётом того что займа по горлу ещё
                  Берём Intel Compiler, включаем оптимизацию, и он сам со всем разбирается. В частности он не будет включать векторизацию, если не сочтёт её уместной.
                    Qraizer, я ему это предложил в посте #2.
                      И что??? Он разве сможет под SSE собрать данный код??? Что бы там сравнивала по 16 байт. Или всё таки нужно с какой - то хитростью писать код?

                      ExpandedWrap disabled
                        bool IsCmp( const char* s1,  const char *s2)
                        {
                            while (*s1&&*s2)
                                if (*s1++!=*s2++)
                                    return false;
                            return true;
                        }
                        Цитата Няшик @
                        Он разве сможет под SSE собрать данный код

                        1. может.
                        2. функция IsCmp неправильна и не оптимальна.
                          Цитата shm @
                          1. может.


                          Можете предоставить asm листинг ?

                          Цитата shm @
                          2. функция IsCmp неправильна и не оптимальна.



                          Вот видите, сложно написать правильную функцию на языке - с которым мало знаком.

                          По этому я и хотел взять фреймворк, а не каруселить с 400 разными макросами выстраивая нужный код, который опять будет неправильным и не оптимальным из за соображений правильности и оптимальности
                            Цитата Няшик @
                            Подскажите фреймворк \ библиотеку которая будет на базе SSE (SSE42, SSE41, SSSE3, SSE3, SSE2, SSE1) проверять строку на равенство...
                            Самый главный аспект, именно если процессор не поддерживает SSE42 и SSE41 то он бы использовать версию ниже

                            Цитата Няшик @
                            а то я не вдупляю как к примеру 16 байт сверять например на SSSE3 или на SSSE1

                            Никто "не вдупляет", точнее говоря "вдупляет", но приходит к выводу, что это не дает никакого или, по крайней мере существенного, выигрыша по сравнению с оптимальной реализацией strcmp на РОН (регистрах общего назначения). Поэтому великий оптимизатор и знаток тонкостей реальных микроархитектур x86 - Агнер Фог в последней версии своей asmlib использует только два варианта strcmp - либо SSE 4.2 (если поддерживается), либо простой\универсальный вариант на РОН.

                            PS: Если ты считаешь, что сравнение по 16 байт дает выигрыш до 16 (или около того раз) по сравнению с "примитивным" побайтовым поиском, то ты глубоко ошибаешься. Чудес в природе не бывает - если стандартная strcmp должна 1) сравнивать С-строки с замыкающим нулем (т.е. заранее неизвестной длины), 2) выдавать не бинарный результат равно\не_равно, а тринарный равно\больше\меньше, то после быстрого хардварного сравнения 16 байт нужно еще 1) в случае равно определить, нет ли в этих 16 байтах замыкающего нуля, 2) в случае не_равно определить байт, в котором не_равно и соотв-но выдать результат больше\меньше. Поэтому согласно мануалу того же Intel (и исследованиям А.Фога) латентность операций PSTRICMPx с операндами в регистрах составляет аж 10-15 тактов в зависимости от модели проца. В то же время современные процы при работе с РОН могут выполнять за 1 такт 2 загрузки из памяти и до 3 арифметических операций и условных переходов (всего не более 4-х операций за такт). В итоге оптимизированное сравнение строк на РОН получается не в 16 раз медленнеe SSE 4.2, а существенно меньше, а про прочие SSE-минус и говорить нечего.
                            К тому же, если ты говоришь о неких стандартных фреймворках \ библиотеках (а не о самопальной реализации на SSE 4.2), то при чтении по 16 байт они должны обеспечивать защиту от AV при выходе за границу 4К страницы, что требует дополнительных накладных расходов на проверку пересечения очередным 16-байтным блоком границы 4К (см.пример в мануале по оптимизации от Intel). Это еще более снижает выигрыш от SSE по сравнению с побайтным чтением.

                            PPS: Если же копать в глубь истории SSE, то следует иметь в виду, что в "древних" моделях с первыми SSE, во-первых, невыравненное чтение 16 байт (movdqu) было существенно медленнее выравненного (movdqa), поэтому приходилось использовать дополнительные нехилые навороты для проверки и обеспечения выравнивания адресов, во-вторых, поддержка технологий SSE (и AVX) вводилась до того, как обеспечивалась их полная аппаратная поддержка, т.е. 16 байтные операнды обрабатывались по частям как два 8-байтных, что снижало их эффективность и выигрыш по сравнению с аналогичными операциями меньшей разрядности. Поэтому и нет смысла использовать для сравнения строк версии SSE ниже 4.2 - геморроя много, а толку мало
                            Сообщение отредактировано: leo -
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


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