Многопоточная матричная помощь умножения в C - PullRequest
3 голосов
/ 04 ноября 2010

У меня есть код умножения матрицы, который умножает матрицу на следующие значения: где матрица A * матрица B = матрица C

for(j=1;j<=n;j++) {
 for(l=1;l<=k;l++) {
  for(i=1;i<=m;i++) {
   C[i][j] = C[i][j] + B[l][j]*A[i][l];

 }
}

Теперь я хочу превратить его в многопоточное матричное умножение, и мой код выглядит какследующим образом:

Я использую структуру

struct ij
{
 int rows;
 int columns;
};

мой метод

void *MultiplyByThread(void *t)
{
 struct ij *RowsAndColumns = t;
 double total=0; 
 int pos; 
 for(pos = 1;pos<k;pos++)
 {
  fprintf(stdout, "Current Total For: %10.2f",total);
  fprintf(stdout, "%d\n\n",pos);
  total += (A[RowsAndColumns->rows][pos])*(B[pos][RowsAndColumns->columns]);
 }
 D[RowsAndColumns->rows][RowsAndColumns->columns] = total;
 pthread_exit(0);

}

, а внутри моего -

      for(i=1;i<=m;i++) {
        for(j=1;j<=n;j++) {

   struct ij *t = (struct ij *) malloc(sizeof(struct ij));
   t->rows = i;
   t->columns = j;

    pthread_t thread;
    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(&thread, &threadAttr, MultiplyByThread, t);    
    pthread_join(thread, NULL);    

        }
      }

Но я могуне получается получить тот же результат, что и первое умножение матриц (что правильно), может кто-то указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Попробуйте следующее:

#pragma omp for private(i, l, j)
for(j=1;j<=n;j++) {
    for(l=1;l<=k;l++) {
        for(i=1;i<=m;i++) {
            C[i][j] = C[i][j] + B[l][j]*A[i][l];
        }
    }
}

Хотя Googling для переключения компилятора GCC для включения OpenMP, я действительно наткнулся на это сообщение в блоге , которое описывает, что происходит лучше, чем я, и также содержит лучший пример.

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

0 голосов
/ 04 ноября 2010

Ваш код многопоточности на самом деле не является многопоточным.Вы создаете поток и ждете его завершения, вызывая соединение сразу после вызова create.Вы должны создать матрицу потоков mxn, запустить их все, а затем объединить их все.Кроме того, кажется, что код рассчитывается так же, как цикл.Каково точное расхождение с результатами?

Пример (примечание, не скомпилировано):

pthread_t threads[m][n]; /* Threads that will execute in parallel */

и затем в основном:

 for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {

    struct ij *t = (struct ij *) malloc(sizeof(struct ij));
    t->rows = i;
    t->columns = j;

    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(thread[i][j], &threadAttr, MultiplyByThread, t);    
    }
  }

  /* join all the threads */
  for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {
       pthread_join(thread[i][j], NULL);
    }
  }

(больше илименьше, просто не вызывая pthread_join для каждого потока внутри цикла).

...