【问题标题】:C matrix with multi thread具有多线程的 C 矩阵
【发布时间】:2015-12-12 12:05:41
【问题描述】:

我需要创建一个代码来用多线程对矩阵求和,但我犯了错误。我必须准确地使用该函数“matmatthread”而不更改输入参数。

我遇到了这个错误:

multimatrix.c:42:24: 警告:来自不兼容指针类型的赋值
[默认启用]
argmain[i].A = A;

multimatrix.c:43:24: 警告:来自不兼容指针类型的赋值
[默认启用]
argmain[i].B =B;

multimatrix.c:44:24: 警告:来自不兼容指针类型的赋值
[默认启用]
argmain[i].C =C;

这是代码:

#include<pthread.h>
#include<stdio.h>
#include<math.h>

struct argtype
{
  int id;
  int LDA;
  int LDB;
  int LDC;
  int NT;
  int N;
  int M;
  int P;
  float **A;
  float **B;
  float **C;
};

void matmatthread(int LDA, int LDB, int LDC, float A[][LDA], float B[][LDB],
    float C[][LDC], int N, int M, int P, int NT)
{
  void *thread(void *);
  int i, j;
  pthread_t tid[4];
  struct argtype argmain[4];

  for (i = 0; i < NT; i++)
  {
    argmain[i].id = i;
    argmain[i].N = N;
    argmain[i].M = M;
    argmain[i].P = P;
    argmain[i].NT = NT;
    argmain[i].LDA = LDA;
    argmain[i].LDB = LDB;
    argmain[i].LDC = LDC;
    argmain[i].A = A;
    argmain[i].B = B;
    argmain[i].C = C;
  }

  for (i = 0; i < NT; i++)
  {
    pthread_create(&tid[i], NULL, thread, &argmain[i]);
  }

  for (i = 0; i < NT; i++)
  {
    pthread_join(tid[i], NULL );
  }
}

void *thread(void *argmain)
{
  struct argtype *argthread;

  int id_loc, NT_loc, N_loc, M_loc, P_loc;
  float **A_loc, **B_loc, **C_loc;
  int LDA_loc, LDB_loc, LDC_loc;

  int i, j;

  argthread = (struct argtype *) argmain;

  id_loc = (*argthread).id;
  LDA_loc = (*argthread).LDA;
  LDB_loc = (*argthread).LDB;
  LDC_loc = (*argthread).LDC;
  N_loc = (*argthread).N;
  M_loc = (*argthread).M;
  P_loc = (*argthread).P;
  A_loc = (*argthread).A;
  B_loc = (*argthread).B;
  C_loc = (*argthread).C;
  NT_loc = (*argthread).NT;

  for (i = 0; i < N_loc; i++)
  {
    for (j = 0; j < P_loc; j++)
    {
      C_loc[i][j] = C_loc[i][j] + (A_loc[i][j] + B_loc[i][j]);
    }
  }
}

【问题讨论】:

标签: c multithreading pointers matrix pthreads


【解决方案1】:

正确地说:

float **float (*)[something] 不同,float A[][LDA] 是(在 函数声明的上下文)。

因此,要进行的更改(以便使用的声明与实际数据类型匹配)是:

15,17c15,17
<   float **A;
<   float **B;
<   float **C;
---
>   void *A;
>   void *B;
>   void *C;
59d58
<   float **A_loc, **B_loc, **C_loc;
69a69
>   float (*A_loc)[LDA_loc], (*B_loc)[LDB_loc], (*C_loc)[LDC_loc];

【讨论】:

    【解决方案2】:

    改变

    argmain[i].A = A;
    

    argmain[i].A = (float**)A;
    

    【讨论】:

    • 谢谢,伙计!我按照你告诉我的做了铸造,现在我可以编译它了;但是当我运行它时,我在最后一行出现“分段错误(核心转储)”: C_loc[i][j]=C_loc[i][j]+(A_loc[i][j]+B_loc[i ][j]);如果我尝试在该行之后 printf A[0][0]:argmain[i].A = (float**)A;有用;但是如果我尝试 printf argmain[i].A[0][0] 它会给我一个分段错误;我该如何解决这个问题?
    • 只是不要盲目地四处寻找以消除错误消息。
    • @alk,没有人这样做。随意帮助解决次要问题,而不是在没有问题的地方找问题。
    • A float **float (*)[something] 不同,float A[][LDA] 是(在函数声明的上下文中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多