大家好,我用线程编写了下面的矩阵乘法代码, 因此,当我运行该代码时,每个线程应该计算一行 只给出第一行和另一行的正确结果 行中的大多数元素都是零。 M * M的马蒂克斯大小!!我无法找到错误的地方!!提前致谢
# include <stdio.h>
# include <pthread.h>
# include <stdlib.h>
#include <sys/time.h>
int M;
int A [100][100];
int B [100][100];
int C [100][100];
struct v {
int i; /* row */
int j; /* column */
};
void *runner(void *param); /* the thread */
int main()
{
clock_t cstart = clock();
clock_t cend = 0;
int count=0;
pthread_t tid;
int iCount,jCount,kCount;
printf("Enter The Size: \n");
scanf("%d",&M);
for(iCount=0;iCount<M;iCount++)
{
for(jCount=0;jCount<M;jCount++)
{
printf("Enter Mat1[%d][%d] :",iCount,jCount);
scanf("%d",&A[iCount][jCount]);
}
}
for(iCount=0;iCount<M;iCount++)
{
for(jCount=0;jCount<M;jCount++)
{
printf("Enter Mat2[%d][%d] :",iCount,jCount);
scanf("%d",&B[iCount][jCount]);
}
}
for(iCount = 0; iCount < M; iCount++) {
struct v *data = (struct v *) malloc(sizeof(struct v));
data->i = iCount;
data->j = jCount;
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,&C[iCount]);
pthread_join(tid, NULL);
count++;
}
printf("\n Matrix 1 \n");
for(iCount=0;iCount<M;iCount++)
{
for(jCount=0;jCount<M;jCount++)
{
printf("%d \t",A[iCount][jCount]);
}
printf("\n");
}
printf("\n Matrix 2 \n");
for(iCount=0;iCount<M;iCount++)
{
for(jCount=0;jCount<M;jCount++)
{
printf("%d \t",B[iCount][jCount]);
}
printf("\n");
}
printf("\n Multipication of Matrices ...\n");
for(iCount = 0; iCount < M; iCount++) {
for(jCount = 0; jCount < M; jCount++) {
printf("%d \t", C[iCount][jCount]);
}
printf("\n");
}
cend = clock();
printf ("it took %.3f cpu sec\n", ((double)cend - (double)cstart)* 1.0e-6);
return 0;
}
void *runner(void *param) {
struct v *data = param;
int n, sum = 0;
int jCount;
do{sum=0;
for(n = 0; n< M; n++){
sum += A[data->i][n] * B[n][data->j];
}
C[data->i][data->j] = sum;
data->j++;
}while(data->j<M);
pthread_exit(0);
}
// compile code : gcc thread.c -o out -pthread
// ./out
答案 0 :(得分:0)
错误在于线程创建循环:
data->j = jCount;
您应该将data->j
初始化为0
。而是在矩阵初始化阶段结束时将其初始化为jCount,其值为M
。 data->j
作为线程参数没有意义,因为每个线程计算整个列。
答案 1 :(得分:0)
你malloc()
一个struct v
,但随后什么都不做。
struct v *data = (struct v *) malloc(sizeof(struct v));
您将C
2维数组的第n行的地址传递给您创建的主题:
pthread_create(&tid,&attr,runner,&C[iCount]);
但线程将地址视为struct v *
:
struct v *data = param;
此外,启动一个单独的线程然后立即等待它完成是没有意义的:
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,&C[iCount]);
pthread_join(tid, NULL);
在该循环中启动 all 您的线程,将tid
存储在数组中,然后运行另一个连接它们的循环。