2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 15:13 


26/01/10
959
Dongara в сообщении #289193 писал(а):
У меня нет времени на удовлетворение Ваших причуд. Просто я Вам указал, на какой результат необходимо ориентироваться.


Более того, теоретический результат Вы посчитать не сможете. Вы не указали, на какой результат можно ориентироваться, а общие слова ни к чему не обязывают. Кстати, MKL я проверил - сейчас нет смысла даже включать результат в рейтинг, там получается около 30 секунд. На фоне 13 секунд у лидера не смотрится. И так буде всегда, когда частный случай задачи решается общими методами. Поэтому причуды не у меня, а снова у Вас.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 15:31 
Аватара пользователя


27/01/09
814
Уфа
Теоретический результат N^2 операций при бесконечном числе процессоров. Практический около N^2,3 операций. Каждая архитектура и соотношение кэшей проверяется индивидуально на разных алгоритмах, такие обзоры в инете найти можно. Но бесполезно тягаться с аппаратной реализацией сабжа. Наивно думать что алгоритмы будут ориентироваться на странные индивидуальные ограничения.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 16:02 


04/02/08
325
Буково
Chifu в сообщении #289234 писал(а):
Неплохо бы выложить какой-нибудь исходник как отправную точку, чтобы иметь и ввод-вывод и измерение времени.

Пожалуйста, умножение "в лоб" (самый медленный алгоритм):
Код:
#include <stdio.h>
#define SIZE 50
int *alloc_matrix(size){
   int *matrix = malloc(size * size * sizeof(int));
   printf("matrix %dx%d allocated\n", size, size);
   return matrix;
}

void del_matrix(int *matrix){
   free(matrix);
}

void multiply_matrix(int *m1, int *m2, int * ans, int size){
   int i, j, k, l, tmp = 0;
   for(i = 0; i < size; i++)
      for(j = 0; j < size; j++){
         for(k = 0; k < size; k++) tmp += m1[i * size + k] * m2[j + k * size];
         ans[i * size + j] = tmp;
         tmp = 0;
      }
}

main(int argc, char** argv){
   int i, j, size;
   if(argc > 1) size = atoi(argv[1]);
   else size = SIZE;
   printf("allocating\n");
   int *m1 = alloc_matrix(size);
   int *m2 = alloc_matrix(size);
   int *ans = alloc_matrix(size);
   for(i=0; i<size; i++)
      for(j=0; j<size; j++){
         m1[i + j * size] = i* size +j;
         m2[i + j * size] = i* 1000 +j;
      }
   printf("multiplying\n");
   multiply_matrix(m1, m2, ans, size);
   FILE *f = fopen("matrix_mult", "w");
   printf("writing\n");
   for(i=0; i<size; i++){
      for(j=0; j<size; j++)
         fprintf(f, "%d\t", ans[i*size + j]);
      fprintf(f, "\n");
   }
   fclose(f);
   del_matrix(m1);
   del_matrix(m2);
   del_matrix(ans);
}

С выводом в файл получается следующее время выполнения:
200x200 - 0.08с
300х300 - 0.31с
400х400 - 0.81с
500х500 - 1.77с
1000х1000 - 16.09с,
5000х5000 - еще считает, (думаю, будет чуть меньше часа).

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 17:16 


04/02/08
325
Буково
Посчитал:
5000x5000: 6063.19с.

При этом было "съедено" 225Мб оперативки.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 17:42 
Заблокирован


12/11/09

92
Ed_Em в сообщении #289281 писал(а):
Посчитал:
5000x5000: 6063.19с.

При этом было "съедено" 225Мб оперативки.

Многовато. Без доп. выделения памяти на 3 GHz на одном ядре 17 с., а с дополнительным выделением - еще быстрей.

Zealint писал(а):
На фоне 13 секунд у лидера не смотрится

А чего так много? Я бы на Вашем месте 3 с. написал.

Zealint писал(а):
Кстати, MKL я проверил - сейчас нет смысла даже включать результат в рейтинг, там получается около 30 секунд

Порядка 23 с.

Zealint писал(а):
Приз за самую быструю программу - 1000 р.

Бесплатным бывает только сыр в мышеловке.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 17:46 


30/12/09
95
Ed_Em в сообщении #289261 писал(а):
Пожалуйста, умножение "в лоб" (самый медленный алгоритм):

А зачем вы на каждой итерации вложенного цикла делаете умножение i*size ?

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 18:15 


04/02/08
325
Буково
Точно, можно ввести временную переменную для увеличения скорости, да еще и вместо k*size просто прибавлять size.
Правда, это не сильно-то добавит скорости: 1000х1000 теперь считает 15.5 секунд.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 18:39 


26/01/10
959
Chifu в сообщении #289250 писал(а):
Наивно думать что алгоритмы будут ориентироваться на странные индивидуальные ограничения.


Ничего подобного. Наивно как раз думать, что всем всегда надо решать задачи в общем случае. Согласен, что для рядовых задач вполне подходит то, что уже написано. Но, например, когда речь идет о задачах на графах, то там вообще матрица может быть только из 0 и 1. Зачем мне тогда обобщенный алгоритм? А если числа в матрице 15 000 знаков, что никакой MKL не спасет. Так что с частными случаями очень даже важно уметь работать.

Цитата:
1000х1000 теперь считает 15.5 секунд.

Тов. Ed_Em, срочно транспонируйте вторую матрицу - почти в 5 раз ускорите программу.

Цитата:
А чего так много? Я бы на Вашем месте 3 с. написал.

Вы не на моем месте, и, конечно же, вы такую программу не напишите.

Цитата:
Бесплатным бывает только сыр в мышеловке.

Вот именно.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 19:18 


30/12/09
95
Zealint в сообщении #289303 писал(а):
Тов. Ed_Em, срочно транспонируйте вторую матрицу - почти в 5 раз ускорите программу.

А если к тому же и результат записывать в ту же самую, а не в отдельную .... :)

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 19:23 
Аватара пользователя


27/01/09
814
Уфа
Zealint писал(а):
Ничего подобного. Наивно как раз думать, что всем всегда надо решать задачи в общем случае. Согласен, что для рядовых задач вполне подходит то, что уже написано. Но, например, когда речь идет о задачах на графах, то там вообще матрица может быть только из 0 и 1. Зачем мне тогда обобщенный алгоритм? А если числа в матрице 15 000 знаков, что никакой MKL не спасет. Так что с частными случаями очень даже важно уметь работать.
Не всем всегда, а большинству и типичные задачи. Бинарные матрицы и графы это и есть один из общих случаев. Если не разбираться в MKL то она действительно не спасёт, это всего лишь библиотека ориентированная на процессоры Intel, т.е. использующая ресурсы процессора как это представляют себе разработчики процессора и то как она реализована во многом может помочь вам в самых индивидуальных случаях. И научная работа предполагает некоторый обзор существующих подходов, ну хотя бы чтобы не изобретать велосипед заново, но это и не исключает повторения уже пройденного.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 19:54 


26/01/10
959
Roman Voznyuk в сообщении #289313 писал(а):
А если к тому же и результат записывать в ту же самую, а не в отдельную .... :)

Можете пояснить, как это сделать?

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 20:03 


30/12/09
95
Zealint в сообщении #289321 писал(а):
Можете пояснить, как это сделать?

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

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 22:38 
Аватара пользователя


25/03/09
94
Поучаствую до кучи в вашем конкурсе. Как раз Visual Studio 2010 скачал :)
Roman Voznyuk в сообщении #289322 писал(а):
Ну результат у вас будет получаться в первой матрице, в терминах Си это будет оперция *= а не *.

Вы не путаете с поэлементным умножением?

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 23:14 
Заблокирован


12/11/09

92
Zealint писал(а):

Цитата:
А чего так много? Я бы на Вашем месте 3 с. написал.

Вы не на моем месте, и, конечно же, вы такую программу не напишите.

Цитата:
Бесплатным бывает только сыр в мышеловке.

Вот именно.


Я бредовыми проектами, да еще подкрепленными бомжовыми подачками, не занимаюсь.

 Профиль  
                  
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение16.02.2010, 01:25 
Заблокирован


12/11/09

92
Chifu писал(а):
Если не разбираться в MKL то она действительно не спасёт, это всего лишь библиотека ориентированная на процессоры Intel

Intel MKL - Это всего лишь профессиональная рализация (правда, расширенная) свободно распространяемого пакета LAPACK (туда входит и BLAS). Но она не ориентиравана на работу с целыми числами. А процессор здесь Интеловский. Кто знаком с эффективными методами реализации перемножения матриц (т.е. 95% от теоретически возможной скорости), состоящей из вещественных чисел, без труда, используя SSE4, реализует качественный алгоритм и для целых чисел. А если программер еще разбирается и в быстрых алгоритмах перемножения матриц, основным недостатком которых является потеря точности, то ему и карты в руки: здесь целые числа и точность никуда не убежит. Вот постарается - и на бомжовую похлебку заработает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 143 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group