首页 > 其他分享 >mingw下opencl开发,clFFT的使用

mingw下opencl开发,clFFT的使用

时间:2024-01-21 22:47:39浏览次数:32  
标签:FFT clFFT err 间距 opencl LEN mingw plan

国产嵌入式GPGPU-soc的开发多使用opencl,开发时需要在Windows下搭建GPU计算的测试框架,用以对算法实现进行测试。在Windows平台下利用方便的开发工具对算法进行基本实现和调试,然后就能方便在soc上进行调试。

开发环境:

两台笔记本:

CPU均是i9-12900H  2.50 GHz,带有核心显卡Iris Xe

GPU分别为:RTX 3070 ti、RTX 3060

在Windows下开发C++要想代码接近soc的环境,所以选用mingw64编译器。安装cuda后,把cuda中的opencl头文件和OpenCL.lib复制到工程目录,在makefile中引用即可。

在mingw下使用clFFT就需要配置一下。首先下载clfft的源码,下载cmake-Windows版。

默认使用的是vc,在命令行中改为mingw编译器:

cmake ../src  -G "MinGW Makefiles" -D CMAKE_MAKE_PROGRAM=/mingw64/bin/make.exe -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++

注意不能有中文路径。

clFFT编译完了把头文件复制到工程目录,把libclFFT.dll复制到exe目录下

clFFT的使用,按照官网的例子即可实现最简单的FFT变换。但要想实现高效的计算,就需要使用clFFT的扩展功能。我只使用1D-FFT,所以尝试了批处理(batch)和转置两种特性。

批处理:(单精度浮点复数,RIRI结构)

  err = clfftSetPlanDistance(planHandle,FFT_LEN, FFT_LEN); //分别设置输入、输出数组间距

  err = clfftSetPlanBatchSize(planHandle, H_LEN); //设置批处理次数

注意数组间距要填写复数的个数,不是float的个数。

计算的同时转置:(处理不同行序的数据)

需要做非原位的操作,才能实现转置。

  size_t outlen[1] = {H_LEN};

         err = clfftSetResultLocation(plan_inout, CLFFT_OUTOFPLACE);

         err = clfftSetPlanDistance(plan_inout,FFT_LEN,1); //设置数组间距

         err = clfftSetPlanOutStride(plan_inout,CLFFT_1D, outlen); //设置输出元素间距

         err = clfftSetPlanLength(plan_inout,CLFFT_1D,clLengths); //设置处理长度

         err = clfftSetPlanBatchSize(plan_inout,H_LEN); //设置批处理次数

原理是:

输入序列的间距取FFT_LEN,输出序列间距为1个元素;

输出元素间距为原矩阵高(输出矩阵的宽),让输出的下一个元素间隔一行放置

设置处理长度为原矩阵的宽,就是FFT的长度

设置批处理次数,为原矩阵的高,每一行处理一次。

直接转置,会导致时间增加100~200ms/GB

性能对比:

平台

运算能力

64K点float复数FFT*2048次正变换+反变换

共1GB数据

第一台i9-12900H  2.50 GHz单核

约0.08T

9580ms

第一台Iris Xe核显

2T

传输260ms

处理306ms

RTX 3070 ti

21.75T 传输120ms
处理63ms

第二台i9-12900H  2.50 GHz单核

约0.08T 10651ms

RTX 3060

12.7T 传输144ms

处理90ms

标签:FFT,clFFT,err,间距,opencl,LEN,mingw,plan
From: https://www.cnblogs.com/yangzifb/p/17978603

相关文章

  • MINGW
    https://github.com/ejoy/ant 下载并安装msys2修改镜像服务器echo"Server=https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/">/etc/pacman.d/mirrorlist.mingw32echo"Server=https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/">......
  • cpp环境搭建 - MinGW和cmake安装
    【MinGW】MinGW主要用于在Windows上使用gnu下的相关编译工具,比如:gcc。下载地址1:MinGW-w64-for32and64bitWindows-Browse/mingw-w64atSourceForge.net下载地址2:Releases·niXman/mingw-builds-binaries(github.com)下载地址3:WinLibs-GCC+MinGW-w64compilerf......
  • Windows + MinGW-W64 Boost程序库 环境配置踩坑指南
    Windows+MinGW-W64Boost程序库环境配置踩坑指南本文仅在博客园由aquawius发布,请在转载注明本链接,我这里就不写开源协议了,总之盗文章的马没了就完了。0x00关于MinGW-W64的安装你可以自己选择,我使用的来自github的w64devkit,这个工具内置了比较多的小工具,在linux中有许......
  • Windows + MinGW-W64 Boost程序库 环境配置踩坑指南
    Windows+MinGW-W64Boost程序库环境配置踩坑指南0x00关于MinGW-W64的安装你可以自己选择,我使用的来自github的w64devkit,这个工具内置了比较多的小工具,在linux中有许多工具windows用不了,w64devkit里边就有提供(甚至包括vim!!)添加bin目录到环境变量就可以了.0x01关于Bo......
  • MinGW编译Python至pyd踩坑整理
    注意需要魔法用scoop自动安装配置MinGw需要魔法,不需要手动配置mingwscoopinstallmingw安装Cython,Setuptools第三方库关闭魔法,使用清华源pipinstallsetuptools-ihttps://pypi.tuna.tsinghua.edu.cn/simplepipinstallcython-ihttps://pypi.tuna.tsinghua.edu.cn/s......
  • 使用 MSYS2+MinGW 编译win程序
    在跨平台开发场景下,MinGW为那些习惯于使用GNU工具(例如gcc、gdb、make等)的开发者提供了一个便利:它允许他们在Windows平台上使用相同的工具链。这种做法有助于保持在不同操作系统间的开发一致性。此外,当某个应用依赖于Unix系统下的特定库,而这些库在Windows下没有直接的替代品时,MSYS2......
  • OpenCL任务调度基础介绍
    当前,科学计算需求急剧增加,基于CPU-GPU异构系统的异构计算在科学计算领域得到了广泛应用,OpenCL由于其跨平台特性在异构计算领域渐为流行,其调度困难的问题也随之暴露,传统的OpenCL任务调度需要在编码阶段确定调度方案,这种人工调度难度高、适应性差、效率低下、且存在资源竞争问题。Mu......
  • QT + OPENCV + OpenCV_contrib + MINGW编译
    参见  QT+OPENCV+OpenCV_contrib+MINGW编译_东方.既白的博客-CSDN博客注意事项:1. opencv不要采用版本太高的,与mingw730_64编译器不兼容。太多错误2. ......
  • mingw
    Git介绍版本控制的概念是一种在开发过程中,用于方便管理我们(多人协作)的代码、修改、版本、工程修改,便于查看历史记录、备份、恢复以前版本的技术。版本控制器的三种类型1.本地版本控制记录文件每次的更新,对每一个版本做一个快照存储在本地计算机(适合个人。如rcs)2.集中版......
  • OpenCL
    OpenCL是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。1.OpenCL提供了并行计算的机制......