Skip to main content

moregeek program

多线程的那点儿事(之多核编程)-多极客编程_多核多线程编程


    多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照​​维基百科​​的相关解释。


    open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核上面同时执行,从而可以达到快速执行代码的目的。比如说,我们可以编写一个简单的例子。


    在编写open-mp程序之前,朋友们应该注意下面三点,

    (1) 使用vs2005或者以上的版本编写open-mp程序;

    (2) 编写程序的时候,选择【Property Pages】->【Configuration Properties】->【c/c++】->【language】->【OpenMp Support】,打开开关;       

    (3) 添加#include <omp.h> 声明。



    首先,我们编写简单的一个打印程序,看看结果。

#include <omp.h>

void print()
{
int i;
#pragma omp parallel for
for(i = 0; i < 100; i ++)
{
printf("%d\n", i);
}
}

    上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈,

openmp.exe!print$omp$1()  Line 14 C++
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0x19c bytes
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0xe0 bytes
vcompd.dll!_InvokeThreadTeam@12() + 0x98 bytes
vcompd.dll!__vcomp_fork() + 0x1cd bytes
openmp.exe!print() Line 11 + 0xe bytes C++
openmp.exe!wmain(int argc=1, wchar_t * * argv=0x003b5ba8) Line 22 C++
openmp.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
openmp.exe!wmainCRTStartup() Line 403 C
kernel32.dll!7c817077()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

    我们看可以看到函数堆栈和平时看到的一般函数调用确实不一样,但这确实也说明不了什么,不过没有关系,我们可以做一个简单的测试,

#include "stdafx.h"
#include <windows.h>
#include <omp.h>

#define NUMBER 1000000000

int process(int start, int end)
{
int total;

total = 0;
while(start < end){
total += start %2;
start ++;
}

return total;
}

void test1()
{
int i;
int time;
struct {
int start;
int end;
}value[] = {
{0 , NUMBER >> 1},
{NUMBER >> 1, NUMBER}
};
int total[2] = {0};
int result;

time = GetTickCount();

#pragma omp parallel for
for(i = 0; i < 2; i ++)
{
total[i] = process(value[i].start, value[i].end);
}

result = total[0] + total[1];
printf("%d\n", GetTickCount() - time);
}

void test2()
{
int i;
int value;
int total;

total = 0;
value = GetTickCount();

for(i = 0; i < NUMBER; i++)
{
total += i %2;
}
printf("%d\n", GetTickCount()-value);
}


int _tmain(int argc, _TCHAR* argv[])
{
test1();
test2();
return 0;
}


    test1和test2完成的功能都是一样的,但是明显test1要比test2花费的时间要少很多,这明显就是多核编程的好处。所以要想实现多核编程最大程度上的并行运算,就必须把运


算拆分成n个子运算,并且尽量减少使用锁。

总结:
    (1) 这篇文章只是介绍性的博客,详细内容可以参考​​周伟明​​先生的博客;

    (2) 关于多核编程更具体的细节和方法,可以参考《​​多核计算与程序设计​​》这本书;

    (3) 编写多核编程需要的条件很简单,cpu支持多核、打开openmp开关、添加omp头文件,剩下的就是多多练习了;

    (4) 并行运算的时候少使用锁,否则效率会大打折扣。


©著作权归作者所有:来自51CTO博客作者feixiaoxing的原创作品,请联系作者获取转载授权,否则将追究法律责任

深度解析kubeedge edgemesh 高可用架构_华为云开发者社区的博客-多极客编程

摘要:通过高可用特性应用场景、高可用特性使用手册、课题总结、未来展望等四个部分的内容来向大家介绍新版本EdgeMesh的高可用架构。本文分享自华为云社区《​​KubeEdge EdgeMesh 高可用架构详解|KubeEdge云原生边缘计算社区​​》,作者:南开大学|达益鑫。EdgeMesh项目解决了边缘计算场景下复杂网络的通信问题,中心化的edgemesh-server作为一个中继组件,协助其他

5分钟搭建图片压缩应用_华为云开发者社区的博客-多极客编程

摘要:用华为云函数工作流FunctionGraph搭建图片压缩应用。本文分享自华为云社区《​​真正的按需计费丨函数工作流 FunctionGraph实战,5分钟搭建图片压缩应用​​》,作者:华为云PaaS服务小智。1.背景介绍互联网时代,各类app,小程序为人们的生活,办公,学习,休闲,娱乐提供着便利,在今年8月31日中国互联网络信息中心发布的第50次《中国互联网络发展状况统计报告》中显示,截至2

云原生边缘设备解决方案akri on k3s初体验_rancher labs的博客-多极客编程

作者:涂家英,SUSE 资深架构师,专注 Cloud-Native 相关产品和解决方案设计,在企业级云原生平台建设领域拥有丰富的经验。写在前面k3s 是 SUSE 推出的为物联网和边缘计算构建的经过认证的 Kubernetes 发行版,它可以帮助用户在资源受限的场景下使用 kubernetes,并结合 SUSE Rancher 实现云边协同。将 k3s 与微软开源的 kubernetes 边缘项目

振弦采集模块的通讯速率和软件握手( uart)_河北稳控科技的博客-多极客编程

振弦采集模块的通讯速率和软件握手( UART) 1 通讯速率 VMXXX 的 UART 接口支持 9600~460800bps 通讯速率,通过设置寄存器 BAUD.[13:0]来改变通讯速率, BAUD.[13:0]的单位为“每秒百位” 或“ 百 bps” 。 寄存器取值与对应的通讯速率如下表:在条件允许情况下,尽量使用较高的通讯速率, 缩短数据传输时间。 注:关于 UART 通讯的其它参数(校验

prometheus alertmanager 生产实践-直接根据 to_email label 发 alert 到对应邮箱_东风微鸣云原生观察的博客-多极客编程

## 概述通过之前的文章 - [Prometheus Alertmanager 生产配置趟过的坑总结](​​https://ewhisper.cn/posts/31626/​​), 我们已经知道 AlertManager 作为告警平台,是非常强大的,可以去重 (deduplicating),分组 (grouping),并将它们路由 (routing) 到正确的接收器 (receiver) 集成,如

分布式存储之 etcd 的集群管理_mb60939e30d6d2e的博客-多极客编程

在分布式文件存储中,我们通常会面临集群选主,配置共享和节点状态监控的问题。通过 etcd(基于 Raft 协议))可以实现超大规模集群的管理,以及多节点的服务可靠性。今天,我们就聊聊 etcd 在分布式存储中的具体应用。什么是 etcd ?etcd 是由 CoreOS 公司开发的一个开源的分布式 KV 存储,主要用于服务发现、共享配置以及一致性保障。etcd 的灵感来自于 ZooKeeper 和

浅谈java学习以及学习路线图_学java的小熊的博客-多极客编程

关于这篇,应该很早就要更新了,奈何一直拖拖拖(因为自己在跟着做项目),导致到现在才更新,今天就聊一聊关于我,自己接触Java比较早,但真正实际能到开发阶段,还是在疫情期间,因为要准备实习了,看网上这么卷,所以才开始框架的学习,在此之前,学习的态度的:三天打鱼,两天晒网;现在回想之前的大学时光,感觉自己很荒废,自己也走了不少弯路,强烈建议:如果能找到一个大佬带你学习或者给你提供学习路线等,你将会少走

cros 跨域请求原理_kieary的博客-多极客编程

cros 分为两种请求简单请求浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(预检请求)(not-so-simple request)。只要同时满足以下两大条件,就属于简单请求。(1) 请求方法是以下三种方法之一: HEADGETPOST (2)HTTP请求头信息不超出以下几种字段: AcceptAccept-LanguageContent-LanguageLa

【服务器数据恢复】xen server存储库(sr)常见故障的数据恢复方案_sun的博客-多极客编程

​xen server存储库常见故障: 1、sr无法识别,所有虚拟磁盘(vdi)丢失。 2、sr中的虚拟磁盘(vdi)访问时报错。 3、虚拟磁盘(vdi)删除或丢失。 4、快照(snapshot)删除或丢失。 5、sr初始化。 6、sr所在的LVM结构损坏。 7、sr所属的PV分区表损坏。 8、其他故障。  xen server存储库常见故障分析: 上述故障是用户界面层的常见故障表现,解决这些故

振弦采集模块的通讯速率和软件握手( uart)_河北稳控科技的博客-多极客编程

振弦采集模块的通讯速率和软件握手( UART) 1 通讯速率 VMXXX 的 UART 接口支持 9600~460800bps 通讯速率,通过设置寄存器 BAUD.[13:0]来改变通讯速率, BAUD.[13:0]的单位为“每秒百位” 或“ 百 bps” 。 寄存器取值与对应的通讯速率如下表:在条件允许情况下,尽量使用较高的通讯速率, 缩短数据传输时间。 注:关于 UART 通讯的其它参数(校验

来聊聊怎么做硬件兼容性检测,快速迁移到openeuler?_openeuler的博客-多极客编程

作为一款免费的企业级 Linux 操作系统,自CentOS 8 宣布停止维护以来(2021年底),就引发行业的广泛关注。究其原因,不仅在于 CentOS 用户群体庞大,还在于迁移 CentOS 并不是简单的系统重新安装,而是需要对操作系统及其上搭载的应用软件和业务系统进行替代、适配、迁移和重构等。因此,如何高效安全且低风险地实现应用迁移,成为用户所关心的核心问题。国内操作系统迁移方案很多,开源操作

vmware esxi 日常维护及 vsan 常用指令_虚拟的现实的博客-多极客编程

1.Esxi 主机升级步骤VMWare群集主机升级UEFI(BIOS)维护步骤:1、关停群集DRS2、迁出需维护主机的所有运行中虚拟机到群集其他主机3、主机进入维护模式4、带外升级固件5、升级完成确认版本及硬件等状态6、主机退出维护模式7、开启DRS2.VSAN 相关指令语法格式:vsish [参数]常用参数:ls    显示所有的节点信息set    设置vc配置参考实例获取内存映射表:[roo