同步多线程访问FFTW规划在生成的独立代码

此示例显示了如何生成独立代码(静态库,动态链接的库或可执行程序),同步多线程访问FFTW计划过程。

当所有这些条件都是真的时,代码生成器会产生FFTW库调用:

  • 你的matlab®代码调用其中一个函数:fftFFT2.FFTN.IFFT.IFFT2., 或者IFFTN.

  • 生成独立的C/ c++代码。

  • 您可以访问FFTW库安装,版本3.2或更高版本。

  • 派生的FFT库回调类中指定FFTW库安装coder.fftw.standalonefftw3interface.

  • 你设置了CustomFFTCallback配置参数设置回调类的名称。在Matlab Coder™应用程序,使用自定义FFT库回调环境。

如果多个线程调用FFTW库,那么生成的代码必须防止并发访问FFTW规划过程。为了同步访问FFTW计划,在你的FFT库回调类中,实现开锁方法。您还必须提供管理锁或互斥锁的C代码。许多图书馆,例如OpenMP,Pthreads和C ++标准库(C ++ 11及更高版本)提供锁。此示例显示了如何实现开锁方法并提供支持C代码。万博1manbetx要管理锁,此示例使用OpenMP库。

先决条件

在开始之前,要了解在独立代码中生成FFTW库调用的基本工作流,请参见使用FFTW库调用加快生成的独立代码中的快速傅里叶变换

你必须有:

  • 访问已安装的FFTW库。

  • 支持OpenMP库的编译器。万博1manbetx要使用不同的库,例如pthreads,相应地修改支持C代码。万博1manbetx

创建一个马铃薯草函数

编写MATLAB函数mycustomfft这调用了一个快速的傅里叶变换功能par环形:

函数y = mycustomfft ()%#codegen.t = 0:1/50:10-1/50;X = sin(2* 15*t) + sin(2* 20*t)y = fft (x);pary = y + ifft(x+ K);结尾

写支持C代码万博1manbetx

写入C初始化,设置和解开锁定的C功能。此示例使用OpenMP库来管理锁定。对于另一个库,相应地修改代码。

  • 创建一个文件mylock.c.包含此C代码:

    #include“mylock.h”#include“Omp.h”静态OMP_NEST_LOCK_T LOCKVAR;void mylock_initialize(void){op_init_nest_lock(&lockvar);void mylock(void){op_set_nest_lock(&lockvar);void myunlock(void){op_unset_nest_lock(&lockvar);}

  • 创建标题文件mylock.h包含:

    #define MYLOCK_H void mylock_initialize(void);空白mylock(无效);空白myunlock(无效);# endif

编写一个FFT库回调类

编写一个FFT回调类myfftcb.:

  • 指定FFTW库。

  • 实现了开锁调用支持C代码的方法来控制对FFTW规划的访万博1manbetx问。

使用此类作为模板。代替fftwlocation.使用FFTW库安装的位置。

Classdef.myfftcb < coder.fftw.StandaloneFFTW3Interface方法(静态)函数th = getNumThreads code .inline('总是');th = int32 (coder.const (1));结尾函数lock()编码器.Cinclude('mylock.h''inallsourcefiles', 真的);编码器.inline('总是');Coder.CEVAL(“mylock”);结尾函数解锁()编码器.cinclude('mylock.h''inallsourcefiles', 真的);编码器.inline('总是');Coder.CEVAL('myunlock');结尾函数updateBuildInfo(buildInfo, ctx) fftwLocation =“\ usr \ lib \ fftw”;IncludePath = fullfile(fftwlocation,'包括');buildinfo.addincludepaths(IncludePath);libpath = fullfile(fftwlocation,'lib');%的两倍libname1 ='libfftw3-3';[~, libExt] = ctx.getStdLibInfo();libName1 = [libName1 libExt];addLinkObjects(buildInfo, libName1, libPath, 1000, true, true);%单身的libname2 ='libfftw3f-3';[~, libExt] = ctx.getStdLibInfo();libName2 = [libName2 libExt];addLinkObjects(buildInfo, libName2, libPath, 1000, true, true);结尾结尾结尾

生成动态链接库

  1. 创建用于生成动态链接库的代码生成配置对象。

    cfg = coder.config('DLL');

  2. 配置代码生成以使用FFT回调类myfftcb.

    cfg。CustomFFTCallback ='myfftcb'
  3. 包括构建中的支持C代码。万博1manbetx

    cfg。CustomSource =“mylock.c”

  4. 在初始化代码中生成对锁定初始化功能的调用。

    CFG.Custominitializer =“mylock_initialize();”

  5. 生成库。

    Codegen.-Config.CFG.mycustomfft报告
    此示例使用OpenMP库。因此,这是EnableOpenmp.配置参数必须为真正的或者您必须手动将OpenMP标志传递给您的编译器。默认情况下,EnableOpenmp.参数是真正的

指定配置参数马铃薯草编码器应用程序

中前面的例子Matlab编码器应用程序,使用这些项目设置:

  • 指定FFT库回调类,设置自定义FFT库回调myfftcb.

  • 指定要包含的C代码,请设置额外的源文件mylock.c.

  • 指定呼叫的生成mylock_initialize.在初始化代码中,设置初始化功能mylock_initialize();

也可以看看

|

相关的话题

外部网站