使用pthread执行矩阵乘法

时间:2010-03-15 09:38:18

标签: c linux gcc pthreads unix

我有两个矩阵只包含一个,每个数组都有 500行和列。因此,得到的矩阵应该是具有值 500 的所有元素的矩阵。但是,我得到 res_mat [0] [0] = 5000 。甚至其他元素也是5000. 为什么

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>

#define ROWS 500
#define COLUMNS 500
#define N_THREADS 10

int mat1[ROWS][COLUMNS],mat2[ROWS][COLUMNS],res_mat[ROWS][COLUMNS];

void *mult_thread(void *t)
{   
    /*This function calculates 50 ROWS of the matrix*/

    int starting_row;
    starting_row = *((int *)t);
    starting_row = 50 * starting_row;

    int i,j,k;
    for (i = starting_row;i<starting_row+50;i++)
        for (j=0;j<COLUMNS;j++)
            for (k=0;k<ROWS;k++)
                res_mat[i][j] += (mat1[i][k] * mat2[k][j]);
    return;
}

void fill_matrix(int mat[ROWS][COLUMNS])
{
    int i,j;
    for(i=0;i<ROWS;i++)
        for(j=0;j<COLUMNS;j++)
            mat[i][j] = 1;
}

int main()
{
    int n_threads = 10; //10 threads created bcos we have 500 rows and one thread calculates 50 rows
    int j=0;
    pthread_t p[n_threads];

    fill_matrix(mat1);
    fill_matrix(mat2);
    for (j=0;j<10;j++)
        pthread_create(&p[j],NULL,mult_thread,&j);

    for (j=0;j<10;j++)
        pthread_join(p[j],NULL);

    printf("%d\n",res_mat[0][0]);
    return 0;
}

2 个答案:

答案 0 :(得分:4)

我不知道这是否是您问题的原因,但是:

    pthread_create(&p[j],NULL,mult_thread,&j);

肯定是坏了。您正在传递j &j的地址。因此,当它实际开始时,每个线程将获得随机值0&lt; = starting_row&lt; = 9。可能最好只传递(void*)j并使用(int)j将其删除。

你也永远不会初始化res_mat,但是IIRC它无论如何都会被初始化。

编辑: starting_row的值是随机的原因是j遍历正在启动的线程和正在连接的线程之间0到9之间的所有数字。 因此,线程将在这两个线程之间的某个随机点启动,并在此时获取j的值。

答案 1 :(得分:3)

您正在向线程函数传递指向j的指针。当线程访问j时,j的值可能已经改变。只需传递(void *)j并将线程函数中的强制转换更改为starting_row = (int)t;