2011-05-20 83 views
2

我不知道我的代碼有什麼問題...它總是在所有元素中返回零。一個暗示問題的地方將是偉大的:)使用win32線程的矩陣乘法

#include <iostream> 
#include <stdio.h> 
#include <cstdlib> 
#include <ctime> 
#include <windows.h> 

using namespace std; 

int nGlobalCount = 0; 
int thread_index = 0; 
int num_of_thr=5; 

int a[4][4], b[4][4], c[4][4]; 
int i, j, k; 

struct v { 
    int i; /*row*/ 
    int j; /*column*/ 
}; 

DWORD ThreadProc (LPVOID lpdwThreadParam) { 
    // 
    struct v *input = (struct v *)lpdwThreadParam; 
    int avg=4*4/num_of_thr; 
    int count=0; 

    for(int i = 0; i <= 3 ; i++) { 
     for(int j = 0; j <= 3; j++) { 
      int sum=0; 
      for (k = 0 ; k <= 3; k++) { 
       sum=sum+((a[input->i][k])*(b[k][input->j])); 
       c[input->i][input->j]=sum; 
       count++; 
      } 
     } 
    } 

    //Print Thread Number 
    //printf ("Thread #: %d\n", *((int*)lpdwThreadParam)); 
    //Reduce the count 
    return 0; 
} 

int main() { 
    // int x=0; 
    cout<<"enter no of threads : "; 
    cin>>num_of_thr; 
    DWORD ThreadIds[num_of_thr]; 
    HANDLE ThreadHandles[num_of_thr]; 
    //struct v { 
    // int i; /*row*/ 
    // int j; /*column*/ 
    //}; 

    struct v data[num_of_thr]; 
    int i , j , k; 

    for (int i = 0 ; i <= 3; i++) { 
     for (int j = 0 ; j <= 3 ; j++) { 
      a[i][j] = rand() % 10; 
      b[i][j] = rand() % 10; 
      c[i][j] = 0; 
     } 
    } 

    for(int i = 0; i < num_of_thr/2; i++) { 
     for(int j = 0; j < num_of_thr/2; j++) { 
      data[thread_index].i = i; 
      data[thread_index].j = j; 

      ThreadHandles[thread_index] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProc, &data[thread_index], 0,&ThreadIds[thread_index]); 

      thread_index++; 
     } 
    } 

    WaitForMultipleObjects(num_of_thr, ThreadHandles, TRUE, INFINITE); 
    cout<<"The resultant matrix is "<<endl; 
    for (i = 0 ; i < 4; i++) { 
     for (j = 0 ; j < 4 ; j++) 
      cout<<c[i][j]<<" "; 
     cout<<endl; 
    } 
    for (int i=0; i<num_of_thr; i++) 
     CloseHandle(ThreadHandles[i]); 
    return 0; 
} 

回答

1

有幾件事情,我發現,而除了其他問題戳大約前面所提到的:

  • 您怎樣編寫本?使用VC++ 2010,它「工作」,因爲它輸出非零值,儘管它抱怨DWORD ThreadIds[num_of_thr];數組聲明的數組大小非常數(我只是將num_of_thr設爲常量,並將cin註釋爲快速測試它)。如果num_of_thr爲0,這可以解釋零輸出。一個簡單的cout這裏爲num_of_thr將是有用的。
  • 在你的數據初始化循環從for(int i = 0; i < num_of_thr/2; i++) {開始,你不能正確地計數將導致數組下溢或溢出的線程。例如,如果num_of_thr是5,那麼num_of_thr/2是2,這導致僅初始化元素0..3而使最後一個元素未初始化。數組下溢在技術上沒有問題,儘管後面的CloseHandle()調用在嘗試釋放基本上隨機的句柄時會失敗。如果輸入更多線程,則會溢出所有陣列(例如,使用num_of_thr=10進行嘗試)。
  • 如果它仍然不起作用,請嘗試刪除線程以查看線程或代碼本身是否是問題的根源。例如,您可以在循環中手動調用ThreadProc()函數,而不是從線程內調用函數。通過調試程序跟蹤程序或輸出日誌到stdout/file(這也可以在線程模型中使用)。
  • 而不是一個隨機源矩陣,我會首先使用一些固定值與已知的結果。這將更容易確定代碼是否實際計算了正確的結果。
+0

感謝它爲9個線程(即每個線程在一個元素上操作)的數量工作,但仍然不適用於較少的線程數。我想我應該重做初始化循環,正如你所說:)謝謝 – Loka 2011-05-20 02:25:53

2

在一個概述,你的循環中的總和聲明看起來粗略。

for(int i = 0; i <= 3 ; i++) { 
    for(int j = 0; j <= 3; j++) { 
     for (k = 0 ; k <= 3; k++) 

      { 
      int sum=sum+((a[input->i][k])*(b[k][input->j])); // this declaration seems wrong 
      c[input->i][input->j]=sum; 
      count++; 
      } 
     } 
    } 

你重新聲明和每個內循環,這實際上使得0您可能需要一個或兩個迴路從取決於你想要達到的目的的分配移動的聲明。

+0

是啊謝謝你..我編輯它..仍然是零:)雖然:) – Loka 2011-05-20 01:48:44

2

你是否意識到你有兩個獨立的變量名爲a,b和c?一個是main函數的局部,另一個是整個程序的靜態。我懷疑這不是你想要的。嘗試刪除本地主要的一個。

馬丁

+0

謝謝,我編輯它。 – Loka 2011-05-20 01:41:16

+0

@Loka:你是否嘗試過編輯它之後運行代碼?這可能是你的問題的根源。 – ildjarn 2011-05-20 01:42:11

+0

是的,我嘗試過,但仍然爲零:) – Loka 2011-05-20 01:48:14