Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножение больших чисел, Оптимизация с помощью SSE2 
:(
    Опции темы
serious
Дата 27.5.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Необходимо перемножить 2 64-хбайтных числа с наименьшими временными затратами. Думаю умножать столбиком (возможно, быстрым столбиком). В случае быстрого столбика значения индексов для множителей буду брать из регистров SSE2, куда перед вызовом функции буду их загонять из буфера в памяти (все значения вычислены заранее). Может быть, в дальнейшем написать макрос, продублировать его тело 256 раз, развернув тем самым цикл.

Код

__asm {

    xor     ecx,  ecx               // счетчик цикла

    up:
    // TODO: Проверка операндов на 0.

    movdqa  xmm0, [multi_1 + ecx]       // загрузка 2-х пар множителей
    pshufd  xmm1, xmm0, 00010000b   // Ai, Ai+1 (A0 | A1 | A0 | A0)

    movdqa  xmm2, [multi_2 + ecx]       // загрузка 2-х пар множителей
    pshufd  xmm3, xmm2, 00010000b   // Bi, Bi+1 (B0 | B1 | B0 | B0)

    pmuludq xmm3, xmm1                     // пакетное умножение первых 2-х пар
                                                            // xmm3 = (A1*B1) | (A0*B0)

    pshufd  xmm4, xmm2, 00000001b   // Bi, Bi+1 (B0 | B1 | B0 | B1)
    pmuludq xmm4, xmm1                     // пакетное умножение оставшихся 2-х пар
                                                            // xmm4 = (B0*A1) | (A0*B1)

    add     ecx, 16                                  // смещение на 128 бит
    cmp     ecx, 256
    jnz     up
}


З.Ы. Тут правда я не дописал - можно ведь еще пару умножений сделать, но основная проблема у меня: как учитывать перенос, нет в SSE команды, аналогичной adc.

З.Ы.Ы. Еще была мысль написать макрос, в котором будут перемножаться 64-хбитные числа, но не знаю, как это может помочь в плане скорости...

З.Ы.Ы. Спрашивал на Васме, но тема затухла (((( Нейжели никого это не интересует (есть конечно всякие готовые библиотеки, но можно сделать быстрее!!!).


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Chingachguk
Дата 29.5.2005, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Спрашивал на Васме, но тема затухла ((((


Попробуй все же спрость еще раз ;) Например, STAS'а.

Я бы с удовольствием тебе помог, даже почитал книжку Е. Бердышева "Технология MMX...", но вот adc вроде бы нету. Чем тебя не устраивает умножение 32-х разрядных регистров или сопроцессор ? Какую задачу пытаешься решить ?


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
serious
Дата 30.5.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



2Chingachguk: Как раз эту задачу пытаюсь решить оптимальным способом! Я понимаю конешно, что так или иначе придется работать с 32-хбитными словами, но... в общем, пытаюсь написать макрос, который будет перемножать 128-битные числа (он включает в себя все те же элементарные умножения по 32 бита) с расчетом на будущее (потом его нужно будет просто заменить одной ассемблерной командой), но это довольно просто реализуется, проблема в сложении с переносом... Почему в Inel не придумали аналога ADC для более длинных чисел?!
Добавлено @ 16:29
Цитата(Chingachguk @ 28.5.2005, 16:47)
Попробуй все же спрость еще раз ;) Например, STAS'а.

Эт например как? Кричать, STAS, где ты? smile
Добавлено @ 16:33
Цитата(Chingachguk @ 28.5.2005, 16:47)
Какую задачу пытаешься решить ?

Операции в группе точек эллиптической кривой, проверка ЭЦП --> у меня VTune показывает, что на функцию умножения приходится более 60% процессорного времени, что не есть гуд.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.