資源簡介
使用Win32 API的相關知識實現矩陣的乘法運算,使用C++編寫的并行實現矩陣的乘法運算

代碼片段和文件信息
//?Cannon.cpp?:?定義控制臺應用程序的入口點。
#include?“StdAfx.h“
#include?“omp.h“
#include?“conio.h“
#include?“stdio.h“
#include?“stdlib.h“
#include?“math.h“
#define?N?160
void?MoveDataBlockLine_A(?int?A[][N]?int?lineNumber?)?//?A?左移一塊
{
int?ij?k?jump=N/4;
int?tmp[N/4][N/4];
for(?i=0;?i for(?j=0;?j tmp[i][j]?=?A[i+jump*lineNumber][j];?//?保存塊?A(i0)
for(?k=0;?k<3;?k++?)
{
for(?i=0;?i for(?j=0;?j A[i+jump*lineNumber][j+jump*k]?=?A[i+jump*lineNumber][j+jump*(k+1)];
}
for(?i=0;?i for(?j=0;?j A[i+jump*lineNumber][j+jump*3]?=?tmp[i][j];
}
void?MoveDataBlockLine_B(?int?B[][N]?int?lineNumber?)?//?B?上移一塊
{
int?ij?k?jump=N/4;
int?tmp[N/4][N/4];
for(?i=0;?i for(?j=0;?j tmp[i][j]?=?B[i][j+jump*lineNumber];?//?保存塊?b(0j)
for(?k=0;?k<3;?k++?)
{
for(?i=0;?i for(?j=0;?j B[i+jump*k][j+jump*lineNumber]?=?B[i+jump*(k+1)][j+jump*lineNumber];
}
for(?i=0;?i for(?j=0;?j B[i+jump*3][j+jump*lineNumber]?=?tmp[i][j];
}
void?MutiplyBlock(?int?A[][N]?int?B[][N]?int?C[][N]?int?bi?int?bj?)
{
int?ijjump=N/4;
for(?i=0;?i for(?j=0;?j C[i+jump*bi][j+jump*bj]?+=?A[i+jump*bi][j+jump*bj]?*?B[i+jump*bi][j+jump*bj];
}
int?main()
{
FILE?*fpA?*fpB?*fpC;
int?i?j?k?jump=N/4;
int?A[N][N]?B[N][N]?C[N][N];
printf(?“\n開始?計算?...“?);
fpA?=?fopen(?“A.txt“?“w+“?);
fpB?=?fopen(?“B.txt“?“w+“?);
/*?賦初值?*/
for(?i=0;?i for(?j=0;?j {
A[i][j]?=?rand()%100;??fprintf(?fpA?“\n?A[%d][%d]?=?%d?“?i?j?A[i][j]?);
B[i][j]?=?rand()%100;??fprintf(?fpB?“\n?B[%d][%d]?=?%d?“?i?j?B[i][j]?);
C[i][j]?=?0;
}
fclose(fpA);
fclose(fpB);
//?設置?omp?線程數
omp_set_num_threads(?2?);
if(?N?%?4?==?0?)
{
#pragma?omp?parallel?shared(?A?B?C?)?private(?ij?)
{
#pragma?omp?sections
{
//?第一次移動數據
#pragma?omp?section??//?一個線程用來移動A的上半部分?和?B的左半部分
{
printf(“\n?Sections?1?thread?number?%d?“?omp_get_thread_num()?);
MoveDataBlockLine_A(?A?1?);
MoveDataBlockLine_A(?A?2?);
MoveDataBlockLine_A(?A?2?);
MoveDataBlockLine_A(?A?3?);
MoveDataBlockLine_A(?A?3?);
MoveDataBlockLine_A(?A?3?);
}
#pragma?omp?section??//?一個線程用來移動A的下半部分?和?B的右半部分
{
printf(“\n?Sections?1?thread?number?%d?“?omp_get_thread_num()?);
MoveDataBlockLine_B(?B?1?);
MoveDataBlockLine_B(?B?2?);
MoveDataBlockLine_B(?B?2?);
MoveDataBlockLine_B(?B?3?);
MoveDataBlockLine_B(?B?3?);
MoveDataBlockLine_B(?B?3?);
}
}
}
//?開始循環計算
???//?先進行計算然后再移動數據
for(?k=0;?k<4;?k++?)
{
#pragma?omp?parallel?shared(?A?B?C?)?private(?ij?)
{
#pragma?omp?sections
{
#pragma?omp?section?//?一個線程用來移動A的下半部分?和?B的右半部分
{
printf(“\n?Setct
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????4198??2012-03-26?20:17??Cannon.cpp
- 上一篇:八皇后圖形演示 C++的
- 下一篇:c++/mfc編寫的網絡電話,網絡語音 程序
評論
共有 條評論