算法耗时通用优化技巧 总结

最近在部署AI相关的算法,并要求减少总耗时,从中总结出的一些比较通用的优化技巧。精髓总结一句话就是:在同一时间尽可能充分利用硬件资源。而怎么尽可能充分利用呢,方式就是多线程并行处理

1、单线程串行处理数据

假设算法需要处理两份同类型的数据(适用场景可以扩展到:算法需要处理两份及以上同类型的数据,或者对算法内部进行优化),最简单的就是采用单线程先后处理,如下图1:

 图1 串行处理多份同类型数据

2、多线程并行处理同类型数据

串行方式的缺点是对硬件的使用率非常低,比如处理每份数据都要经过数据加载、计算、保存等操作,那么同一时间数据在加载传输到内存的时候cpu是空闲的,最好的情况是在加载传输第二份数据的时候cpu正在对第一份数据计算。提高各个硬件资源的利用率的方法就是“多线程并行”,如下图2所示创建两个线程,每个线程分别处理一份同类型数据:

 图2 多线程并行处理同类型数据

c++实现代码如下:

#include <thread>using namespace std;auto func_proc=[](Ai* mai,float* data){mai->Proc(data);
};Ai mai1,mai2;
float* data1,data2;thread t1(func_proc,&mai1,data1);
thread t2(func_proc,&mai2,data2);
t1.join();
t2.join();

3、拆分成各子模块之间的并行

但是上面这种并行方式资源占用是比较多的,相当于同时申请了两份Ai资源,如果Ai资源内存或者显存占用很多势必会影响其他算法性能。因此有一种解决方案就是对Ai进行拆分(如下图3所示),比如这里拆分成4个子模块,子模块之间尽可能解耦(可以有相互依赖关系)。这样当线程2处理子模块A时会先等待线程1执行完子模块A,当线程1执行完子模块B时,线程2执行子模块A,达到子模块之间并行。从理论上来说,对算法模块拆分越精细,则对硬件利用率越高。

  图 3.各个子模块之间并行

代码上实现这种并行方式,可以对每个子模块加一个互斥锁,如下图4所示。

  图 4.通过加互斥锁达到各子模块间的并行

c++代码如下:

#include <thread>
#include <mutex>using namespace std;auto func_proc=[&](Ai* mai,float* data,mutex* mylocks){{std::lock_guard<std::mutex> tmpLock(mylocks[0]);auto outA=mai->subA(data);}{std::lock_guard<std::mutex> tmpLock(mylocks[1]);auto outB=mai->subB(outA);}{std::lock_guard<std::mutex> tmpLock(mylocks[2]);auto outC=mai->subC(outB);}{std::lock_guard<std::mutex> tmpLock(mylocks[3]);auto outD=mai->subD(outC);}};Ai mai1;
float* data1,data2;
mutex mylocks[4];thread t1(func_proc,&mai1,data1,mylocks);
thread t2(func_proc,&mai1,data2,mylocks);
t1.join();
t2.join();

4、独立子模块之间的并行 

进一步,如果子模块之间有相互独立的,则可以并行起来,如下图所示:

  图 5.独立子模块之间的并行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2868757.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

kkview远程控制: 内网远程桌面控制软件

内网远程桌面控制软件&#xff1a;高效、安全的远程管理方案 在信息技术日新月异的今天&#xff0c;内网远程桌面控制软件已成为许多企业和个人用户不可或缺的工具。这类软件允许用户通过内部网络&#xff0c;实现对其他计算机的远程访问和控制&#xff0c;从而大大提高工作效…

蓝桥杯Java准备

蓝桥杯马上就要开始了&#xff0c;话说干什么都先准备准备&#xff0c;临阵磨枪不快也光。 首先蓝桥杯java语言中使用的是eclipse的2020.06的版本&#xff0c;使用jdk1.8的版本&#xff0c;大家可以先下载下来然后体验一下。 然后就是熟悉的Helloworld环节 eclipse设置 打开几…

Linux第79步_使用自旋锁保护某个全局变量来实现“互斥访问”共享资源

自旋锁使用注意事项:自旋锁保护的“临界区”要尽可能的短。 因此&#xff0c;在open()函数中申请“spinlock_t自旋锁结构变量”&#xff0c;然后在release()函数中释放“spinlock_t自旋锁结构变量”&#xff0c;这种方法就行不通了。如果使用一个变量“dev_stats”来表示“共享…

解锁区块链游戏数据解决方案

作者&#xff1a;stellafootprint.network 随着区块链技术的日新月异&#xff0c;游戏行业正迎来一场革命&#xff0c;催生了区块链游戏的崛起。这一变革不仅为用户带来了全新的互动体验&#xff0c;也开辟了全新的盈利渠道。然而&#xff0c;在这一新兴领域&#xff0c;数据的…

多站合一的音乐搜索下载助手PHP源码l亲测

源码获取方式 回复&#xff1a;031601 搭建教程&#xff1a; 将源码下载上传至宝塔面板&#xff0c;直接运行即可~ 说明&#xff1a; 该源码进行测试&#xff0c;测试成功源码无加密优化相关其他采集问题。

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

Postman接口测试之断言,全网最细教程没有之一!

一、断言 在 postman 中我们是在Tests标签中编写断言&#xff0c;同时右侧封装了常用的断言&#xff0c;当然 Tests 除了可以作为断言&#xff0c;还可以当做后置处理器来编写一些后置处理代码&#xff0c;经常应用于&#xff1a; 【1】获取当前接口的响应&#xff0c;传递给…

二分/二分查找(整数二分详解+拓展浮点二分)

先上题目 在一个有序数组中&#xff0c;查找x所在的下标。 输入 第一行两个整数n和m。 第二行n个数&#xff0c;表示有序的数列。 接下来m行&#xff0c;每行一个整数x&#xff0c;表示一个询问的数。 输出 对于每个询问如果x在数列中&#xff0c;输出下标。否则输出-1 样…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

2024年腾讯云2核4G服务器够用吗?性能测评

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

第三门课:结构化机器学习项目-机器学习策略

文章目录 1 机器学习策略一1.1 为什么是ML策略&#xff1f;1.2 正交化1.3 单一数字评估指标1.4 满足和优化指标1.5 训练、开发及测试集划分1.6 开发集和测试集的大小1.7 什么时候改变开发、测试集和指标&#xff1f;1.8 为什么是人的表现&#xff1f;1.9 可避免偏差1.10 理解人…

【编程项目开源】微信飞机大战(鸿蒙版)

目标 仿微信飞机大战 效果 开发工具 下载DevEco Studio 工程截图 开源地址 https://gitee.com/lblbc/plane_game/tree/master/PlaneGame_hongmeng_ArkTS 关于 厦门大学计算机专业|华为八年高级工程师 专注《零基础学编程系列》 http://lblbc.cn/blog 包含&#xff1a;Ja…

前端Prettier 插件的使用配置(详细)

各个参数代表的意思:printWidth&#xff1a;每行代码的最大长度限制。 tabWidth&#xff1a;选项用于控制制表符的宽度。 useTabs&#xff1a;指定是否使用制表符代替空格。 semi&#xff1a;指定是否在语句的末尾添加分号。 singleQuote&#xff1a;指定是否使用单引号或双引号…

操作系统系列学习——一个实际的schedule函数

文章目录 前言一个实际的schedule函数 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感…

Java后端面试经验分享,~纯分享

本文将从面试、工作、学习三个方面分享最近面试的一些心得以及以后发展的一些规划&#xff0c;仅供参考&#xff0c;哈哈&#xff0c;毕竟本人也很菜&#xff0c;因为菜才要多学习。一会儿也会分享两本Java面试题库&#xff08;题库是b站大学找的&#xff0c;一会儿我也会分享出…

如何将Git拉取项目后,将SSH验证方式修改为HTTPS?

首先在打开项目所在位置的Git BashGUI 查找当前的远程仓库URL&#xff1a; 打开终端或命令提示符&#xff0c;导航到你的项目目录&#xff0c;并使用以下命令查看当前配置的远程仓库URL&#xff1a; git remote -v这会显示如下格式的输出&#xff1a; origin gitgithub.com:用…

python自动化之pytest框架以及数据驱动(第五天)

1.pytest框架需要遵循的规则 &#xff08;1&#xff09;.py 测试文件必须以test 开头(或者以 test结尾) &#xff08;2&#xff09;测试类必须以Test开头&#xff0c;并且不能有 init 方法 &#xff08;3&#xff09;测试方法必须以test 开头 &#xff08;4&#xff09;断言…

电大搜题:开启学习新时代

身处信息化时代&#xff0c;学习的方式已经发生了巨大的变革。在这个多元化的学习环境中&#xff0c;传统的学习模式已经无法满足现代学习者的需求。然而&#xff0c;电大搜题应运而生&#xff0c;为学习者提供了一个高效、便捷的学习途径。 电大搜题&#xff0c;作为黑龙江开…