【ELF2学习板】利用OpenMP采用多核并行技术提升FFTW的性能

目录

引言

OpenMP简介

编译OpenMP支持的FFTW库

部署与测试

测试程序

程序部署

测试结果

结语


引言

在前面已经介绍了在ELF2开发板上运行FFTW计算FFT。今天尝试利用RK3588的多核运算能力来加速FFT运算。FFTW利用多核能力可以考虑使用多线程或者OpenMP。今天介绍一下OpenMP的测试结果。

OpenMP简介

OpenMP(Open Multi-Processing)是一种基于共享内存的并行编程模型,旨在简化多核CPU的并行计算开发。它通过编译器指令(Compiler Directives)、运行时库函数和环境变量,帮助开发者轻松实现多线程并行化。

OpenMP的核心特性包括:

  • 基于指令的并行化
    通过 #pragma omp 编译指导语句实现并行控制,无需手动管理线程。

  • 共享内存模型
    所有线程共享同一内存空间,可通过共享变量直接通信。

  • 工作共享(Work-Sharing)
    自动将任务(如循环迭代)分配到多个线程。

  • 数据环境管理
    明确控制变量的共享(shared)或私有(private)属性。

  • 动态线程调度
    支持运行时调整线程数量和任务分配策略。

编译OpenMP支持的FFTW库

FFTW默认的选项是不编译OpenMP的,所以想使用OpenMP需要重新编译一下FFTW库。

交叉编译前用如下命令配置:

 ./configure  --prefix=/mnt/d/test/install --host=arm-linux --enable-float --enable-openmp CC=aarch64-linux-gnu-gcc

然后执行make和make install就可以得到相应的头文件和库文件。此时库文件会多一个libfftw3f_omp.a。

 

部署与测试

测试程序

为了使程序支持OpenMP并利用多核系统提升速度,需要进行以下修改:

  1. 包含OpenMP头文件:添加#include <omp.h>以使用OpenMP函数。

  2. 初始化FFTW多线程支持:在main函数开始时调用fftwf_init_threads()

  3. 设置FFTW使用的线程数:使用omp_get_max_threads()获取可用线程数,并通过fftwf_plan_with_nthreads()配置。

  4. 并行化初始化数据的循环(可选):使用#pragma omp parallel for加速数据初始化。

  5. 编译时链接OpenMP和FFTW多线程库:确保编译器链接-lfftw3_omp并添加-fopenmp选项。

修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>
#include <time.h>
#include <omp.h>  // 添加OpenMP头文件// 计算时间差(单位:微秒)
long long get_time_diff_us(struct timespec start, struct timespec end) {return (end.tv_sec - start.tv_sec) * 1000000LL + (end.tv_nsec - start.tv_nsec) / 1000;
}int main() {const int N = 2048;fftwf_complex *in, *out, *back;fftwf_plan p, q;struct timespec start, end;long long fft_time_us, ifft_time_us;// 初始化FFTW多线程支持fftwf_init_threads();int threads = omp_get_max_threads();  // 获取可用线程数printf("可用线程数 = %d\n", threads);fftwf_plan_with_nthreads(threads);    // 设置FFTW使用的线程数// 分配内存in = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);back = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);// 并行初始化输入数据#pragma omp parallel for  // 使用OpenMP并行化循环for (int i = 0; i < N; i++) {in[i][0] = (float)i; // 实部in[i][1] = 0.0f;     // 虚部}// 创建FFT计划p = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);// 记录FFT开始时间clock_gettime(CLOCK_MONOTONIC, &start);// 执行FFT(自动多线程加速)fftwf_execute(p);// 记录FFT结束时间clock_gettime(CLOCK_MONOTONIC, &end);// 计算FFT时间fft_time_us = get_time_diff_us(start, end);// 创建IFFT计划q = fftwf_plan_dft_1d(N, out, back, FFTW_BACKWARD, FFTW_ESTIMATE);// 记录IFFT开始时间clock_gettime(CLOCK_MONOTONIC, &start);// 执行IFFT(自动多线程加速)fftwf_execute(q);// 记录IFFT结束时间clock_gettime(CLOCK_MONOTONIC, &end);// 计算IFFT时间ifft_time_us = get_time_diff_us(start, end);// 输出结果printf("2048点单精度FFT所需时间: %lld 微秒\n", fft_time_us);printf("2048点单精度IFFT所需时间: %lld 微秒\n", ifft_time_us);// 释放计划和内存fftwf_destroy_plan(p);fftwf_destroy_plan(q);fftwf_free(in);fftwf_free(out);fftwf_free(back);return 0;
}

关键修改说明

  1. 多线程初始化:通过fftwf_init_threads()fftwf_plan_with_nthreads()启用FFTW的多线程支持。

  2. 并行数据初始化:使用OpenMP指令加速数据填充循环(根据实际情况可选)。

  3. FFT/IFFT并行计算:FFTW会在执行fftwf_execute()时自动使用配置的线程数进行并行计算。

这些修改使得FFT和IFFT计算过程能够利用多核CPU,从而显著提升处理速度。

程序编译的命令行为:

aarch64-linux-gnu-gcc -o fftwtest-openmp fftwtest-openmp.c -Iinclude -Llib -lfftw3f -lm -lfftw3f_omp -fopenmp

程序部署

ELF2开发板默认是没有OpenMP支持库的,需要将主机的/usr/aarch64-linux-gnu/lib/libgomp.so.1 拷贝到开发板的/usr/lib目录下,否则程序运行时会报告错误。

测试结果

我本来对程序的运行时间是没啥期待的,因为2048点对于FFT计算来说太短了,很难并并行加速。结果还行,有些效果,差不多50微秒左右,比NEON加速还快一些。

 RK3588搭载四核A76+四核A55,所以OpenMP可用线程数为8。

结语

OpenMP加速的结果令人欣慰。不过CPU计算FFT可能也就是这个水平了,估计没法大幅度提升了。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2000-2017年各省城市天然气供气总量数据

2000-2017年各省城市天然气供气总量数据 1、时间&#xff1a;2000-2017年 2、来源&#xff1a;国家统计局、能源年鉴 3、指标&#xff1a;行政区划代码、城市、年份、城市天然气供气总量 4、范围&#xff1a;31省 5、指标说明&#xff1a;城市天然气供气总量是指在一定时间…

Hadoop的三大结构及其作用?

Hadoop是一个分布式存储和计算框架&#xff0c;其三大核心组件是HDFS&#xff08;Hadoop Distributed File System&#xff09;、YARN&#xff08;Yet Another Resource Negotiator&#xff09;和MapReduce。它们各自有着重要的作用&#xff0c;共同构成了Hadoop生态系统的基础…

【AI论文】ColorBench:视觉语言模型能否看到并理解多彩的世界?一个全面的色彩感知、推理和鲁棒性基准测试

摘要&#xff1a;颜色在人类感知中起着重要作用&#xff0c;通常在视觉推理中提供关键线索。 然而&#xff0c;尚不清楚视觉语言模型&#xff08;VLMs&#xff09;是否以及如何像人类一样感知、理解和利用颜色。 本文介绍了ColorBench&#xff0c;这是一个精心设计的创新基准&a…

Python番外——常用的包功能讲解和分类组合

目录 1. Web开发框架与工具 2. 数据处理与分析 3. 网络请求与爬虫 4. 异步编程 5. 数据库操作 6. 图像与多媒体处理 7. 语言模型与NLP 8. 安全与加密 9. 配置与工具 10. 其他工具库 11.典型组合场景 此章节主要是记录我所使用的包&#xff0c;以及模块。方便供自己方…

华硕原厂系统枪神9/9p超竟版-WIN11原装开箱出厂系统安装

华硕原厂系统枪神9/9p超竟版-WIN11-24H2-专业工作站版本安装可带F12-ASUSRecovery恢复功能 适用机型&#xff1a; G635LX、G635LW、G835LX、G835LW、G615LW、G615LP、G615LM、G615LH G815LW、G815LP、G815LM、G815LH、G635LR、G835LR、G615LR、G815LR 远程恢复安装&#xff…

拉取windows的docker镜像转到服务器上构建服务镜像

在windows上将拉取ubuntu的docker镜像转到服务器上 1.要求 1.1 要求windows和服务器安装好docker 2.拉取ubuntu镜像到windows&#xff08;dos操作&#xff0c;可能需要连接到外网&#xff09; 一旦你选择了一个合适的基础镜像&#xff0c;你可以使用docker pull命令从Docke…

T1结构像+RS-fMRI影像处理过程记录(数据下载+Matlab工具箱+数据处理)

最近需要仿真研究T1结构像RS-fMRI影像融合处理输出目标坐标的路线可行性。就此机会记录下来。 为了完成验证目标处理&#xff0c;首先需要有数据&#xff0c;然后需要准备对应的处理平台和工具箱&#xff0c;进行一系列。那么开始记录~ 前言&#xff1a; 为了基于种子点的功能连…

Nginx-前言

nginx是什么&#xff1f; 轻量级&#xff0c;开源免费的web服务器软件&#xff0c;服务器安装nginx&#xff0c;服务器则成为web服务器 nginx的稳定版版本号&#xff1a; 偶数版本 nginx的相关目录&#xff1a; /etc/nginx/nginx.conf nginx的主配置文件 /etc/nginx/ngi…

缓慢前行,静待花开

最期待的不是成品出炉&#xff0c;而是揉面时感受到温度、发酵时闻到淡淡香气 1 “慢就是稳&#xff0c;稳就是快”。 这句来自特种兵的训练语&#xff0c;被许多自媒体人奉为准则。 在看似风云突变的环境下&#xff0c;速度被隐藏在稳定中&#xff0c;结果被酝酿在过程里。…

洛谷的几道题(2)

P1008 [NOIP 1998 普及组] 三连击 # P1008 [NOIP 1998 普及组] 三连击 ## 题目背景 本题为提交答案题&#xff0c;您可以写程序或手算在本机上算出答案后&#xff0c;直接提交答案文本&#xff0c;也可提交答案生成程序。 ## 题目描述 将 $1, 2, \ldots , 9$ 共 $9$ 个数分…

Day10【基于encoder- decoder架构实现新闻文本摘要的提取】

实现新闻文本摘要的提取 1. 概述与背景2.参数配置3.数据准备4.数据加载5.主程序6.预测评估7.生成效果8.总结 1. 概述与背景 新闻摘要生成是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;其目标是自动从长篇的新闻文章中提取出简洁、准确的摘要。近年来…

【大疆dji】ESDK开发环境搭建(软件准备篇)

接上一篇【大疆dji】ESDK开发环境搭建&#xff08;硬件准备篇&#xff09; 1. 编译环境 ESDK 提供 x86_64/aarch64 基于 Linux 平台 Ubuntu 发行版操作系统构建的静态库&#xff0c;运行 demo 先正确安装所需的依赖包。arm32位就不支持了。建议使用编译安装的方式&#xff0c;…

Java数据结构——ArrayList

Java中ArrayList 一 ArrayList的简介二 ArrayList的构造方法三 ArrayList常用方法1.add()方法2.remove()方法3.get()和set()方法4.index()方法5.subList截取方法 四 ArrayList的遍历for循环遍历增强for循环(for each)迭代器遍历 ArrayList问题及其思考 前言 ArrayList是一种 顺…

【信息获取能力】

第一层&#xff1a;表象观察 现象&#xff1a;AI系统&#xff08;如GPT-4&#xff09;可以瞬间调用并整合全球互联网上的公开信息&#xff0c;而人类即使穷尽一生也无法完成同等规模的知识储备。 底层逻辑&#xff1a; 存储与检索效率&#xff1a;人类大脑的记忆容量有限&…

03、GPIO外设(三):标准库代码示例

标准库代码示例 1、点亮LED2、LED闪烁3、LED流水灯4、按键控制LED5、蜂鸣器 本章源代码链接&#xff1a; 链接: link 1、点亮LED 实验要求&#xff1a;点亮LED ①LED.c文件的代码如下: #include "LED.h"/*** LED引脚初始化*//* 定义数组&#xff0c;想要添加引脚…

卷积神经网络(CNN)与VGG16在图像识别中的实验设计与思路

卷积神经网络&#xff08;CNN&#xff09;与VGG16在图像识别中的实验设计与思路 以下从基础原理、VGG16架构解析、实验设计步骤三个层面展开说明&#xff0c;结合代码示例与关键参数设置&#xff0c;帮助理解其应用逻辑。 一、CNN与VGG16的核心差异 基础CNN结构 通常包含33~55个…

java导出word含表格并且带图片

背景 我们需要通过 Java 动态导出 Word 文档&#xff0c;基于预定义的 模板文件&#xff08;如 .docx 格式&#xff09;。模板中包含 表格&#xff0c;程序需要完成以下操作&#xff1a; 替换模板中的文本&#xff08;如占位符 ${设备类型} 等&#xff09;。 替换模板中的图…

Oracle19C低版本一天遭遇两BUG(ORA-04031/ORA-600)

昨天帮朋友看一个系统异常卡顿的案例&#xff0c;在这里分享给大家 环境&#xff1a;Exadata X8M 数据库版本19.11 1.系统报错信息 表象为系统卡顿&#xff0c;页面无法刷出&#xff0c;登陆到主机上看到节点1 系统等待存在大量的 cursor: pin S wait on X等待 查看两个节…

2025年Q1数据安全政策、规范、标准以及报告汇总共92份(附下载)

一、政策演进趋势分析 &#xff08;一&#xff09;国家级政策新动向 数据要素市场建设 数据流通安全治理方案&#xff08;重点解析数据确权与交易规则&#xff09; 公共数据授权运营规范&#xff08;创新性提出分级授权机制&#xff09; 新兴技术安全规范 人工智能安全标准…

ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss

场景复现&#xff1a; 最近在vue3项目中安装了tailwindcss&#xff0c;但是它默认帮我安装的版本是4XX的&#xff0c;导致我执行 npx tailwindcss init -p报错了。 解决方案&#xff1a; 更改tailwindcss的版本为3 pnpm add -D tailwindcss3再次执行生成tailwindcss的初始…