c++向量和数组的区别_pthread多线程入门-并行计算高维向量

29d528009eb324127bb25bb3d308a95a.png

介绍pthread

​ pthread其实也可以当作C/C++的一个库,所有的函数和数据类型都在中.跟AVX一样,如果使用了pthread,在编译的时候必须加上编译参数-lpthread.使用gcc编译指令如下:

gcc filename.c -lpthread

pthread入门

​ pthread就是能让C程序的进程在运行时可以分叉为多个线程执行.例如main函数就可以分叉为下面的两个线程.

795d75a434cd414f43f41b12b87369b2.png

很容易想到,pthread使用分为三个部分:分叉,运行,合并.所有的过程都在下面的程序中给出.

#include 

使用pthread_create函数开始分叉.pthread_create函数的第一个参数就是线程的标号,第二个参数暂时用不到,给NULL就可以了;第三个参数是在该线程执行的函数,函数的签名必须返回空指针,传递空指针的参数;第四个参数传递参数,因此也必须转成空指针.

运行线程的过程就是运行4个Hello函数的过程

使用pthread_join合并,结束线程.pthread_join第一个参数是线程的标号;第二个参数暂时不用,给NULL.

多线程计算高维向量加法

目的

测试计算

维的向量加法使用AVX和普通for循环的速度差异

实验测试的数据类型为双精度浮点数double类型,两个向量由

个double类型数据组成.

废话少说,上代码.

代码

#include 

以上是main函数和每个线程执行的函数签名,具体相加的函数不是重点,放在下面.普通数组实现加法太过简单,可以参考这篇文章或者这个代码:

void 

运行结果

ad133af1a260ed131c294b759c6fbc5c.png

实验测了5次4线程的情况得到加速比为2.11.

注:程序运行在Ryzen 5 3500U上

讨论

(1)多线程程序运行时间不可能随着线程的增加一直减少,因此这里给出1个线程到11个线程的运行时间图(单位为um):

349f3520a94e19a904d6b64c1e20c088.png

(2)程序使用了两种不同的方式先计算向量加法,线程数为4时,理论(根据Amdahl定律)上最大的加速比应该为4.但是实际运行的过程中,由于多线程程序有调用函数、分配内存等额外开销,因此加速比远远没有到达4.当然,也有可能是在编译的过程中,编译器对本来不是并行的代码做了优化,把简单的for循环变成并行执行的程序,从而导致加速比低于4.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值