Win32API、MFC、.NET多线程并行求矩阵乘法(星星笔记)

1.运用Win32API实现程序如下:

// Win32API_MatrixMultiplication.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include "time.h"

HANDLE finish[2];
HANDLE finish2;
long long sum[2];

#define NN 2000  
#define end 1500
int A[NN][NN], B[NN][NN];  
long long C[NN][NN];  
// 星星笔记
DWORD WINAPI ThreadOne(LPVOID param){
	int i,j,k,start = 0;  
	for( i=start; i< end; i += 2)      
	{      
		for( j=0;j<end;j++)      
		{      
			C [i][j] = 0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}  
	for( i=start; i<end; i+=2)      
		for( j=0; j<end; j++)       
			sum[0] += C[i][j]; 
	SetEvent(finish[0]);
	return 0;
}

DWORD WINAPI ThreadTwo(LPVOID param){
	int i,j,k,start = 1;  
	for( i=start; i< end; i += 2)      
	{      
		for( j=0;j<end;j++)      
		{      
			C [i][j] = 0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}  
	for( i=start; i<end; i+=2)      
		for( j=0; j<end; j++)       
			sum[1] += C[i][j]; 
	SetEvent(finish[1]);
	return 0;
}

DWORD WINAPI ThreadThree(LPVOID param){
	long long sumserial = 0;
	int i,j,k;    
	for( i=0; i< end; i ++)      
	{      
		for( j=0;j<end;j++)      
		{      
			C[i][j]=0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}      
	for( i=0; i<end; i++)      
		for( j=0; j<end; j++)       
			sumserial += C[i][j];  
	printf("sumserial=%lld\n",sumserial);
	SetEvent(finish2);
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i,j,t;
	//--------------对矩阵A和矩阵B进行初始化-------------  
	for(i=0;i < end;i++)     
	{  
		t=i+1;  
		for(j=0;j < end;j++)  
		{  
			A[i][j]=t++;  
			B[i][j]=1;  
		}  
	}  
	clock_t starttime = clock();
	long long sumand = 0;

	finish[0] = CreateEvent(NULL ,false,false,NULL);
	finish[1] = CreateEvent(NULL ,false,false,NULL);
	finish2 = CreateEvent(NULL ,false,false,NULL);
	HANDLE thread1 = CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
	HANDLE thread2 = CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
	WaitForMultipleObjects(2,finish,true,INFINITE);

	for (int i=0;i<2;i++)
	{
		sumand +=sum[i];
	}
	clock_t endtime = clock();
	printf("sumand=%lld\n",sumand);
	printf("andtime=%d\n",endtime - starttime);

	starttime = clock();
	HANDLE thread3 = CreateThread(NULL,0,ThreadThree,NULL,0,NULL);
	WaitForSingleObject(finish2,INFINITE);
	endtime  = clock();

	printf("serialtime=%d\n",endtime - starttime);
	system("pause");
	return 0;
}
运行结果如下:

2.运用MFC实现,程序如下:

// MFC_MatrixMultiplication.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <afxmt.h>
#include <iostream>
#include <afxwin.h>
#include "time.h"
using namespace std;

#define end 1500
long long sum[2] = {0,0} ;
int A[end][end], B[end][end];  
long long C[end][end];

CEvent faxEvent1(false); 
CEvent faxEvent2(false);
CEvent faxEvent(false);
// LiuYinxing
UINT threadProc4(LPVOID param){

	int i,j,k,start = 0 ;  
	for( i=start; i< end; i += 2)      
	{      
		for( j=0;j<end;j++)      
		{      
			C [i][j] = 0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}  
	for( i=start; i<end; i+=2)      
		for( j=0; j<end; j++)       
			sum[start] += C[i][j];  
	SetEvent(faxEvent1);
	return 0;
}

UINT threadProc5(LPVOID param){

	int i,j,k,start = 1 ;  
	for( i=start; i< end; i += 2)      
	{      
		for( j=0;j<end;j++)      
		{      
			C [i][j] = 0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}  
	for( i=start; i<end; i+=2)      
		for( j=0; j<end; j++)       
			sum[start] += C[i][j];  
	SetEvent(faxEvent2);
	return 0;
}
UINT threadProc6(LPVOID param){

	long long sumserial = 0;
	int i,j,k;    
	for( i=0; i< end; i ++)      
	{      
		for( j=0;j<end;j++)      
		{      
			C[i][j]=0;      
			for( k=0; k< end;k++)      
			{      
				C[i][j]+=A[i][k]*B[k][j];      
			}      
		}      
	}      
	for( i=0; i<end; i++)      
		for( j=0; j<end; j++)       
			sumserial += C[i][j];  

	printf("sumserial=%lld\n",sumserial);
	SetEvent(faxEvent);
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	long long sumand = 0;
	int i,j,t;
	//--------------对矩阵A和矩阵B进行初始化-------------  
	for(i=0;i < end;i++)     
	{  
		t=i+1;  
		for(j=0;j < end;j++)  
		{  
			A[i][j]=t++;  
			B[i][j]=1;  
		}  
	}  
	//------------------并行计算---------------------
	clock_t starttime = clock();
	AfxBeginThread(threadProc4,NULL);
	AfxBeginThread(threadProc5,NULL);
	WaitForSingleObject(faxEvent1,INFINITE);
	WaitForSingleObject(faxEvent2,INFINITE);

	for (int i=0;i<2;i++)
	{
		sumand+=sum[i];
	}
	clock_t endtime = clock();
	printf("sumand=%lld\n",sumand);
	printf("paralleltime=%d\n",endtime - starttime);
	//---------------------串行计算------------------
	starttime = clock();
	AfxBeginThread(threadProc6,NULL);
	WaitForSingleObject(faxEvent,INFINITE);
	endtime = clock();
	printf("serialtime=%d\n",endtime - starttime);
	system("pause");

	return 0;
}
运行结果如下:


3.运用.NET实现,程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
// LiuYinxing
namespace NET_MatrixMultiplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, j, t = 0,end = 1500;
            int[,] A = new int[end,end];
            int[,] B = new int[end,end];
            //--------------对矩阵A和矩阵B进行初始化-------------  
            for (i = 0; i < end; i++)
            {
                t = i + 1;
                for (j = 0; j < end; j++)
                {
                    A[i,j] = t++;
                    B[i,j] = 1;
                }
            }  
            //-------------------并行计算------------------------

            Stopwatch stopwatch = new Stopwatch();
            Work work1 = new Work(0, end, A, B);
            ThreadStart thread1 = new ThreadStart(work1.pSumto);
            Thread newthread1 = new Thread(thread1);
            Work work2 = new Work(1, end, A, B);
            ThreadStart thread2 = new ThreadStart(work2.pSumto);
            Thread newthread2 = new Thread(thread2);
            stopwatch.Start();
            newthread1.Start();
            newthread2.Start();
            newthread1.Join();
            newthread2.Join();
            stopwatch.Stop();
            
            TimeSpan timeSpan = stopwatch.Elapsed;
            double milliseconds = timeSpan.TotalMilliseconds;
            Console.Write("parallel sum = {0}\n", (work1.getSum() + work2.getSum()));
            Console.Write("parallel time =");
            Console.Write(milliseconds);
           
            //---------------------串行计算----------------------
            stopwatch.Start();
            Console.Write("\nserial sum = {0}\n", new Work(0, end, A, B).sumto());
            stopwatch.Stop();
            TimeSpan timeSpan2 = stopwatch.Elapsed;
            double milliseconds2 = timeSpan2.TotalMilliseconds;
            Console.Write("serial time =");
            Console.Write(milliseconds2);
            Console.Read();
        }
    }
    class Work
    {
        private long sum = 0;
        private int start;
        private int end;
        private int[,] A;
        private int[,] B;
        private long[,] C; 
        public Work(int st, int en, int [,] a,int [,] b)
        {
            this.start = st;
            this.end = en;
            this.A = new int[en,en];
            this.A = a;
            this.B = new int[en, en];
            this.B = b;
            this.C = new long[en, en];
        }
        public void pSumto()
        {
            int i, j, k;
            for (i = start; i < end; i += 2)
            {
                for (j = 0; j < end; j++)
                {
                    C[i,j] = 0;
                    for (k = 0; k < end; k++)
                    {
                        C[i,j] += A[i,k] * B[k,j];
                    }
                }
            }
            for (i = start; i < end; i += 2)
                for (j = 0; j < end; j++)
                    sum += C[i,j];
        }
        public long sumto()
        {
            long sumto = 0;
            int i, j, k;
            for (i = 0; i < end; i++)
            {
                for (j = 0; j < end; j++)
                {
                    C[i,j] = 0;
                    for (k = 0; k < end; k++)
                    {
                        C[i,j] += A[i,k] * B[k,j];
                    }
                }
            }
            for (i = 0; i < end; i++)
                for (j = 0; j < end; j++)
                    sumto += C[i,j];   
            return sumto;
        }
        public long getSum()
        {
            return sum;
        }
    }
}
运行结果如下:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值