簡體   English   中英

使用Win32線程進行矩陣乘法

[英]Matrix Multiplication Using win32 threads

我有一個具有9個線程的運行代碼,可在3 * 3矩陣上進行操作..我想將線程數作為用戶的輸入。但是我不能僅在4個線程上划分矩陣。 任何幫助,將不勝感激。 謝謝 :)

#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=9;

int a[3][3] , b[3][3] , c[3][3];
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/9;
   for(int n=0; n<avg; n++) {
      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;
        if(j<3 && avg!=1)
            j=j+1;
        else if (j==3 && avg!=1 && (avg-n)!=1)
            i=i+1;

        }
    }

cout<<"the number of the thread "<<thread_index<<endl;
return 0;

}
int main() {

DWORD ThreadIds[9];
HANDLE ThreadHandles[9];

struct v data[9];

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 < 3; i++) {
    for(int j=0 ; j <3; 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 matrix A is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<a[i][j]<<" ";
    cout<<endl;
    }
cout<<"The  matrix B is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<b[i][j]<<" ";
    cout<<endl;
    }
    cout<<"The resultant matrix is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<c[i][j]<<" ";
    cout<<endl;
    }
for (int i=0; i<9; i++) CloseHandle(ThreadHandles[i]);
return 0;
}

正如一些評論所指出的那樣,您不會在3x3矩陣上看到任何性能啟動。 產生新線程的成本太高。

通常,您可以嘗試線程安全的任務隊列。 本質上,只是一個普通隊列,在正確的位置放置了信號燈。 將所有仍需要計算的索引放入隊列。 每個線程從隊列的最前面獲取下一個索引(將其刪除),然后計算並填充解決方案矩陣的相應單元格,然后再從隊列中獲取另一個作業。 在我看來,線程安全隊列的實現相當普遍,因此為您的目的找到一個隊列並不難。

這具有額外的好處,您可以實時添加更多線程,也可以根據需要刪除一些線程。 這是使事物並行化的更通用的方式。

我懷疑部分問題可能出在您的threadproc內部的這一行中:

int avg=4*4/9;

這將是常數1,可能不是您想要的常數(因為int為1,所以16/9為整數(提示7))。 這又意味着您的外循環(n)僅執行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM