【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.pswp.cn/pingmian/77427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77427.shtml
英文地址,請注明出處:http://en.pswp.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的初始…