乘法矩阵时,C多线程比单线程慢

时间:2018-12-01 00:33:28

标签: c multithreading performance matrix

我在C代码中使用theads来提高代码速度,但实际上会使情况更糟。

我有一个矩阵和一个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;
}

您知道为什么可能是问题吗?以及如何改进代码? 矩阵存储为一维数组。

非常感谢您的宝贵时间, 卢卡斯

0 个答案:

没有答案