多核架构及编程技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《多核架构及编程技术》设计报告
基于OpenMP的二维方阵相乘及
基于IPP的函数DFT及反变换
学院:电子信息学院
专业:通信工程
学号: 2011301200237
姓名:叶子童
指导老师:谢银波
时间: 2013年6月
基于OpenMP的二维方阵相乘
姓名:叶子童专业:通信工程学号:2011301200237 指导教师:谢银波
[设计原理]
声明3个800阶的矩阵,用srand函数对A,B矩阵随机赋值,在主程序中用3个for循环来进行计算,用OpenMP实现循环并行化,用clock()函数统计运算时间并输出时间及C矩阵。

[主要功能]
计算2个随机生成的800阶二维矩阵相乘的结果,统计运算时间并输出结果矩阵。

[设计的主要内容]
实验代码为:
#include"stdafx.h"
#include<omp.h>
#include<stdio.h>
#include"stdlib.h"
#include<time.h>
#include<windows.h>
int a[800][800], b[800][800], c[800][800];
int main()
{
int i, j, t, k;
double duration;
clock_t start, finish;
for (int i=0;i<800;i++)
for (int j=0;j<800;j++)
a[i][j]=rand()%100; //随机产生-100的随机整数
for (int i=0;i<800;i++)
for (int j=0;j<800;j++)
b[i][j]=rand()%100;
start=clock();
#pragma omp parallel shared(a,b,c) private(i,j,k)
#pragma omp for schedule(dynamic) //循环动态分割成大小为chunk的块,动态分割给线程for(i=0;i<800;i++)
{ for(j=0;j<800;j++)
{ c[i][j]=0;
for(k=0;k<800;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
printf( "Time to do the calculate is ");
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%2.6f seconds\n", duration );
Sleep(2000);
for(i = 0;i < 800;i++)
{
for(j = 0;j < 800;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
return 0;
}
输出的运算时间为3.483s。

基于IPP的函数DFT及反DFT变换
[设计原理]
用DFT_RToC_32f32fc(Ipp32f* pSrc, Ipp32fc*pDst, int len)函数实现DFT,用DFTInv_CToR_32f32fc(Ipp32f*pSrc2, Ipp32fc*pDst, int len)实现IDFT,在主程序中用ippsVectorJaehne_32f(pSrc,len,1.0);产生函数y=|sin(e x)|,直接调用2个函数进行运算,用spview显示图像。

[主要功能]
求函数y=|sin(e x)|在区间(0—5120)做单位采样后的DFT 及IDFT变换结果,并输出图像。

[设计的主要内容]
实验代码为:
#include "stdafx.h"
#include "ipp.h"
#include "tools.h"
#include "stdio.h"
#include "math.h"
#include "time.h"
void DFT_RToC_32f32fc(Ipp32f* pSrc, Ipp32fc*pDst, int len)
{
IppsDFTSpec_R_32f *pDFTSpec;
ippsDFTInitAlloc_R_32f( &pDFTSpec, len, IPP_FFT_DIV_INV_BY_N,
ippAlgHintFast );
ippsDFTFwd_RToCCS_32f(pSrc, (Ipp32f*)pDst, pDFTSpec, 0 );
ippsConjCcs_32fc_I(pDst, len);
ippsDFTFree_R_32f(pDFTSpec);
}
void DFTInv_CToR_32f32fc(Ipp32f*pSrc2, Ipp32fc*pDst, int len)
{
IppsDFTSpec_R_32f *pDFTSpec;
ippsDFTInitAlloc_R_32f( &pDFTSpec, len, IPP_FFT_DIV_INV_BY_N,ippAlgHintFast );
ippsDFTInv_CCSToR_32f((Ipp32f*)pDst,pSrc2,pDFTSpec,0);
ippsConjCcs_32fc_I(pDst, len);
ippsDFTFree_R_32f(pDFTSpec);
}
int main(int argc, char* argv[])
{
Ipp64u start,stop;
int len=512;
int r;
Ipp32f* pSrc =ippsMalloc_32f(len);
Ipp32fc* pDst= ippsMalloc_32fc(len);
Ipp32f* pDstMag= ippsMalloc_32f(len);
Ipp32f* pSrc2= ippsMalloc_32f(len);
for(r=0;r<len;r++)
pSrc[r]=fabs(sin(exp((double)r)));
// ippsVectorJaehne_32f(pSrc,len,1.0);
start=ippGetCpuClocks();
DFT_RToC_32f32fc(pSrc, pDst, len);
stop=ippGetCpuClocks();
printf("DFT转换需要经过循环的次数:%d\n",(stop-start));
spView_32f( pSrc,len,"原图像", 1 );
ippsMagnitude_32fc(pDst, pDstMag, len);
spView_32f( pDstMag,len,"DFT", 1 );
DFTInv_CToR_32f32fc(pSrc2,pDst,len);
spView_32f( pSrc2,len,"DFTI", 1);
ippsFree(pDst);
ippsFree(pSrc);
ippsFree(pDstMag);
ippsFree(pSrc2);
return 0;
经过DFT曲线为:
转换的时间为:63us
作反DFT变化后的曲线为:
原函数的图像为:
采用了多线程的方法。

相关文档
最新文档