На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> xmm регистры и SSE2
    Цитата

    Ну не знаю, от тебя ответы на почту дублируются и на форуме они некоторое врямя были видны (я же тебя цитировал). Может быть ты случайно у своих сообщений кнопку "Удалить" нажал раза 3-4 подряд?

    Когда я первый раз отправил сообщение оно не появилось, потом когдя я начал вставлять его кусками оно то появлялось то снова исчезало...А потом появилось одно огромное сообщение со всеми добавлениями... конечно пришлось пару раз удалить...Какой то глюк.

    Вот обновленные результаты.После обновления ваш метод стал значительно быстрее.
    Ndmm2my
    1024X10240.7550.797
    2048X20485.5326.468
    4096X409639.16164.210


    Код своего блочного метода я прикрепил к письму. Так и не получается его сюда вставить.

    leo, я попробовал ваши варианты строчного блокирования. Оба они оказались хуже чем вариант с квадратными блоками одного размера.Вот результаты для той же задачи с N = 4032:
    1) Размер блока = 8(Это когда 8 строк матрицы A умножаются на 8 строк матрицы B) Время = 89.4
    2) Размер блока = 14 (Это когда полоска матрицы B умножаеся на всю матрицу A) Время = 81.3
    Поясню как я вычислял размер блока. При N = 4032 каждая строка будет занимать 4032*8 = 32256 байт. Как вы писали, во 2-ом случае размер блока нужно брать почти на весь размер L2,оставив место под 2 строки A и несколько линеек C. При L2 = 512 000, память, необходимая для хранения блока B = L2 -2*32256 = 447488. Размер блока = 447478/32256 = 13.8
    Значит дело здесь не в работе ХВП а в чем то другом. Я думаю стоит посмотреть в сторону оптимизированных библиотек BLAS, таких как Atlas,MKL,GOTOBlas и др. Какие они используют схемы блокирования и как вообще они там выбирают размеры блоков. На затравку вот нашел статью ведущего инженера Intel MKL Грега Генри. Там, в частности пишется что блокирование нужно осуществлять на всех уровнях иерархии памяти, на каждом переходе от менее скоростной памяти к более скоростной.
    Сообщение отредактировано: vitaly333 -

    Прикреплённый файлПрикреплённый файлBlockMult.rar (1.6 Кбайт, скачиваний: 112)
      Цитата
      но есть ведь более перспективный путь
      Какой? Использовать алгоритмы типа Штрасcена?
      Сообщение отредактировано: vitaly333 -
        Цитата

        Да, использовать алгоритмы со сложностью ō(N3).

        Можно попробывать, но это совсем другой путь. Хотелось бы сначала разобратся с блочными алгоритмами, ориентированными на кэш.

        albomНе могли бы вы протестировать два варианта строчного блокирования, которые предлагал товарищ leo, а то после странных результов с Intel MKL я своей машине уже не доверяю. Код обоих методов в атаче. Для замеров времени можно взять ф-ию clock() для прошлого метода.
        Сообщение отредактировано: vitaly333 -

        Прикреплённый файлПрикреплённый файлrowBlockMults.rar (0.89 Кбайт, скачиваний: 109)
          Цитата vitaly333 @
          Хотелось бы сначала разобратся с блочными алгоритмами, ориентированными на кэш.

          Мне тоже. Причем разбираться желательно не путем "тупого" тестирования отдельных вариантов на конкретных тачках, а хоть с каким-то "теоретическим" обоснованием выбора размеров блока и способа прохода этих блоков (т.е. как раз организации "внешних циклов"). Что толку "тупо" сравнивать, к примеру, предложенный мною (на шару ;) ) "построчный" вариант на атлонах с размером L2 512К и на Core2 c размером L2 в 2Мб или 4Мб - ежу понятно, что для такого способа обхода чем больше L2, тем лучше (на каждый блок требуется подгрузка из памяти двух строк матрицы A, поэтому чем больше строк в блоке, тем меньше относительный вклад подгрузки строк A в общее время расчета). К тому же на атлонах при той же частоте ОЗУ скорость чтения из памяти существенно ниже, чем в Core2
          PS: Да и к тому же лобовой\тормозной вариант транспонирования матрицы может давать заметный вклад, поэтому нужно либо его привести к единому виду с оптимизированным вариантом albom'а, либо не учитывать транспонирование при тестировании

          Добавлено
          albom
          Можешь в двух словах пояснить суть твоего алгоритма dmm2 или придется разбираться по коду ? ;)
            Цитата
            Можешь выложить сразу готовый к компиляции и запуску код/проект?

            Могу.
            Сообщение отредактировано: vitaly333 -

            Прикреплённый файлПрикреплённый файлBlockMatrixMultiply.rar (4.54 Кбайт, скачиваний: 102)
              Продолжение темы тут
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0240 ]   [ 14 queries used ]   [ Generated: 21.05.24, 13:28 GMT ]