![29d528009eb324127bb25bb3d308a95a.png](https://img-blog.csdnimg.cn/img_convert/29d528009eb324127bb25bb3d308a95a.png)
介绍pthread
pthread其实也可以当作C/C++的一个库,所有的函数和数据类型都在中.跟AVX一样,如果使用了pthread,在编译的时候必须加上编译参数-lpthread.使用gcc编译指令如下:
gcc filename.c -lpthread
pthread入门
pthread就是能让C程序的进程在运行时可以分叉为多个线程执行.例如main函数就可以分叉为下面的两个线程.
![795d75a434cd414f43f41b12b87369b2.png](https://img-blog.csdnimg.cn/img_convert/795d75a434cd414f43f41b12b87369b2.png)
很容易想到,pthread使用分为三个部分:分叉,运行,合并.所有的过程都在下面的程序中给出.
#include
使用pthread_create函数开始分叉.pthread_create函数的第一个参数就是线程的标号,第二个参数暂时用不到,给NULL就可以了;第三个参数是在该线程执行的函数,函数的签名必须返回空指针,传递空指针的参数;第四个参数传递参数,因此也必须转成空指针.
运行线程的过程就是运行4个Hello函数的过程
使用pthread_join合并,结束线程.pthread_join第一个参数是线程的标号;第二个参数暂时不用,给NULL.
多线程计算高维向量加法
目的:
测试计算
实验测试的数据类型为双精度浮点数double类型,两个向量由
废话少说,上代码.
代码:
#include
以上是main函数和每个线程执行的函数签名,具体相加的函数不是重点,放在下面.普通数组实现加法太过简单,可以参考这篇文章或者这个代码:
void
运行结果
![ad133af1a260ed131c294b759c6fbc5c.png](https://img-blog.csdnimg.cn/img_convert/ad133af1a260ed131c294b759c6fbc5c.png)
实验测了5次4线程的情况得到加速比为2.11.
注:程序运行在Ryzen 5 3500U上
讨论
(1)多线程程序运行时间不可能随着线程的增加一直减少,因此这里给出1个线程到11个线程的运行时间图(单位为um):
![349f3520a94e19a904d6b64c1e20c088.png](https://img-blog.csdnimg.cn/img_convert/349f3520a94e19a904d6b64c1e20c088.png)
(2)程序使用了两种不同的方式先计算向量加法,线程数为4时,理论(根据Amdahl定律)上最大的加速比应该为4.但是实际运行的过程中,由于多线程程序有调用函数、分配内存等额外开销,因此加速比远远没有到达4.当然,也有可能是在编译的过程中,编译器对本来不是并行的代码做了优化,把简单的for循环变成并行执行的程序,从而导致加速比低于4.