Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритмический конкурс - перемножение матриц, Перемножение матриц на скорость 
:(
    Опции темы
Zealint
Дата 8.2.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые программисты, предлагаю принять участие в моём алгоритмическом конкурсе. Требуется написать программу, которая перемножает две квадратные матрицы за минимальное время. Максимальный размер матриц - 5000x5000. Конкурс пока бесплатный, поэтому и приз не сильно большой - 1000 р. Описание правил приводится на моём сайте. http://zealint.ru/fast-matrix-multiplication-comp.html

В будущем я предполагаю проводить и другие конкурсы, сложнее и интереснее!

Удачи!
PM MAIL WWW   Вверх
Фантом
Дата 8.2.2010, 19:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(Zealint @  8.2.2010,  18:54 Найти цитируемый пост)
Уважаемые программисты, предлагаю принять участие в моём алгоритмическом конкурсе. 

Что-то условие какое-то нежизнеспособное.  smile Windows XP у меня под руками нет, да и машины с соответствующим процессором - тоже. Однако под Linux (конкретно openSuSE 11.2 x86-64) на одном ядре от Athlon X2 5200+ (в принципе, не мощнее, чем Ваш Intel Core 2 Duo 8400) вот эта вот тупейшая программа на Фортране
Код

program cross

  implicit none
  integer :: N
  integer(4), dimension(:,:),allocatable :: a,b,c

  open(1,file='data.dat')
  read(1,*) N
  
  allocate(a(N,N),b(N,N),c(N,N))    
 
  read(1,*) a
  read(1,*) b
  close(1)

  c=matmul(a,b)

  open(2,file='res.dat',status='replace')
  write(2,10) c

  close(2)
  deallocate(a,b,c)

10 format(5000(I7,2X))
end program cross

отработала за 145-150 секунд (плюс-минус пара секунд для разных запусков и матриц), в отличие от Ваших 800.  smile Если что - компилятор Intel'овский, вызывался ifort -fast cross.f90 -o cross, подсчет времени выполнялся с помощью банального time ./cross. Замена компилятора на Sun'овский привела к тому, что время счета увеличилось секунд на 20.

Это, собственно, к тому, что задача неудачная - такие вещи "убиваются" не алгоритмическими изысками, а просто правильным выбором инструмента. При этом попытки написать что-то более сложное, скорее всего, приведут в лучшем случае к повторению того же результата.

Это сообщение отредактировал(а) Фантом - 9.2.2010, 01:08
PM   Вверх
Zealint
Дата 8.2.2010, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тов. Фантом, спасибо, что уделили внимание моему конкурсу. Дело в том, что создавая этот конкурс я, разумеется, подумал тех вещах, о которых вы говорите. Я бы не стал делать конкурс, если бы считал себя чайником : ). Я поставил в условиях Winsows XP, значит на то была определённая причина - это эксперимент, результаты которого мне интересны. Моя (та же самая) программа под Linux Enterprise с компилятором Intel C++ работает всего 108 секунд против ваших 145 (на процессоре, с частотой 2,67GHz). Да и то, программу я еще даже не начинал оптимизировать. Понимаете? В этом конкурсе я хочу, чтобы был именно Windows и хочу посмотреть, кто способен написать быструю программу под эту систему. Кстати, вы не написали, сколько ваша программа кушает памяти.

Попытки написать что-то более сложное должны привести к лучшему результату. Встроенным в язык программирования функциям я бы не стал доверять. Хотя, вдруг я не все такие функции пробовал? Кто знает... Но еще не было ни одного случая (какую бы я задачу не решал), чтобы встроенная в какую-либо библиотеку функция работала быстрее написанной руками реализации. Поэтому подборка инструментов, к сожалению, не даёт того, что мне нужно. Поэтому я и затеваю конкурсы.
PM MAIL WWW   Вверх
Фантом
Дата 8.2.2010, 22:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(Zealint @  8.2.2010,  20:29 Найти цитируемый пост)
Моя (та же самая) программа под Linux Enterprise с компилятором Intel C++ работает всего 108 секунд против ваших 145 (на процессоре, с частотой 2,67GHz).

Если процессор Intel, то это нормально. На моем AMD из icc можно будет выжать дополнительный десяток секунд, не больше. 

Цитата(Zealint @  8.2.2010,  20:29 Найти цитируемый пост)
В этом конкурсе я хочу, чтобы был именно Windows и хочу посмотреть, кто способен написать быструю программу под эту систему.

А смысл? Ни для каких практических целей программы такого рода под Windows никто писать не будет. Т.е. сама по себе задача, конечно, имеет право на существование, но в такой постановке ее результаты показывают непонятно что.

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

Цитата(Zealint @  8.2.2010,  20:29 Найти цитируемый пост)
Кстати, вы не написали, сколько ваша программа кушает памяти.

Так ведь очевидно. Три матрицы 5000*5000 c 4-байтовыми элементами, все остальное - мелочь, не стоящая внимания. Получается что-то в районе 300 мегабайт (точнее, матрицам надо 286, по "честным" измерениям получается 288).

Цитата(Zealint @  8.2.2010,  20:29 Найти цитируемый пост)
Попытки написать что-то более сложное должны привести к лучшему результату.

Нет. В таких условиях все, что может дать реальный выигрыш - это блочные методы и аккуратное использование векторных возможностей процессоров. В тот же matmul оно уже заложено, так что удастся разве что немного подкорректировать параметры блоков, поиграв с укладкой их в кэш. Однако это имеет смысл для матриц фиксированного размера, т.е. именно 5000*5000 таким способом немного оптимизировать, возможно, и получится, а для произвольного размера больше времени уйдет на написание программы. smile

Цитата(Zealint @  8.2.2010,  20:29 Найти цитируемый пост)
Но еще не было ни одного случая (какую бы я задачу не решал), чтобы встроенная в какую-либо библиотеку функция работала быстрее написанной руками реализации. Поэтому подборка инструментов, к сожалению, не даёт того, что мне нужно. Поэтому я и затеваю конкурсы. 

В вычислительных задачах такая ситуация - редкое исключение из правил. По крайней мере до тех пор, пока считать надо что-то более-менее стандартное.

PM   Вверх
Zealint
Дата 9.2.2010, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Если процессор Intel, то это нормально. На моем AMD из icc можно будет выжать дополнительный десяток секунд, не больше. 

Можно выжать больше, если вмешаться туда руками. Более того, я претендую на то, что моя программа под Windows скоро станет работать быстрее, чем ваша - под Linux. Этим вообще хочу показать, что ОС не играет сильной роли, если, конечно, не проводить какую-то совершенно жуткую оптимизацию.

Цитата

А смысл? Ни для каких практических целей программы такого рода под Windows никто писать не будет. Т.е. сама по себе задача, конечно, имеет право на существование, но в такой постановке ее результаты показывают непонятно что.

Результат будет показывать то, что мы можем выжать из Windows и Intel. Если проводить конкурсы для всех архитектур и ОС, то для этого у меня не хватит сил. На универсальном компьютере (архитектуры Intel, AMD или Mac) все равно результаты будут не слишком объективными, и вообще, если мне нужна будет совсем оптимальная программа, я задействую видеокарту, в которой будут вычисляться небольшие блоки, а большие будут считаться на обоих ядрах. Или вообще буду считать на кластере. То есть мне важна не сама скорость, с которой мы можем решать эту задачу, а скорость, которую можно выжать именно при моих ограничениях. Конечно, я могу такое же конкурс устроить и на Linux. Только мне сильно надоело наблюдать за тем, как программа скомпилированная на одном Линуксе соврешенно не хочет работать на другом. А в Windows XP хотя бы есть универсальность, которая нужна.

Цитата

Так ведь очевидно. Три матрицы 5000*5000 c 4-байтовыми элементами, все остальное - мелочь, не стоящая внимания. Получается что-то в районе 300 мегабайт (точнее, матрицам надо 286, по "честным" измерениям получается 288).

Не очевидно, я же не знаю что за алгоритм скрыт в матричном умножении. Если тупой тройной цикл, то понятно. У меня так же. Но у меня еще есть реализация одного из билинейных алгоритмов, которая требует еще около 10 матриц и в память не влезает. А мне нужно, чтобы влезала, поэтому я и провожу конкурс. 

Цитата

Нет. В таких условиях все, что может дать реальный выигрыш - это блочные методы и аккуратное использование векторных возможностей процессоров. В тот же matmul оно уже заложено, так что удастся разве что немного подкорректировать параметры блоков, поиграв с укладкой их в кэш. Однако это имеет смысл для матриц фиксированного размера, т.е. именно 5000*5000 таким способом немного оптимизировать, возможно, и получится, а для произвольного размера больше времени уйдет на написание программы

Так вот я вам обещаю, что ваш matmul будет повержен к концу конкурса. При одном условии - что люди начнут участвовать и начнётся конкуренция. Если конкуренции не будет, то, конечно, грустно. Значит народ не умеет программировать руками совсем, считая, что все уже есть в стандартных библиотеках. Это плохо. Еще раз: конкурс нужен для того, чтобы посмотреть, кто умеет программировать алгоритмы эффективно. Эффективность всегда достигается, когда учтена специфика задачи. В этом случае пасуют все встроенные алгоритмы, расчитанные на универсальный подход. 



PM MAIL WWW   Вверх
Фантом
Дата 9.2.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(Zealint @  9.2.2010,  07:33 Найти цитируемый пост)

Так вот я вам обещаю, что ваш matmul будет повержен к концу конкурса.

Ну хорошо. Когда кто-нибудь повергнет, напишите. Мне тоже интересно.  smile 
PM   Вверх
W4FhLF
Дата 9.2.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 5
Всего: 121



Ну, господа, что-то слабенько. smile 

Intel Core 2 Duo P8400 2.2 Ггц:

Компилятор MSVC++ 2008:

Цитата

D:\R&D\matmul>matmul 1024
Strassen algorithm + SIMD
Matrices size:1024:1024 0.218 s.

Cycle unrolling + SIMD
Matrices size:1024:1024 0.39 s.


D:\R&D\matmul>matmul 2048
Strassen algorithm + SIMD
Matrices size:2048:2048 1.576 s.

Cycle unrolling + SIMD
Matrices size:2048:2048 4.041 s.


D:\R&D\matmul>matmul 4096
Strassen algorithm + SIMD
Matrices size:4096:4096 11.232 s.

Cycle unrolling + SIMD
Matrices size:4096:4096 33.493 s.


D:\R&D\matmul>matmul 5120
Strassen algorithm + SIMD
Matrices size:5120:5120 21.606 s.

Cycle unrolling + SIMD
Matrices size:5120:5120 64.241 s.


D:\R&D\matmul>



Компилятор Intel C++ 11 даёт такие же результаты с отличием в 1-2 секунды. 

Алгоритм Штрассена требует много памяти. Поэтому для матриц 5120х5120 используемая память достигает 900Мб. Но в рамках условий конкурса. smile Однако можно перемножать матрицы только кратные 2^n. Универсальный алгоритм работает в среднем в три раза хуже, однако его можно оптимизировать, чтобы он раза в два быстрее был.

Если бы можно было использовать GPU, то цифры были бы гораздо меньше. Перемножение 5000х5000 в рамках 8 секунд на обычной NVIDIA 9600GT реальная задача. 

Оптимизированное умножение (на у Фантома на фортране) у меня выполняется 187 сек.


Это сообщение отредактировал(а) W4FhLF - 9.2.2010, 13:42


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Фантом
Дата 9.2.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(W4FhLF @  9.2.2010,  12:50 Найти цитируемый пост)

Алгоритм Штрассена требует много памяти. Поэтому для матриц 5120х5120 используемая память достигает 900Мб. Но в рамках условий конкурса.

М-да, похоже, я ошибся, посчитав, что Штрассен в память не влезет. А код универсального варианта можно посмотреть? Хочется посмотреть на него в тех же условиях.
PM   Вверх
W4FhLF
Дата 9.2.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 5
Всего: 121



Цитата(W4FhLF @  9.2.2010,  12:50 Найти цитируемый пост)
Универсальный алгоритм работает в среднем в три раза хуже, однако его можно оптимизировать, чтобы он раза в два быстрее был.


Я погорячился)

Цитата

Strassen algorithm + SIMD
Matrices size:5120:5120 20.67 s.

Cycle unrolling + pure SIMD + cache
Matrices size:5120:5120 41.434 s.

Cycle unrolling + SIMD
Matrices size:5120:5120 58.267 s.


Второй вариант не использует дополнительной памяти, но идёт более грамотная работа с память. Данные делятся на блоки относительно размера кеша и кеш-лайна. 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
W4FhLF
Дата 9.2.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 5
Всего: 121



Цитата(Фантом @  9.2.2010,  13:11 Найти цитируемый пост)
А код универсального варианта можно посмотреть? Хочется посмотреть на него в тех же условиях.


Не понял немного. В каких тех же? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Фантом
Дата 9.2.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(W4FhLF @  9.2.2010,  13:41 Найти цитируемый пост)

Не понял немного. В каких тех же?  

На той же машине, чтобы сравнить с тривиальным вариантом.
PM   Вверх
W4FhLF
Дата 9.2.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 5
Всего: 121



Цитата(Фантом @  9.2.2010,  13:45 Найти цитируемый пост)
На той же машине, чтобы сравнить с тривиальным вариантом.


Тривиальный алгоритм с тремя циклами у меня работал больше 15 минут на матрицах 5120, я даже не дождался конца. smile
Слегка подправленный (скорее всего такой же как в фортране) с транспонированной второй матрицей работал 187 секунд. 

В аттчае вариант с двумя алгоритмами, которые я приводил в первом своём посте этой темы. 

Матрицы заполняются так:

Код

void matrix_fill(float *m, unsigned sz)
{
    for(int i = 0; i < sz*sz; ++i)
        m[i] = 1.0 / (i + 1);
}


запускать так:

Цитата

matmul_vc N


где N - размер матрицы. 

Чтобы выложить целиком, надо его доработать. 



Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  matmul_vc.rar 7,82 Kb


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Фантом
Дата 9.2.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 2
Всего: 49



Цитата(W4FhLF @  9.2.2010,  14:06 Найти цитируемый пост)
запускать так:

Ну да, только exe-шник под Linux и запускать. smile Я исходники хочу (точнее, второй исходник - то, что метод Штрассена должен давать такие результаты, и так понятно).
PM   Вверх
Zealint
Дата 9.2.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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







Цитата

Ну, господа, что-то слабенько.

Тов. W4FhLF, что вы меряетесь тут? Присылайте мне программу и я протестирую все на своей машине (по условию, я должен получить прогу на почту и чтобы она с файлами работала). Все сравнения будут объективными, и с кубической реализаций сравним, и со Штрассеном и с ним же в моем скромном исполнении, если кубический алгоритм я не смогу довести до победы. Кстати, у E8400 вы неправильно написали скорость, там 3000MHz. Давайте, участвуйте, посоревнуемся! Ваши "21s" меня приятно удивили, мне видимо придется долго думать, чтобы это переплюнуть. Еще дело в компиляторе...

Мне тяжеловато вести беседу на разных форумах, разные соображения можно у меня в блоге записывать... А лучше не записывать, а присылать программы. Тогда будет что с чем сравнивать.

Это сообщение отредактировал(а) Zealint - 9.2.2010, 14:24
PM MAIL WWW   Вверх
Zealint
Дата 9.2.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Перемножение 5000х5000 в рамках 8 секунд на обычной NVIDIA 9600GT реальная задача. 

Конкурс на последовательную реализацию. Параллельные алгоритмы будут потом, причем задачи будут такие, что и 100 000 процессоров при кривых руках не помогут. И конкурсы на видеокарточке будут, но опять же - это сильно сужает круг участников. Сейчас-то никого нет, а если сказать, что видеокарта умеет считать - вообще все разбегутся. А когда я конкурс на кластере сделаю, там я один видимо и буду участвовать : ) Сейчас я специально простую задачу даю, или она сложная считается?

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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