- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 1
软件开发实训报告
课程名称:软件开发实践
班级:
完成日期:2011/6/27
姓名:
学号:
指导教师:
实验名称:矩阵乘优化软件
实验序号:
实验成绩:
一、实验名称
矩阵乘优化软件
二、实验目的及要求
1.C语言实现矩阵x向量算法
2.矩阵要求CSR压缩存储格式,测试集选用佛罗里达州立大学测试集
/research/sparse/matrices//
3.SSE优化,LOOP unrolling,software prefetch软件预取,多线程并行
4.给出测试界面,运行时间及加速比结果
三、实验环境
操作系统(开发):Windows 7/Windows XP
编程软件(开发):Microsoft Visual Studio 2008
操作系统(测试):Windows 7
硬件环境(测试):Acer 4741G,i5双核处理器 460M
四、实验内容
根据实验要求,按照路径组合的形式将其分为三类:
(1)读入数据至内存方式:单线程读取文件、多线程读取文件、CSR格式读入
(2)乘法计算:单线程、多线程
(3)SSE优化:有SSE优化、无SSE优化
3*2*2=12种 再加上传统算法 一共13种算法组合
五、算法描述及实验步骤?
(1)程序使用WIN32提供的多线程编程的接口(windows.h)函数实现,实验中用到的函数如下:
HANDLE h = CreateThread(NULL,0,MulThread,pParam,0,NULL);//创建多线程
DWORD WINAPI MulThread(LPVOID pParam);//线程函数
WaitForSingleObject(h,INFINITE);//等待线程完成
MulParam * pParam = (MulParam *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(MulParam));//为线程分配数据,实现传参
MulParam * p = (MulParam *)pParam; //线程内读取参数
HeapFree(GetProcessHeap(),0,pParam);//线程内结束后销毁参数
HANDLE hMutex = CreateMutex(NULL,FALSE,NULL);//创建互斥变量
WaitForSingleObject(hMutex,INFINITE);//进入临界区
ReleaseMutex(hMutex);//退出临界区
HANDLE inputSemaphore; //创建信号量
WaitForSingleObject(inputSemaphore,INFINITE);//查看临界资源是否剩余
ReleaseSemaphore(inputSemaphore,1,NULL);//释放临界资源
(2)使用消费者模型实现文件预取,具体实现是在内存中申请一块区域作为缓存,分别被读写线程共享,读数据与模型中的消费者对应,写数据与模型中的生产者对应。使用信号量机制实现读写同步,读写操作时均要获得读锁或写锁才能操作,以实现互斥访问。具体算法实现如下:矚慫润厲钐瘗睞枥庑赖賃軔朧碍鳝绢懣硯涛镕頃赎巯驂雞虯从躜鞯烧。
queueint input;
queueint output;
HANDLE inputMutex = CreateMutex(NULL,FALSE,NULL);
HANDLE outputMutex = CreateMutex(NULL,FALSE,NULL);
/** 缓存数据使用后,将其设为可写状态 */
void PushInput(int _i)
{
WaitForSingleObject(inputMutex,INFINITE);
input.push(_i);
ReleaseMutex(inputMutex);
ReleaseSemaphore(inputSemaphore,1,NULL);
}
/** 缓存数据写满后,将其设为可读状态 */
void PushOutput(int _i)
{
WaitForSingleObject(outputMutex,INFINITE);
output.push(_i);
ReleaseMutex(outputMutex);
ReleaseSemaphore(outputSemaphore,1,NULL);
}
/** 获缓存写位置 */
int PopInput()
{
int value;
WaitForSingleObject(inputSemaphore,INFINITE);
W
文档评论(0)