C многопоточность медленнее, чем однопоточность при умножении матриц - PullRequest
0 голосов
/ 01 декабря 2018

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

У меня есть матрица и класс matrix_operation:

struct matrix
{
  char *name;
  size_t rows;
  size_t columns;
  double *value;
};

typedef struct matrix_operation matrix_operation;

struct matrix_operation
{
  matrix r;
  matrix m1;
  matrix m2;
  size_t row; 
};

Дляумножив матрицы, я использую эти функции:

matrix matrix_mul(char *name, matrix m1, matrix m2, size_t replace)
{
  matrix r = matrix_init(name, m1.rows, m2.columns);

  matrix_operation *mat = malloc(sizeof *mat * m1.rows);
  pthread_t *th = malloc(sizeof *th * m1.rows);

  for (size_t i = 0; i < m1.rows; i++)
  {
    matrix_operation param = {r, m1, m2, i};
    mat[i] = param;
    pthread_create(&th[i], NULL , matrix_mul_th, &mat[i]);
  }

  for (size_t i = 0; i < m1.rows; i++)
  {
        pthread_join(th[i], NULL);
  }

  free(mat);
  free(th);

  if (replace == 1)
    matrix_free(m1);
  else if (replace == 2)
    matrix_free(m2);
  else if (replace == 3)
  {
    matrix_free(m1);
    matrix_free(m2);
  }

  return r;
}

void *matrix_mul_th(void *arg)
{
  matrix_operation mat = *(matrix_operation*)arg;

  for (size_t j = 0; j < mat.m2.columns; j++)
    {
      double sum = 0;
      for (size_t k = 0; k < mat.m1.columns; k++)
        sum += matrix_get(mat.m1,mat.row,k) * matrix_get(mat.m2,k,j);
      matrix_put(mat.r,mat.row,j,sum);
    }

  return NULL;
}

У вас есть идеи, почему проблема может быть?А как улучшить код?Матрицы хранятся в виде одномерного массива.

Большое спасибо за ваше время, Лукас

...