文档

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

这个例子展示了如何生成独立的代码(静态库、动态链接库或可执行程序)来同步对FFTW规划过程的多线程访问。

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

  • 你的MATLAB®代码调用以下函数之一:FFT.fft2fftn传输线ifft2,或ifftn

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

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

  • 您可以在源自源自的FFT库回调类中指定FFTW库安装coder.fftw.StandaloneFFTW3Interface

  • 你设置customfftcallback.配置参数到回调类的名称。在里面MATLAB编码器™应用,使用自定义FFT库回调设置。

如果多个线程调用FFTW库,则生成的代码必须防止对FFTW计划过程并发访问。要同步对FFTW规划的访问,请在FFT库回调类中实现解锁方法。您还必须提供管理锁或互斥锁的C代码。许多库,如OpenMP、pthreads和c++标准库(c++ 11及更高版本)都提供了锁。这个例子展示了如何实现解锁方法并提供支持的C代码。金宝app为了管理锁,本例使用OpenMP库。

先决条件

在开始之前,对于在独立代码中生成FFTW库呼叫的基本工作流程,请参阅通过使用FFTW库调用加速生成的独立代码中的快速傅里叶变换

你必须有:

  • 访问已安装的FFTW库。

  • 支持OpenMP库的编译器。金宝app要使用不同的库,如pthreads,请相应地修改支持C代码。金宝app

创建一个MATLAB功能

写一个matlab函数mycustomfft调用a中的快速傅里叶变换函数parfor循环:

功能y = mycustomfft()% # codegent = 0:1/50:10-1 / 50;X = SIN(2 * PI * 15 * T)+ SIN(2 * PI * 20 * T);y = fft(x);parfork = 1:100 y = y + ifft(x + k);结束

编写支持C代金宝app码

编写C函数来初始化、设置和取消设置锁。这个例子使用OpenMP库来管理锁。对于不同的库,相应地修改代码。

  • 创建文件mylock.c包含以下C代码:

    #include "mylock.h" #include "omp.h" static omp_nest_lock_t lockVar;void mylock_initialize(void) {omp_init_nest_lock(&lockVar);} void mylock(void) {omp_set_nest_lock(&lockVar);} void myunlock(void) {omp_unset_nest_lock(&lockVar);}

  • 创建头文件mylock.h.包含:

    #ifndef mylock_h #define mylock_h void mylock_initialize(void);void mylock(空白);void myunlock(空白);#万一

写一个FFT库回调类

写一个FFT回调类myfftcb那:

  • 指定FFTW库。

  • 实施解锁方法调用支持的C代码来控制对FFTW计划的访金宝app问。

使用这个类作为模板。取代fftwLocation您的FFTW库安装的位置。

classdefmyfftcb 方法(静止的)功能th = getnumthreads编码器.inline(“总是”);th = int32(编码器.const(1));结束功能锁()coder.cinclude (“mylock.h”“InAllSourceFiles”,真正的);coder.inline (“总是”);coder.ceval ('yiclock');结束功能解锁()coder.cinclude (“mylock.h”“InAllSourceFiles”,真正的);coder.inline (“总是”);coder.ceval (“myunlock”);结束功能UpdateBuildInfo(BuildInfo,CTX)fftwlocation ='\ usr \ lib \ fftw';includePath = fullfile (fftwLocation,“包括”);buildInfo.addIncludePaths (includePath);libPath = fullfile (fftwLocation,“自由”);%双倍的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代码。金宝app

    cfg.customsource ='mylock.c'

  4. 在初始化代码中生成对锁初始化函数的调用。

    cfg。CustomInitializer ='mylock_initialize();'

  5. 生成库。

    codegen配置cfgmycustomfft-报告
    本例使用OpenMP库。因此,EnableOpenMP配置参数必须是真的或者必须手动将OpenMP标志传递给编译器。默认情况下,EnableOpenMP参数是真的

指定配置参数MATLAB编码器应用程序

对于前面的示例中MATLAB编码器App,使用这些项目设置:

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

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

  • 指定调用的生成mylock_initialize在初始化代码中,设置初始化函数mylock_initialize ();

另请参阅

|

相关话题

外部网站