2013-02-14 125 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。如果你正在計算整個行,行索引是你的線程需要的唯一的東西。現在你的跑步者(..)計算一個單一的元素。您必須遍歷所有行元素,逐個計算它們。 其次,創建後不要立即加入線程。這樣你一次只能運行一個線程。所有線程創建完成後開始加入線程。