2014 dxdy logo

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

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




На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10  След.
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 11:04 
Понятно. У меня мастдай стоит только на одном из рабочих компьютеров (причем довольно дохлом), и используется только для запуска ChipProg, который в wine не работает. А эта сандра, как я понял, в wine все равно работать не будет :)

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 11:47 
Chifu в сообщении #289751 писал(а):
Ещё: процессоры то с несколькими конвейерами, так что это не совсем последовательное выполнение программы, так что надо грамотно конвейеры загрузить.

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

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

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

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

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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 15:06 
Dongara в сообщении #289779 писал(а):
Очередная порция бреда в Вашем исполнении: почему я должен следовать Вашей бредовой затее, тем более, что Вы сами пишите, что Вы в этой области "ни ухом ни рылом". Как я вижу, и в области элементарной математики у Вас серьезные проблемы: не можете привести мой результат к результату, который должен получиться на Вашем проце.


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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 17:55 
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 
Ed_Em в сообщении #289863 писал(а):
Dongara в сообщении #289779 писал(а):
Ed_Em писал(а):
Распараллеливание умножения матриц - задача элементарная.

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

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

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

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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение17.02.2010, 23:36 
Ed_Em писал(а):
Не думаю, что для написания алгоритма умножения матриц стоит копать так глубоко, чтобы различать архитектуры ядер.

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение18.02.2010, 08:59 
Dongara в сообщении #289980 писал(а):
Ed_Em писал(а):
Не думаю, что для написания алгоритма умножения матриц стоит копать так глубоко, чтобы различать архитектуры ядер.

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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение18.02.2010, 09:40 
Ed_Em писал(а):
... на ассемблере сейчас пишут только части ядра, зависящие от архитектуры. Вы же все на мастдай переносите

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение18.02.2010, 12:26 
Zealint писал(а):
[Может, подумаете сначала, прежде чем ответить?

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение18.02.2010, 16:49 
Dongara в сообщении #290055 писал(а):
Подумал и решил, что у Вас все признаки душевного расстройства. Сочувствую, но ничем помочь не могу. Успехов в лечении.

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

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

 
 
 
 Re: Перемножение матриц - конкурс для программистов
Сообщение19.02.2010, 17:15 
PAV в сообщении #290405 писал(а):
 !  Прекращаем выяснение отношений

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

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


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