2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 15:13 
Dongara в сообщении #289193 писал(а):
У меня нет времени на удовлетворение Ваших причуд. Просто я Вам указал, на какой результат необходимо ориентироваться.


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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 15:31 
Аватара пользователя
Теоретический результат N^2 операций при бесконечном числе процессоров. Практический около N^2,3 операций. Каждая архитектура и соотношение кэшей проверяется индивидуально на разных алгоритмах, такие обзоры в инете найти можно. Но бесполезно тягаться с аппаратной реализацией сабжа. Наивно думать что алгоритмы будут ориентироваться на странные индивидуальные ограничения.

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 16:02 
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 
Посчитал:
5000x5000: 6063.19с.

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 17:42 
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 
Ed_Em в сообщении #289261 писал(а):
Пожалуйста, умножение "в лоб" (самый медленный алгоритм):

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 18:15 
Точно, можно ввести временную переменную для увеличения скорости, да еще и вместо k*size просто прибавлять size.
Правда, это не сильно-то добавит скорости: 1000х1000 теперь считает 15.5 секунд.

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 18:39 
Chifu в сообщении #289250 писал(а):
Наивно думать что алгоритмы будут ориентироваться на странные индивидуальные ограничения.


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

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

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

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

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

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

Вот именно.

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 19:18 
Zealint в сообщении #289303 писал(а):
Тов. Ed_Em, срочно транспонируйте вторую матрицу - почти в 5 раз ускорите программу.

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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 19:54 
Roman Voznyuk в сообщении #289313 писал(а):
А если к тому же и результат записывать в ту же самую, а не в отдельную .... :)

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 20:03 
Zealint в сообщении #289321 писал(а):
Можете пояснить, как это сделать?

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение15.02.2010, 22:38 
Аватара пользователя
Поучаствую до кучи в вашем конкурсе. Как раз Visual Studio 2010 скачал :)
Roman Voznyuk в сообщении #289322 писал(а):
Ну результат у вас будет получаться в первой матрице, в терминах Си это будет оперция *= а не *.

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

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

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

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

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

Вот именно.


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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение16.02.2010, 01:25 
Chifu писал(а):
Если не разбираться в MKL то она действительно не спасёт, это всего лишь библиотека ориентированная на процессоры Intel

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

 
 
 [ Сообщений: 143 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group