Multithread计算Matrix产品的时间成本

时间:2016-10-04 13:15:36

标签: c linux multithreading operating-system pthreads

我最近在学习线程。在一个小实验中,我使用pthread尝试多线程来计算两个矩阵的乘积。然后我发现使用多线程花费的时间比不花费更多。我试图扩大矩阵的体积,单线程只是表现更好。 这是我的测试代码和结果: 单线程:

#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
#define M 3
#define K 2
#define N 3
int A[M][K]={{1,4},{2,5},{3,6}};
int B[K][N]={{8,7,6},{5,4,3}};
int C[M][N];
int main()
{
int begin = clock();
int result = 0;
int i,j,m;
for(i=0;i<M;i++)
    for(j=0;j<N;j++){
        for(m=0;m<K;m++){
        result+=A[i][m]*B[m][j];
}
C[i][j]=result;
result = 0;
}
int end = clock();
printf("time cost:%d\n",end-begin);
for(i=0;i<M;i++){
    for(j=0;j<N;j++){
        printf("%d ", C[i][j]);
    }
    printf("\n");
}
}

结果:
时间成本:1
28 23 18
41 34 27
54 45 36
多线程:

#include <stdio.h>
#include <pthread.h>
#include <malloc.h>
#include <sys/time.h>
#define M 3
#define K 2
#define N 3

/*structure for passing data to thread*/
struct v
{
    int i;
    /*row*/
    int j;
    /*column*/
};
void create_and_pass(struct v *data);
void* runner(void *param);
int A[M][K]={{1,4},{2,5},{3,6}};
int B[K][N]={{8,7,6},{5,4,3}};
int C[M][N];

int main(int argc, char* argv[])
{
/*We have to create M*N worker threads*/
    int begin = clock();
    int i,j;
    for(i=0;i<M;i++)
    for(j=0;j<N;j++){
        struct v *data = (struct v *)malloc(sizeof(struct v));
        data->i=i;
        data->j=j;
        /*Now create the thread passing it data as a parameter*/
        create_and_pass(data);
    }
    int end = clock();
    printf("花费时间:%d\n",end-begin);
        for(i=0;i<M;i++){
            for(j=0;j<N;j++){
                printf("%d ",C[i][j]);
            }
            printf("\n");
        }
}
void create_and_pass(struct v *data)
{
    pthread_t tid;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_create(&tid,&attr,runner,(void *)data);
    pthread_join(tid,NULL);
}
void* runner(void *param)
{
    struct v *data = param;
    int result = 0;
    int m;
    for(m=0;m<K;m++)
        result+=A[data->i][m]*B[m][data->j];
    C[data->i][data->j]=result;
}

结果:
时间成本:1163
28 23 18
41 34 27
54 45 36

请帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

主线程创建并启动工作线程,并立即加入它。连接是阻塞操作,这意味着在此完成之前不会启动任何其他线程。有效地执行是顺序的,具有内存分配,线程创建等的所有开销

您也不太可能在这么小的数据集上看到任何收益。