[英]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.