Re[2]: Быстрейший способ конвертации int в hex-строку
От: Аноним  
Дата: 03.10.06 15:41
Оценка:
S>А чем sprintf плох?
Он более чем в 100 раз медленнее самого быстрого представленного тут способа
Re[3]: Быстрейший способ конвертации int в hex-строку
От: remark Россия http://www.1024cores.net/
Дата: 03.10.06 16:20
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>А чем sprintf плох?

А>Он более чем в 100 раз медленнее самого быстрого представленного тут способа

Ещё есть boost::format... но мы лучше умолчим о его производительности


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Быстрейший способ конвертации int в hex-строку
От: Shmakov Россия  
Дата: 03.10.06 18:57
Оценка:
Если честно — все это хорошо, но возник вопрос.
А зачем производить 10М+ преобразование в hex-string-формат?
Может дело в проблеме архитектуры?
Re[7]: Быстрейший способ конвертации int в hex-строку
От: sc Россия  
Дата: 04.10.06 05:27
Оценка:
Здравствуйте, ДимДимыч, Вы писали:
<skipped>

Я думаю, что можно попробовать сделать быстрее, чем самый быстрый вариант (табл. 64K int-ов), если обрабатывать по 4 числа за раз.
Т.е. ф-ция примет примерно такой вид:
bool putLong(char *buffer, unsigned int n0, unsigned int n1, unsigned int n2, unsigned int n3)
{
    ;; далее псевдо-код))
    __asm{
        lea   eax, s_hexChars;
        mov   ebx, buffer;
        
        movd  mm0, n0;
        movd  mm1, mm0;

        psrld mm0, 16;          ;получили старшее dword
        pslld mm0, 2;           ;умношили на 4
        paddd mm0, eax;         ;получили адрес в таблице
        movd  mm0, [mm0];       ;как так сделать? загрузить в mm0 dword по адресу mm0

        pand  mm1, 0x0000ffff;  ;получили младшее dword (так тоже нельзя?)
        pslld mm1, 2;           ;умношили на 4
        paddd mm1, eax;         ;получили адрес в таблице
        movd  mm1, [mm1];       ;??? нужно загрузить в mm0 dword по адресу mm0
        psllq mm1, 32;          ;подвинули        
        por   mm0, mm1;         ;в mm0 результат

        movq  [ebx], mm0;       ;записали результат

        ;; тоже самое для n1, n2, n3 где будут задейстованы регистры mm2/mm3, mm4/mm5, mm6/mm7
        ;; результат класть  movq [ebx+8], mm2  и т.д.        
    }
}

цикл тогда примет примерно такой вид:
for(int i=0; i<1000000 / 4; i += 4)
    putLong(buff, i, i + 1, i + 2, i + 3);

возможно процессор выполнит часть инструкций параллельно (если их правильно перемешать)), типа:
чтение
выполнение--чтение
запись------выполнение--чтение
------------запись------выполнение--чтение
------------------------запись------выполнение
------------------------------------запись
насколько я понял из мануалов, чтение не может выполняться паралелльно чтению (и запись тоже)
а вот чтение/запись паралелльно выполняться может
Re[8]: Быстрейший способ конвертации int в hex-строку
От: Аноним  
Дата: 04.10.06 05:36
Оценка:
т.е. я имел ввиду, ускорить самый быстрый вариант)
Re[7]: Быстрейший способ конвертации int в hex-строку
От: MaximE Великобритания  
Дата: 04.10.06 07:01
Оценка:
ДимДимыч wrote:

> С>Гораздо проще попытаться использовать расширенные наборы инструкций

> (MMX, SSE, SSE2).
>
> Вот вариант с MMX, который у меня работает на 13% быстрее, чем в
> исходном <Message.aspx?mid=2138136&only=1> посте:

[]

Интересно было бы получить этот код в виде, удобоваримом для gcc, чтобы вставить
его в тест.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[7]: Быстрейший способ конвертации int в hex-строку
От: MaximE Великобритания  
Дата: 04.10.06 07:06
Оценка:
ДимДимыч wrote:

> С>Гораздо проще попытаться использовать расширенные наборы инструкций

> (MMX, SSE, SSE2).
>
> Вот вариант с MMX, который у меня работает на 13% быстрее, чем в
> исходном <Message.aspx?mid=2138136&only=1> посте:

Как он в сравнении с
http://groups.google.co.uk/group/comp.lang.asm.x86/msg/97df4e371eab3636
?

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[8]: Быстрейший способ конвертации int в hex-строку
От: ДимДимыч Украина http://klug.org.ua
Дата: 04.10.06 14:18
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Как он в сравнении с

ME>http://groups.google.co.uk/group/comp.lang.asm.x86/msg/97df4e371eab3636
ME>?

Да, этот код быстрее моего.
Вот, я его портировал на gcc inline asm:

inline void mmx_init(void)
{
    static const unsigned long long consts[3] = 
    {
    0x3030303030303030LL,
    0x0f0f0f0f0f0f0f0fLL,
    0x0909090909090909LL
    };

    __asm__ __volatile__
    (
    "emms            \n"
    "movq (%0),  %%mm3    \n"
    "movq 8(%0),%%mm2    \n"
    "movq 16(%0), %%mm4    \n"
    : : "r" (consts)
    );
}


inline void bin2hex_mmx(char *buffer, unsigned int value)
{
    __asm__  __volatile__
    (
    "movl %0,%%eax        \n"
    "bswap %%eax        \n"

    "movq %%mm3,%%mm5    \n"

        "psubb %%mm4,%%mm5    \n"
        "movd %%eax, %%mm0    \n"
        "movq %%mm0,%%mm1    \n"
        "psrlq $4, %%mm0    \n"
        "pand %%mm2,%%mm0    \n"
        "pand %%mm2,%%mm1    \n"
        "punpcklbw %%mm1,%%mm0    \n"
        "movq %%mm0,%%mm1    \n"
        "pcmpgtb %%mm4,%%mm0    \n"
        "pand %%mm5,%%mm0    \n"
        "paddb %%mm3,%%mm1    \n"
        "paddb %%mm0,%%mm1    \n"
        "movq %%mm1,(%1)    \n"

    : :  "r" (value), "r" (buffer) : "eax"
    );
}


Но как оказалось, исходный вариант с таблицей, если его заинлайнить, работает еще быстрее этого
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Быстрейший способ конвертации int в hex-строку
От: trophim Россия  
Дата: 04.10.06 22:03
Оценка: :)
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


S>>>А чем sprintf плох?

А>>Он более чем в 100 раз медленнее самого быстрого представленного тут способа

R>Ещё есть boost::format... но мы лучше умолчим о его производительности


R>


А я уже помидоры заготовил. Мягонькие такие — больно не будет...
[EOF]
Let it be! — Давайте есть пчелу!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.