使用Windows API 编写按行分配的计算矩阵向量相乘的并行程序
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程题,居然还涉及到多线程了,而且是调用Windows接口函数写多线程。虽然学汇编的时候有所了解,但毕竟没尝试过,思来想去,写出了下面的蹩脚代码,不足之处还望各位批评指正。题目描述如下:
采用windows接口函数,编写一个计算矩阵向量相乘的并行程序,矩阵按行划分后分别散发到不同的线程中,向量被复制到各个线程中,程序执行结束时,由主线程输出结果向量。假设矩阵定义为浮点型数组A[64][64],向量定义为浮点型数组y[64],结果向量存放到浮点型数组z[64]中,所用处理器有8个计算核。
开始分析:如果把矩阵按行分配给不同线程的话,很明显每个线程应该被分配八行。由于对不同行的矩阵进行操作不会发生冲突,所以连线程的同步机制都用不到,就是简单的编写一个计算矩阵向量相乘的线程函数,然后创建多个线程执行就可以了。代码实现如下:
1 #include <windows.h>
2 #include <stdio.h>
3
4 double z[64]; //结果向量
5 double y[64]; //待乘向量
6 double A[64][64];//待乘矩阵
7 const int numThreads = 8;//线程数
8
9 DWORD WINAPI threadFunction(LPVOID pArg) {
10 int myNum = *((int *)pArg); //获取本线程所需参数
11 int n = myNum + 8; //设置外层循环上界
12 for(int i = myNum; i < n; ++i){//相乘计算的具体步骤
13 for(int j = 0; j < 64; ++j)
14 z[i] += A[i][j] * y[i];
15 }
16 return 0;
17 }
18
19 int main() {
20 HANDLE threadHandles[numThreads];//线程数组
21 int tNum[numThreads];//用于传给线程的参数数组
22
23 printf("请输入矩阵:\n");
24 for(int i = 0; i < 64; ++i)
25 for(int j = 0; j < 64; ++j)
26 scanf("%lf", &A[i][j]);
27
28 printf("请输入向量:\n");
29 for(int i = 0; i < 64; ++i)
30 scanf("%lf", &y[i]);
31
32 printf("相乘后的结果向量为: \n");
33
34 for(int i = 0; i < numThreads; ++i) {
35 tNum[i] = i * 8; //给传给线程的参数赋值
36 threadHandles[i] = CreateThread( NULL, // 安全属性
37 0, // 栈大小
38 threadFunction, // 传给线程的函数
39 (LPVOID)&tNum[i],// 传给线程的参数
40 0, // 线程创建后立即激活
41 NULL); // 新线程的id会被传给这个参数所在的变量
42 }
43 WaitForMultipleObjects( numThreads, // 等待的线程数
44 threadHandles, // 等待的线程数组
45 TRUE, // 等待所有信号量有效在往下执行
46 INFINITE); // 表示无穷等待
47 for(int i = 0; i < 64; ++i) //输出结果向量
48 printf("%.2lf ", z[i]);
49 return 0;
50 }
至此,已经解决问题了。还好题目要求不是特别难,也算是通过一段代码初步了解如何使用Windows接口函数编写多线程了。不得不说C语言确实强大,可惜我基础不扎实加上现在又忘得差不多了,写这段代码时居然想通过scanf("%f",&变量名)来输入double类型的值,迟迟得不到预期结果。我还以为是多线程惹的祸,得亏调试了一下才知道原来我连值都没有正确输进去,double类型的输入格式必须是%lf,输出的话%f和%lf均可,学到了学到了。只有犯错了才能学的更透彻啊
使用Windows API 编写按行分配的计算矩阵向量相乘的并行程序的更多相关文章
- C++开发与Windows API
Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...
- Windows API的消息处理机制
上个学期找实习失利,让我觉得自己基础打得不够牢固,所以在华为实习的这三个月里,每天下班都在复习理论课的知识,顺便刷了一个月的 LeetCode.本来以为找工作是势在必得了,结果这个学期秋季校招的坑爹经 ...
- 学习:Windows API核心DLL文件
在 Windows 的系统目录中,存在着很多的动态链接库文件(DLL 文件).这些 DLL 文件中包括了 Windows API 函数可执行程序. DLL 将各函数"导出",这样应 ...
- Python调用Windows API函数编写录音机和音乐播放器
功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: 运行界面:
- 浅谈Windows API编程
WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- VC Windows API获得桌面所有窗口句柄的方法
VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...
- Windows API学习---用户方式中的线程同步
前言 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, Micrsoft Windows的运行性能最好.但是,线程很少能够在所有的时间都独立地进行操作.通常情况下,要生成一些线程来处理 ...
- 关于Windows API、CRT和STL二三事
1.本文编写目的 本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...
- 一些Windows API导致的Crash以及使用问题总结
RegQueryValueEx gethostbyname/getaddrinfo _localtime64 FindFirstFile/FindNextFile VerQueryValue Crea ...
随机推荐
- 如何让 3D 数字孪生场景闪闪发光
今日图扑软件功能分享:我们将探讨 HT 系统如何通过分组管理灯光.裁切体和流光,以提高场景光影效果的精准度和整体可控性. HT 中的灯光.裁切体.流光是会影响它所在区域一定范围内的其他节点的表现,如 ...
- MyBatis-Plus 整理
# 前言 代码生成器插件选择去这里:https://www.cnblogs.com/zixq/p/16726534.html 相关插件在那里面已经提到了 # 上手 MyBatis-Plus 是一个 M ...
- 原创软件 | 第3期:PDF合并分割助手V1.0(个人免费)
这是一个短的"发布会". 01 基本介绍 近期开发了一个[PDF合并分割助手]. 它是一个实现pdf快速合并.分割的免费软件. 你拥有以下7种选项设置. >>合并选项& ...
- SQL Server 查询分析及优化方法
一.影响速度的因素 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/O吞吐量小,形成了瓶颈效应 没有创建计算列导致查询不优化 内存不足 网络速度慢 查询出的数据量过大(可以采 ...
- Django 不通过外键实现多表关联查询
Django不通过外键实现多表关联查询 by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 需求 不通过外键,使 ...
- 【数学建模导论】Task01 数据处理与拟合模型
0 前言 感谢 DataWhale 的开源学习课程 intro-mathmodel,项目仓库在这. 现在开始,跟着Task01 进入数据类的学习,实现每一个代码,包括数据预处理.回归分析与分类分析.假 ...
- 【Spring Data JPA】02 快速上手
完成一个CRUD - 创建工程导入依赖坐标 - 配置Spring的配置文件 - 配置ORM的实体类,绑定映射关系 - 编写一个符合SpringDataJpa的dao接口 Maven依赖坐标 <p ...
- 全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类
全网最适合入门的面向对象编程教程:30 Python 的内置数据类型-object 根类 摘要: 在 Python 中,所有的类都直接或间接继承自一个根类,这个根类是Object.Object类是 P ...
- Jax报错:Windows系统环境下WSL中运行Jax会导致nvidia-smi报错退出,无法使用nvidia-smi和gpustat
环境: Window11下的WSL: 运行jax,导致nvidia-smi无法使用,不过经过测试发现虽然nvidia-smi报错无法使用,但是GPU已经可以正常使用,调用jax的GPU运行也保持正常, ...
- iOS开发基础148-ABM vs MDM
Apple Business Manager (ABM) vs. Mobile Device Management (MDM) Apple Business Manager (ABM) 优点: 集中管 ...