2013-02-14 126 views
0

我想使用pthreads做矩阵乘法,并为每个行的每个计算而不是每个元素创建一个线程。假设有两个矩阵 A [M] [K],B [K] [N]。我哪里错了?使用pthreads的矩阵乘法

int A[M][K]; 
int B[K][N]; 
int C[][]; 

void *runner (void *param); 


struct v 
{ 
int i; 
int j; 
}; 

pthread_t tid[M]; 

for (i = 0; i < M; i++) // It should create M threads 
{ 
    struct v *data = (struct v *) malloc (sizeof (struct v)); 
    data->i = i; 
    data->j = j; 
    pthread_create (&tid[count], &attr, runner, data); 
    pthread_join (tid[count], NULL); 
    count++; 
} 

runner (void *param) // 
{ 
    struct v *test; 
    int t = 0; 
    test = (struct v *) param; 

    for (t = 0; t < K; t++) // I want to compute it for a row instead of an element 
    { 
     C[test->i][test->j] = C[test->i][test->j] + A[test->i][t] * B[t][test->j]; 
    } 
    pthread_exit (0); 
} 
+1

除了线程创建和销毁以及同步会杀死所有性能提升的事实吗? :) – 2013-02-14 17:56:10

+0

备案,这功课?如果不是这样,那么使用内联汇编将会更有效率。正如@MichaelDorgan上面提到的那样 - 线程开销远远大于实际计算的可能性。你的代码到目前为止有什么问题?它运行/崩溃/段错误,或只是给一个不好的答案?你能给我们一些样品运行吗? – DevNull 2013-02-14 17:59:24

+0

BTW,其中是上面定义的j,struct v,K等等?您已经剪下并粘贴了不够充足的代码,以便我们完全了解这里发生了什么。只用一个带有加密命名的变量的for循环并不能帮助我们理解正在发生的事情。更多代码plz。 – 2013-02-14 18:00:47

回答

1

首先摆脱data-> j。如果你正在计算整个行,行索引是你的线程需要的唯一的东西。现在你的跑步者(..)计算一个单一的元素。您必须遍历所有行元素,逐个计算它们。 其次,创建后不要立即加入线程。这样你一次只能运行一个线程。所有线程创建完成后开始加入线程。