2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10  След.
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 11:04 


04/02/08
325
Буково
Понятно. У меня мастдай стоит только на одном из рабочих компьютеров (причем довольно дохлом), и используется только для запуска ChipProg, который в wine не работает. А эта сандра, как я понял, в wine все равно работать не будет :)

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


27/01/09
814
Уфа
Ещё: процессоры то с несколькими конвейерами, так что это не совсем последовательное выполненение программы, так что надо грамотно конвейеры загрузить.

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


04/02/08
325
Буково
Chifu в сообщении #289751 писал(а):
Ещё: процессоры то с несколькими конвейерами, так что это не совсем последовательное выполнение программы, так что надо грамотно конвейеры загрузить.

Распараллеливание умножения матриц - задача элементарная. Если хватает ядер, можно вообще значение каждого элемента результирующей матрицы на отдельном ядре вычислять :)
Вот с Фурье, например, чуть сложнее: сначала надо посчитать образы для, скажем, столбцов, и лишь потом на основе результатов вычислять образы строк. Хотя и здесь распараллеливание выполняется нормально (сначала первая операция, потом - вторая).

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


12/11/09

92
Zealint писал(а):
...

Очередная порция бреда в Вашем исполнении: почему я должен следовать Вашей бредовой затее, тем более, что Вы сами пишите, что Вы в этой области "ни ухом ни рылом". Как я вижу, и в области элементарной математики у Вас серьезные проблемы: не можете привести мой результат к результату, который должен получиться на Вашем проце.

-- Ср фев 17, 2010 12:56:43 --

Ed_Em писал(а):
Распараллеливание умножения матриц - задача элементарная.

Вообще говоря, не совсем.

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


26/01/10
959
Dongara в сообщении #289779 писал(а):
Очередная порция бреда в Вашем исполнении: почему я должен следовать Вашей бредовой затее, тем более, что Вы сами пишите, что Вы в этой области "ни ухом ни рылом". Как я вижу, и в области элементарной математики у Вас серьезные проблемы: не можете привести мой результат к результату, который должен получиться на Вашем проце.


Итак, давайте я вам снова покажу, какой вы бред написали. Смотрите (все элементарно): (1) какой затее я Вас обязываю следовать? (2) Я в задачах линейной алгебры чайник, что дальше? (3) Теоретические расчёты я вас попросил сделать только чтобы показать Вам, что Вы этого сделать не сможете как ни старайтесь. По очень простой причине, сами догадаетесь? (4) Ваш результат ни к чему не обязывает, я его не видел. Даже если я приведу этот результат к своей машине, что дальше? Меня интересует лишь один вопрос: кто из участников покажет самую быструю реальную программу. И меня мало волнует, будет ли она работать 3 секунды или 8. Если мне нужно будет быстро перемножить две матрицы, я просто сделаю это на кластере гораздо быстрее. Поэтому ваши слова - пустая болтовня. (5) Вы так и не смогли внятно сказать, что именно Вам не нравится в конкурсе.

Итак, вы можете сказать хоть что-то внятное по поводу этих 5 пунктов? Ответ типа "это бред" конечно же играет не в вашу пользу, так как в очередной раз покажет отсутствие у Вас элементарной логики. Уже всем понятно, что ничего разумного вы за все время не сказали. А если вам "некогда" или "нет желания", то нечего и разговор заводить было, тов. Dongara. Зачем себя лишний раз дискредитировать? По мне так хоть у вас Нобелевская премия по вопросам линейной алгебры, суть не в этом, а в том, что вы реально сейчас говорите. А по сути - это ничто. Может, подумаете сначала, прежде чем ответить? Полемика здесь явно не в Вашу пользу.

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


04/02/08
325
Буково
Dongara в сообщении #289779 писал(а):
Ed_Em писал(а):
Распараллеливание умножения матриц - задача элементарная.

Вообще говоря, не совсем.

Ладно, приведу тот же самый пример грубого вычисления (без оптимизации), но с распараллеливанием:
Код:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/times.h>
#include <fcntl.h>
#include <string.h>
#define SIZE 50
#define THR_NUM 2
int *alloc_matrix(size){
   int *matrix = (int*)malloc(size * size * sizeof(int));
   printf("matrix %dx%d allocated\n", size, size);
   return matrix;
}


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

double dtime(){
  struct timeval tv;
  struct timezone tz;
  double t;
  gettimeofday(&tv, &tz);
  t = (double)tv.tv_sec + (double)tv.tv_usec*1e-6;
  return(t);
}


struct matrix_args{
   int *m1;
   int *m2;
   int *ans;
   int size;
   int start;
   int end;
} ARG[THR_NUM];

void *multiply_matrix(void *pargs){
   struct matrix_args *args = (struct matrix_args *) pargs;
   int i, j, k, l, m, tmp = 0;
   double t0 = dtime();
   int *m1 = args->m1;
   int *m2 = args->m2;
   int *ans = args->ans;
   int size = args->size;
   int start = args->start;
   int end = args->end;
   for(i = start; i < end; i++){// строки первой матрицы
      m = i * size;
      for(j = 0; j < size; j++){// столбцы второй матрицы
         l = 0;
         for(k = 0; k < size; k++){// столбец первой/строка второй
            tmp += m1[m + k] * m2[j + l];
            l += size;
         }//k
         ans[m + j] = tmp;
         tmp = 0;
      }//j
   }//i
   printf("thread works %fs\n", dtime() - t0);
   pthread_exit(NULL);
}

main(int argc, char** argv){
   int i, j, size, k, step, pos, res;
   pthread_t threads[THR_NUM];
   pthread_attr_t attr;
   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] = 1;//i* size +j;
         m2[i + j * size] = 1;//i* 1000 +j;
      }
   printf("multiplying\n");
   double t0 = dtime();
   pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
   step = (int)((double)size/(double)THR_NUM);
   pos = 0;
   for(k = 0; k < THR_NUM; k++){
   ARG[k].m1 = m1;
   ARG[k].m2 = m2;
   ARG[k].ans = ans;
   ARG[k].size = size;
   ARG[k].start = pos;
   pos += step;
   ARG[k].end = (k == THR_NUM - 1) ? size : pos;
   res = pthread_create(&threads[k], &attr, multiply_matrix, (void *)&ARG[k]);
   if(res){
      fprintf(stderr, "Error creating thread\n");
      exit(1);
   }
   }
   pthread_attr_destroy(&attr);
   for(k = 0; k < THR_NUM; k++)
      pthread_join(threads[k], NULL);
   printf("time for multiplying: %f\n", dtime()-t0);
   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);
   pthread_exit(NULL);
}

Сложного ничего нет :)
Для матрицы 1000х1000 на двухпроцессорном компьютере при работе в два потока выигрыш в скорости 2.5-3 секунды по сравнению с однопоточной реализацией.

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


12/11/09

92
Ed_Em в сообщении #289863 писал(а):
Dongara в сообщении #289779 писал(а):
Ed_Em писал(а):
Распараллеливание умножения матриц - задача элементарная.

Вообще говоря, не совсем.

Ладно, приведу тот же самый пример грубого вычисления (без оптимизации), но с распараллеливанием: ...

Вы меня не поняли: я говорил про спорт высших достижений. Приведу пример: у меня 2 компа с процессорами q9450 и i7 860. Для них алгоритмы перемножения матриц здорово отличаются. И распараллеливание на них реализовано несколько иначе.

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


04/02/08
325
Буково
Цитата:
И распараллеливание на них реализовано несколько иначе.

Наша задача - "наплодить" потоков (оптимально - по одному на каждое ядро, иногда - два на ядро), а что будет происходить дальше - задача ядра операционной системы, ну а во что превратится наш код на С - задача оптимизатора компилятора. Не думаю, что для написания алгоритма умножения матриц стоит копать так глубоко, чтобы различать архитектуры ядер.

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


12/11/09

92
Ed_Em писал(а):
Не думаю, что для написания алгоритма умножения матриц стоит копать так глубоко, чтобы различать архитектуры ядер.

Ошибаетесь: если взять, к примеру, dgemm из Intel MKL, и создать самый примитивный экзешник для перемножения матриц, то под x64 он будет занимать более 2-х мегабайт из-за того, что для разных архитектур разный код. Да и для одного конкретного процессора код тоже будет будьте-нате: не одна тысяча строк ассемблерного кода.

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


04/02/08
325
Буково
Dongara в сообщении #289980 писал(а):
Ed_Em писал(а):
Не думаю, что для написания алгоритма умножения матриц стоит копать так глубоко, чтобы различать архитектуры ядер.

Ошибаетесь: если взять, к примеру, dgemm из Intel MKL, и создать самый примитивный экзешник для перемножения матриц, то под x64 он будет занимать более 2-х мегабайт из-за того, что для разных архитектур разный код. Да и для одного конкретного процессора код тоже будет будьте-нате: не одна тысяча строк ассемблерного кода.

Так мы с вами про разные операционки говорим. В POSIX-совместимых код софта един для всех архитектур, на ассемблере сейчас пишут только части ядра, зависящие от архитектуры. Вы же все на мастдай переносите :)

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


12/11/09

92
Ed_Em писал(а):
... на ассемблере сейчас пишут только части ядра, зависящие от архитектуры. Вы же все на мастдай переносите

ОСь здесь ни при чем. Подавляющая часть эффективного алгоритма перемножения матриц реализуется на ассемблере.

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


12/11/09

92
Zealint писал(а):
[Может, подумаете сначала, прежде чем ответить?

Подумал и решил, что у Вас все признаки душевного расстройства. Сочувствую, но ничем помочь не могу. Успехов в лечении.

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


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

Вы как раз сами эти признаки продемонстрировали: наехали, причем не объяснили причину. Как это называется?

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


29/07/05
8248
Москва
 !  Прекращаем выяснение отношений

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


26/01/10
959
PAV в сообщении #290405 писал(а):
 !  Прекращаем выяснение отношений

Согласен, я лишь хочу понять, что так не понравилось тов. Dongar'е с самого начала. И все. Разве я ему сложные вопросы задаю? : ) В частности, мне непонятен смысл его безосновательных наездов. Может Вы у него поинтересуетесь?

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

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



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

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


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

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