使用win32线程的矩阵乘法

Posted

技术标签:

【中文标题】使用win32线程的矩阵乘法【英文标题】:Matrix Multiplication Using win32 threads 【发布时间】:2011-05-20 02:15:29 【问题描述】:

我有一个运行代码,其中包含 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 对于多线程来说太小了。不要指望任何加速。您将无法分摊产生线程的成本。 Matrix Multiplication Using win32 threads的可能重复 @Aater Suleman .. 这只是为了演示我并不关心加速:) @Eric 另一个问题也是我的 .. 但它已经解决了 那是另一个问题 :) 【参考方案1】:

正如一些 cmets 所指出的,您不会在 3x3 矩阵上看到任何性能提升。产生新线程的成本太高了。

一般来说,您可以尝试线程安全的任务队列。本质上,只是一个在正确位置带有信号量的普通队列。将所有仍需计算的索引放入队列中。每个线程从队列的前面获取下一个索引(删除它),然后在从队列中获取另一个作业之前计算并填充解决方案矩阵的适当单元格。在我看来,线程安全的队列实现相当普遍,因此不难找到适合您的目的。

这有一个额外的好处,即您可以实时添加更多线程,或者如果您愿意,可以删除一些线程。它是一种更通用的并行化事物的方式。

【讨论】:

【参考方案2】:

我怀疑问题的一部分可能出在你的 threadproc 中的这一行:

int avg=4*4/9;

这将是一个常数 1,这可能不是您想要的(16/9,因为 int 是 1(提醒 7))。这反过来意味着你的外循环 (n) 只会执行一次。

【讨论】:

以上是关于使用win32线程的矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

大矩阵的Opencv乘法

Java中的多线程矩阵乘法

使用 CUDA 进行矩阵乘法:2D 块与 1D 块

numpy/pandas矩阵乘法的多线程?

C++中的多线程矩阵乘法

在矩阵乘法中使用 C++2011 线程而不是 OpenMP 时出现异常加速