c++ 并行编程
来源:互联网 发布:关口知宏漫画 编辑:程序博客网 时间:2024/06/05 00:40
本博客将看C++并行编程的例子
1. 线程进程原理
线程是轻量级的进程,一个进程可以拥有多个线程。
编译多线程程序加入 <pthread.h>
g++ -lphread
2. openmp库加速
2.1 openmp库加速配置及hello,world
事实上有个openmp库,可以实现单台cpu的加速
Windows下使用vs
Configuration Properties->C/C++->Language->OpenMP Support,在下拉菜单里选择Yes。然后才能使用OpenMP
并行代码为例,只需要把相应的行注释掉,就是串行代码了
默认情况下,并行区内线程数=系统中核的个数
在Linux下使用g++即可
#include <stdio.h>#include "omp.h"int main(){ #pragma omp parallel printf( "Hello world!\n" ); return 0;}
g++ test.cpp
./a.out
输出一个
g++ -fopenmp test.cpp
./a.out
输出12个,默认为cpu的逻辑核数(=cpu块数*cpu物理核数*(开启超线程*2))
export OMP_NUM_THREADS=6
./a.out
输出6个
一旦采用了OpenMP,线程数量就将由编译器来决定(而不是您),因此无论线程数量如何,重要的是使程序能够正常运行
2. 实战测试
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>//一个简单的耗时任务double Sum0(double* data,long data_count);int main(){ long data_count=200000; double* data=new double[data_count]; long i; //初始化测试数据 for (i=0;i<data_count;++i) data[i]=(double)(rand()*(1.0/RAND_MAX)); const long test_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次 double sumresult=0; double runtime=(double)clock(); for( i=0; i<test_count; ++i ) { sumresult+=Sum0(data,data_count); } runtime=((double)clock()-runtime)/CLOCKS_PER_SEC; printf ("< Sum0 > "); printf (" 最后结果 = %10.4f ",sumresult); printf (" 执行时间(秒) = %f ",runtime); delete [] data; return 0;}double Sum0(double* data,long data_count){ double result=0; #pragma omp parallel for schedule(static) reduction(+: result) for (long i=0;i<data_count;++i) { data[i]=(double)sin(cos(data[i])); result+=data[i]; } return result;}在windows上
是否 OMP_NUM_TREADS 时间
无 3.437s
有 2 1.586
有 4 1.349
有 8 1.46
在linux上
无 2.9036
有 12 13.9541
有 6 6.792
可以看到windows上做了将近三倍的加速,但是在linux上速度降低。可能是编程的方式不对。
下面将对其进行分析,希望能实现12倍加速
首先看如何看时间
#include <time.h>#include <iostream>using namespace std;int main(){ clock_t startTime,endTime; startTime = clock(); for (int i = 0; i < 10000000; i++) { i++; } endTime = clock(); cout << "Totle Time : " <<(double)(endTime - startTime) / (CLOCKS_PER_SEC*1000) << "ms" << endl; return 0;}
在linux上运行能看到结果
[1] linux下查看核数
[2] windows下查看核数
[3] windows下openmp的配置
[4] linux下openmp编程基础
[5] c++并行与分布式编程[书籍]
- CUDA C的并行编程
- [CUDA]CUDA C并行编程
- 浅谈并行编程语言 Unified Parallel C
- 浅谈并行编程语言 Unified Parallel C
- [CUDA学习]3. CUDA C并行编程
- CUDA学习二:CUDA C并行编程
- 《Objective-C编程全解》 读书笔记 第十九章 并行编程
- 并行编程
- 并行编程
- 并行编程
- 并行编程
- 并行编程
- 并行编程之数据并行
- C#并行编程--并行任务
- 并行编程之数据并行
- java 并行框架 并行编程
- 简述并行编程
- OpenMP并行编程
- QT编程时,,界面不阻塞立刻显示
- SharedPreference.Editor的apply和commit方法的区别
- 仿微信消息列表(RecycleView)双击移动未读消息
- Android Power Management 实现
- post请求网络数据,返回给主线程更新UI实例
- c++ 并行编程
- linux批量删除大量小文件
- spring applicationContext.xml 配置文件详解
- ASP.NET实现三层架构网站创建流程
- 三步实现控件悬浮
- 可以作为URL传输的BASE64编码格式的数据
- 我的NDK学习开发笔记(四)
- ubuntu下右键无法打开终端(open in terminal)的解决办法
- java日期的一些应用