oneDNN、oneMKL 和 oneTBB 介绍及使用
1. oneDNN(Intel® oneAPI Deep Neural Network Library)
-
简介
oneDNN 是 Intel 开源的深度学习神经网络加速库,专为 CPU 和 GPU 上的深度学习推理和训练优化。它提供高效的底层算子(如卷积、池化、矩阵乘法等),支持多种深度学习框架(如 TensorFlow、PyTorch)作为后端。 -
核心功能
- 高性能的神经网络算子(如卷积、RNN、BatchNorm)。
- 支持 INT8 量化推理。
- 自动内存管理和线程调度优化。
-
使用示例(C++)
以下是一个简单的卷积操作示例:#include <oneapi/dnnl/dnnl.hpp> using namespace dnnl;void demo_convolution() {engine eng(engine::kind::cpu, 0);stream s(eng);// 定义输入、权重、输出的维度memory::dims input_dims = {1, 3, 224, 224}; // NCHW格式memory::dims weight_dims = {64, 3, 3, 3}; // OIHW格式memory::dims output_dims = {1, 64, 222, 222};// 创建内存对象auto input_mem = memory({{input_dims}, memory::data_type::f32, memory::format_tag::nchw}, eng);auto weight_mem = memory({{weight_dims}, memory::data_type::f32, memory::format_tag::oihw}, eng);auto output_mem = memory({{output_dims}, memory::data_type::f32, memory::format_tag::nchw}, eng);// 定义卷积算子auto conv_desc = convolution_forward::desc(prop_kind::forward_inference,algorithm::convolution_auto,input_mem.get_desc(),weight_mem.get_desc(),output_mem.get_desc(),{1, 1}, // Stride{0, 0} // Padding);auto conv_prim = convolution_forward(conv_desc, eng);// 执行卷积conv_prim.execute(s, {{DNNL_ARG_SRC, input_mem},{DNNL_ARG_WEIGHTS, weight_mem},{DNNL_ARG_DST, output_mem}});s.wait(); } -
编译命令
g++ -O2 demo.cpp -o demo -ldnnl
2. oneMKL(Intel® oneAPI Math Kernel Library)
-
简介
oneMKL 是高性能数学库,提供优化的数学函数(如 BLAS、LAPACK、FFT、随机数生成等),支持 CPU、GPU 和 FPGA,适用于科学计算、金融分析等领域。 -
核心功能
- 线性代数(矩阵乘法、分解)。
- 快速傅里叶变换(FFT)。
- 统计函数(随机数生成、统计分布)。
-
使用示例(矩阵乘法)
#include <CL/sycl.hpp> #include <oneapi/mkl.hpp> using namespace sycl; using namespace oneapi::mkl;void demo_gemm() {queue q;const int m = 1024, n = 1024, k = 1024;float *A = malloc_shared<float>(m * k, q);float *B = malloc_shared<float>(k * n, q);float *C = malloc_shared<float>(m * n, q);// 填充数据(略)blas::gemm(q, transpose::N, transpose::N, m, n, k, 1.0f, A, k, B, n, 0.0f, C, n);q.wait(); } -
编译命令
g++ -O2 demo.cpp -o demo -lmkl_sycl -lmkl_intel_ilp64 -lmkl_core
3. oneTBB(Intel® oneAPI Threading Building Blocks)
-
简介
oneTBB 是 C++ 并行编程库,提供任务调度、并行算法(如parallel_for)和并发容器,简化多线程开发,支持动态负载均衡。 -
核心功能
- 并行循环(
parallel_for、parallel_reduce)。 - 任务调度器(自动管理线程池)。
- 并发容器(如
concurrent_queue)。
- 并行循环(
-
使用示例(并行求和)
#include <tbb/parallel_reduce.h> #include <tbb/blocked_range.h> #include <vector> using namespace tbb;float parallel_sum(const std::vector<float>& data) {return parallel_reduce(blocked_range<size_t>(0, data.size()),0.0f,[&](const blocked_range<size_t>& r, float init) {for (size_t i = r.begin(); i < r.end(); ++i)init += data[i];return init;},[](float a, float b) { return a + b; }); } -
编译命令
g++ -O2 demo.cpp -o demo -ltbb
总结
| 库名 | 应用场景 | 优势 |
|---|---|---|
| oneDNN | 深度学习推理/训练 | 低延迟、高吞吐量,支持量化 |
| oneMKL | 科学计算、数值分析 | 数学函数高度优化,跨硬件支持 |
| oneTBB | 多线程任务并行 | 简化并行编程,动态负载均衡 |
- 协作示例:在深度学习训练中,可用 oneTBB 管理线程池,oneMKL 加速矩阵运算,oneDNN 实现卷积层。
- 共同点:均属于 oneAPI 生态,支持跨 CPU/GPU 异构计算。
如需进一步优化,建议参考官方文档调整参数(如内存布局、线程数)。
相关文章:
oneDNN、oneMKL 和 oneTBB 介绍及使用
1. oneDNN(Intel oneAPI Deep Neural Network Library) 简介 oneDNN 是 Intel 开源的深度学习神经网络加速库,专为 CPU 和 GPU 上的深度学习推理和训练优化。它提供高效的底层算子(如卷积、池化、矩阵乘法等)ÿ…...
目标检测的训练策略
在目标检测竞赛中,训练策略的优化是提高模型性能的关键。常用的训练策略包括数据预处理、数据增强、超参数调节、损失函数设计、正负样本采样、模型初始化和训练技巧等。以下是一些常见的训练策略: 1. 数据预处理与数据增强 数据归一化:对输…...
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
在视频处理和图像渲染领域,YUV 颜色空间被广泛用于压缩和传输视频数据。然而,在实际开发过程中,很多开发者会遇到 YUV 颜色偏色 的问题,例如 画面整体偏绿。这通常与 U、V 分量的取值有关。那么,YUV 颜色是如何转换为 …...
unidbg读写跟踪还原X-Gorgon
使用版本 33.2.5 mssdk提供给 libsscronet.so 网络库的接口地址是 0x88ee0 参数签名函数调用序列 0x88ee0 -> 0x87e48 -> 0x86d60 -> 0x6B14c 0x6B14c -> 0x6Db40 -> 0x73908-> 0x7d3f0 (X-Argus) ->…...
全长约8.3公里!宁波象山港跨海大桥南中塔柱云端合龙
快科技3月31日消息,据报道,由中国交建二航局承建的宁波象山港跨海大桥顺利完成南中塔柱合龙施工,标志着这一重大交通工程取得阶段性突破。 这座连接宁波鄞州区与象山县的跨海通道全长8.3公里,其标志性的南主塔采用创新"钻石…...
使用 2 端口探头测量 40 uOhm(2000 安培)PDN 的挑战 – 需要多少 CMRR?
部分 1 / 3 本文是 3 部分系列的第一部分: 第 2 部分 - 测量结果! 第 3 部分 - 使用另一台 VNA 的测量结果 介绍 我们大多数人都知道 2 端口测量中的接地回路。我们大多数人也都知道,我们需要引入接地回路隔离器来纠正错误。如果没有&…...
蓝桥杯——统计子矩阵
解法:二维前缀和双指针 代码: #include <iostream> using namespace std; typedef long long ll; ll prefix[505][505], a[250010]; int main() {ll n, m, k, ans 0; cin >> n >> m >> k;for(int i 1; i < n; i)for(int …...
snmp/mib采用子代理模式,编码,部署(二)---多实例处理
snmp/mib采用子代理模式,编码,部署(二)---多实例处理 0.本文针对net-snmp中mib表做处理,即单张表对应后台多个实例. 1.源代码生成 拷贝GSC-MIB-0805.txt到/usr/share/snmp/mibs(具体看自己安装目录,如果找不到,下面解…...
吾爱破解安卓逆向学习笔记(4p)
学习目标,了解安卓四大组件,activity生命周期,同时了解去除部分广告和更新提示。 广告类型 1.启动页广告 2.更新广告 3.横幅广告 安卓四大组件 组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以…...
使用Redis实现轻量级消息队列
使用消息中间件如RabbitMQ或kafka虽然好,但也给服务器带来很大的内存开销,当系统的业务量,并发量不高时,考虑到服务器和维护成本,可考虑使用Redis实现一个轻量级的消息队列,实现事件监听的效果。下面介绍下…...
stm32第十天外部中断和NVIC讲解
一:外部中断基础知识 1.STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 1&…...
26考研——线性表_ 线性表的链式表示_单链表(2)
408答疑 文章目录 三、 线性表的链式表示单链表概念单链表的结构头结点 单链表上基本操作的实现单链表的初始化带头结点和不带头结点的初始化操作注意 求表长操作按序号查找结点按值查找表结点插入结点操作扩展:对某一结点进行前插操作 删除结点操作扩展:…...
MATLAB 控制系统设计与仿真 - 31
二次型最优控制 考虑到系统如果以状态空间方程的形式给出,其性能指标为: 其中F,Q,R是有设计者事先选定。线性二次最优控制问题简称LQ(Linear Quadractic)问题,就是寻找一个控制,使得系统沿着由指定初态出发的相应轨迹,其性能指标J取得最小值。 LQ问题分…...
蓝桥杯15届JAVA_A组
将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 2 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader in new BufferedReader(new In…...
deepseek v3 0324实现工作流编辑器
HTML 工作流编辑器 以下是一个简单的工作流编辑器的HTML实现,包含基本的拖拽节点、连接线和可视化编辑功能: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewp…...
【NLP 面经 3】
目录 一、Transformer与RNN对比 多头自注意力机制工作原理 相比传统 RNN 在处理长序列文本的优势 应对过拟合的改进方面 二、文本分类任务高维稀疏文本效果不佳 特征工程方面 核函数选择方面 模型参数调整方面 三、NER中,RNN模型效果不佳 模型架构方面 数据处理方面…...
20250331-智谱-沉思
背景 收到GLM沉思的消息,立马试用下。感觉真的太及时了。 (背景:为了客户的需求“AI辅助写作”实验了2款开源workflow,2款在线workflow,好几款多智能体框架后,心中无底之际。。。) 1. GLM(开启…...
Java EE(17)——网络原理——IP数据报结构IP协议解析(简述)
一.IP数据报结构 (1)版本:指明协议的版本,IPv4就是4,IPv6就是6 (2)首部长度:单位是4字节,表示IP报头的长度范围是20~60字节 (3)8位区分服务:实际上只有4位TOS有效,分别是最小延时,最…...
26考研|高等代数:线性空间
线性空间这一章在整个高等代数学习过程中是非常精华的部分,在学习这一章的过程中会有部分的概念较为抽象,一定要抓紧抓牢对于概念的理解,反复阅读与感受,同时也可以根据已知的解析几何中介绍的二维空间或者三维空间进行类推比较&a…...
基础算法篇(3)(蓝桥杯常考点)-图论
前言 这期是蓝桥杯常考点的最后一章了,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时…...
git错误:fatal: detected dubious ownership in repository at xxxxxx
1、报错说明 这个错误通常是由于Git仓库目录的拥有者或权限问题引起的。Git检测到仓库目录的所有权可能存在不一致或不安全的情况。 通常导致此报错的可能原因: (1)文件或目录的拥有者不一致: 仓库目录中的某些文件或子目录可能…...
【Linux】进程间通信(IPC)-- 无名管道、命名管道
IPC机制 实现进程间通信 在多个进程间传输数据或共享信息的机制。 数据交换,共享资源,进程同步,消息传递。 IPC实现原理:通信进程能够访问相同的内存区域。 方法: 管道:无名管道pipe、命名管道FIFO S…...
每日一题-力扣-2278. 字母在字符串中的百分比 0331
字母在字符串中的百分比求解方案 | 力扣 2278 题解 问题描述 给定一个字符串 s 和一个字母 letter,我们需要计算 letter 在 s 中出现的百分比,并将结果向下取整。例如,如果字符串是 "foobar",字母是 "o"&…...
【分布式】深入剖析 Sentinel 限流:原理、实现
在当今分布式系统盛行的时代,流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件,在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点,助力开发者更好地运用这一工具…...
[leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)
题目链接 题意 给定一个 n n n个点 m m m条边的无向图 每条边有边权 求1-n的路径中最小的边权是多少 每条路可以重复走 思路 把边按边权降序排序 用并查集维护连通性 遍历每条边 每次合并边的起点和终点 如果1和n联通 并且这条边在1和n的这个连通块中 就对ans取min Code…...
关于CodeJava的学习笔记——11
一、GUI 1、最简单的GUI 只有一个按钮的GUI import java.awt.*; import javax.swing.*; public class SimpleGUI{JFrame frame;Button bt;public SimpleGUI(){frame new JFrame("标题栏内容");bt new Button("点我啊");frame.add(bt);frame.setSize(8…...
首个物业plus系列展 2025上海国际智慧物业博览会开幕
AI赋能服务升级!首个“物业plus”系列展 2025上海国际智慧物业博览会盛大开幕 3月31日,2025上海国际智慧物业博览会(简称“上海物博会”)在上海新国际博览中心N4馆隆重开幕。本届展会由广州旭杨国际展览有限公司主办,…...
嵌入式八股文学习——虚函数相关知识学习
虚函数 什么是虚函数?虚函数示例解析代码解析: 使用虚函数的注意事项1. 虚函数的声明与定义2. 派生类中的虚函数 哪些函数不能声明为虚函数1. 普通函数(非成员函数)2. 构造函数3. 内联成员函数4. 静态成员函数5. 友元函数总结 纯虚…...
rk3586开发版新增系统调用(Android13)
一、前言 最近想学一下kernel和hal,所以买了一块板子,带了个摄像头和屏幕,1100,学习投资了。这个Android内核定一个系统调用感觉是真的麻烦,主要是有一层bionic C,一开始不熟悉的时候还是花了点时间去配置。 二、kernel修改 include/uapi/asm-generic…...
OCR第三个方案:PP-OCRv4的初步探索
一、PP-OCR历史简要回顾 先请出PP-OCR官网,理解上有出入的,以官网为准。 1.1 PP-OCR系列历史 PP-OCRv1(2020):首创3.5M超轻量模型,奠定两阶段架构基础(检测方向分类识别)PP-OCRv2…...
