2010-11-04 75 views
3

我有一個矩陣乘法代碼,通過以下 乘法做矩陣,矩陣A *矩陣B =矩陣C多線程矩陣乘法幫助用C

for(j=1;j<=n;j++) { 
for(l=1;l<=k;l++) { 
    for(i=1;i<=m;i++) { 
    C[i][j] = C[i][j] + B[l][j]*A[i][l]; 

} 
} 

現在我想將它變成多線程矩陣乘法我的代碼如下:

我使用結構

struct ij 
{ 
int rows; 
int columns; 
}; 

我的方法是

void *MultiplyByThread(void *t) 
{ 
struct ij *RowsAndColumns = t; 
double total=0; 
int pos; 
for(pos = 1;pos<k;pos++) 
{ 
    fprintf(stdout, "Current Total For: %10.2f",total); 
    fprintf(stdout, "%d\n\n",pos); 
    total += (A[RowsAndColumns->rows][pos])*(B[pos][RowsAndColumns->columns]); 
} 
D[RowsAndColumns->rows][RowsAndColumns->columns] = total; 
pthread_exit(0); 

} 

,並在我的主要是

 for(i=1;i<=m;i++) { 
     for(j=1;j<=n;j++) { 

    struct ij *t = (struct ij *) malloc(sizeof(struct ij)); 
    t->rows = i; 
    t->columns = j; 

    pthread_t thread; 
    pthread_attr_t threadAttr; 
    pthread_attr_init(&threadAttr); 
    pthread_create(&thread, &threadAttr, MultiplyByThread, t);  
    pthread_join(thread, NULL);  

     } 
     } 

但我似乎無法得到相同的結果作爲第一矩陣乘法(這是正確的) 可有人點我到正確的方向?

回答

0

實際上,您的線程代碼不是線程化的。您創建一個線程並在調用create之後通過調用聯接等待它完成。您必須創建一個mxn線程矩陣,將其全部啓動,然後將它們全部加入。除此之外,代碼似乎與循環計算相同。結果與確切的差異是什麼?

實施例(注意,不是編譯):

pthread_t threads[m][n]; /* Threads that will execute in parallel */ 

,然後在主:

for(i=1;i<=m;i++) { 
    for(j=1;j<=n;j++) { 

    struct ij *t = (struct ij *) malloc(sizeof(struct ij)); 
    t->rows = i; 
    t->columns = j; 

    pthread_attr_t threadAttr; 
    pthread_attr_init(&threadAttr); 
    pthread_create(thread[i][j], &threadAttr, MultiplyByThread, t);  
    } 
    } 

    /* join all the threads */ 
    for(i=1;i<=m;i++) { 
    for(j=1;j<=n;j++) { 
     pthread_join(thread[i][j], NULL); 
    } 
    } 

(或多或少,只是不調用pthread_join用於在循環內的每個線程)。

+0

結果出來不一樣。你加入他們的意思是什麼?我以爲那是我在做什麼。你可以給我一個例子嗎? – Kevin 2010-11-04 16:53:49

+0

這給了我一個分段錯誤。我不知道爲什麼? – Kevin 2010-11-04 17:07:34

+0

此外,我不認爲這些線程應該是雙數組本身。我相信一個線程應該在列中是單一的,然後結合在一起? – Kevin 2010-11-04 17:09:18

2

嘗試以下操作:

#pragma omp for private(i, l, j) 
for(j=1;j<=n;j++) { 
    for(l=1;l<=k;l++) { 
     for(i=1;i<=m;i++) { 
      C[i][j] = C[i][j] + B[l][j]*A[i][l]; 
     } 
    } 
} 

雖然谷歌搜索的GCC編譯器開關來啓用OpenMP,我竟然橫跨this blog post描述發生了什麼比我更好,而且還包含一個更好的例子來。

對於多核機器,大多數合理相關的編譯器都支持OpenMP,請參閱OpenMP web site以獲取更多信息。