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;
}
}
}
运行结果如下: