使用Windows API 编写按行分配的计算矩阵向量相乘的并行程序

水了一学期的院选修,万万没想到期末考试还有比较硬核的编程题,居然还涉及到多线程了,而且是调用Windows接口函数写多线程。虽然学汇编的时候有所了解,但毕竟没尝试过,思来想去,写出了下面的蹩脚代码,不足之处还望各位批评指正。题目描述如下:

采用windows接口函数,编写一个计算矩阵向量相乘的并行程序,矩阵按行划分后分别散发到不同的线程中,向量被复制到各个线程中,程序执行结束时,由主线程输出结果向量。假设矩阵定义为浮点型数组A[64][64],向量定义为浮点型数组y[64],结果向量存放到浮点型数组z[64]中,所用处理器有8个计算核。

开始分析:如果把矩阵按行分配给不同线程的话,很明显每个线程应该被分配八行。由于对不同行的矩阵进行操作不会发生冲突,所以连线程的同步机制都用不到,就是简单的编写一个计算矩阵向量相乘的线程函数,然后创建多个线程执行就可以了。代码实现如下:

1 #include
 2 #include
 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均可,学到了学到了。只有犯错了才能学的更透彻啊😭

Original: https://www.cnblogs.com/xiao-qi-w/p/13155406.html
Author: 郭小柒w
Title: 使用Windows API 编写按行分配的计算矩阵向量相乘的并行程序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588497/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MSSQL中UPDATE与 INNER JOIN联用的语法结构

    | 0.16分钟 | 267.2字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/4/30 PM9:36 | 系列 | 已完成…

    Java 2023年6月5日
    085
  • 接口和包–Java学习笔记

    interface定义:没有字段的抽象类 interface person{ void hello(); String getName(); } /*接口本质上就是抽象类 abst…

    Java 2023年6月8日
    0101
  • InnoDB学习(八)之 聚簇索引

    InnoDB中,表数据文件本身就是以主键为索引的B+树,树的叶子节点存放一条条表数据,此索引树被称为表的聚簇索引。聚簇索引也称为聚集索引,聚类索引,簇集索引,聚簇索引确定表中数据的…

    Java 2023年6月8日
    0104
  • AnotherRedisDesktopManager下载安装与连接Redis数据库

    一、AnotherRedisDesktopManager下载 作者在gitee与github上皆提供了下载 gitee下载地址:AnotherRedisDesktopManager…

    Java 2023年6月8日
    089
  • 设计模式 — Builder(构建器)

    构建器(Builder) 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化) 在软件系统中,有时候面临着”一个复杂对象&#8221…

    Java 2023年6月16日
    064
  • JAVA三元运算符空指针引用的坑

    有以下代码: 很多人以为会输出:null,其实会报空指针异常 原因是编译后包装类型会拆箱: Long y = true ? x : 100L ; 反编译后变为:Long y = t…

    Java 2023年5月29日
    058
  • NoteOfMySQL-08-视图

    视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。 1. 视图概述 视图中保存的仅仅是一条select…

    Java 2023年6月5日
    081
  • Jquery $(this).attr和$(this).val用法示例

    以下是个人心得整理,有兴趣朋友可以参考参考 $(this).attr(key); 获取节点属性名为key的值,相当于getAttribute(key)方法 $(this).attr…

    Java 2023年6月5日
    084
  • 网络编程中TCP基础巩固以及Linux打开的文件过多文件句柄的总结

    1.TCP连接(短链接和长连接) 什么是TCP连接?TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通…

    Java 2023年6月9日
    076
  • Windows 资源管理器 CPU100%

    Windows 资源管理器 CPU100% win + R打开运行框并输出:services.msc 点击确定打开服务;将服务中的Problem Reports Control P…

    Java 2023年6月14日
    0101
  • Java项目实战——瑞吉外卖Day07(优化篇二)

    读写分离 问题分析 Mysql主从复制 介绍 MysSQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志功能。就是一台或多台AysQL数据库(slave…

    Java 2023年5月29日
    069
  • 【翻译】2 序列化过滤

    来源:Java官方文档 译者的话 由于译者的英文水平和编程水平都不高,不理解原文中的一些概念,一些句子也不知道如何翻译。对不知如何翻译的内容,译者使用了机器翻译,并在译文后面的括号…

    Java 2023年6月6日
    086
  • 2022.18 Java 类加载回顾总结

    Java类的生命周期如下图: 主要包括加载、连接、初始化、使用、卸载几个阶段,其中类加载是最先要做,它是JVM运行时如何把用户编译后的class文件转成二进制字节流的过程,要解决从…

    Java 2023年5月29日
    0105
  • SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践

    在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量。当数据量继续增长时,数据的 &#x67E5;&#x8BE2;&#x6027;&a…

    Java 2023年6月6日
    078
  • Java编辑器的下载和应用——IDEA

    IDEA下载 (1)搜索 IntelliJ IDEA,选择电脑适合的版本下载(跟着指示一步步安装就好了) (2)安装完成后打开,创建一个空项目(在之后的学习中可把所有的代码放这里,…

    Java 2023年6月6日
    051
  • SSM开发环境通用依赖(可直接拷贝)

    mysql mysql-connector-java 5.1.43 com.alibaba druid 1.1.1 org.mybatis mybatis 3.4.1 org.sp…

    Java 2023年6月9日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球