文件

在从a生成的代码中同步多线程fftw规划Matlab功能堵塞

此示例显示了如何生成代码,该代码同步到FFTW库的FFTW账户中的FFTW规划过程中的代码中的呼叫Matlab功能堵塞。

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

  • 一种Matlab功能块调用其中一个函数:FFT.FFT2.FFTN.IFFT.IFFT2., 或者IFFTN.

  • 您为包含的模型生成C / C ++代码Matlab功能堵塞。

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

  • 您将FFT库的FFTW库安装指定为来自的FFT库呼叫类coder.fftw.standalonefftw3interface.

  • 你设置了自定义FFT库回调配置参数到回调类的名称。

如果您集成了包含在多个线程上运行的外部代码的FFTW调用的代码,则必须防止并发访问FFTW规划过程。在您的FFT库回调类中,实施开锁方法。您还必须提供管理锁或互斥锁的C代码。许多图书馆,例如OpenMP,Pthreads和C ++标准库(C ++ 11及更高版本)提供锁。此示例显示了如何实现开锁方法并提供支持C代码。金宝app要管理锁,此示例使用OpenMP库。

先决条件

在开始之前,对于生成FFTW库的基本工作流程,请呼叫快速傅里叶变换Matlab功能块,看看加快从MATLAB功能块生成的代码中的快速傅里叶变换

你必须有:

  • 访问已安装的FFTW库。

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

创建一个模型Matlab功能拨打FFT功能的块

  1. 创建一个simul金宝appink.®模型并添加一个matlab仿乐币块到它。

  2. 将此代码添加到Matlab功能堵塞。

    功能y = mycustomfft()t = 0:1/50:10-1 / 50;X = SIN(2 * PI * 15 * T)+ SIN(2 * PI * 20 * T);y = fft(x);为了k = 1:100 y = y + Ifft(x + k);结尾

  3. 加一个外港阻止并将其连接到Matlab功能堵塞。

写支持C代码金宝app

写入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.包含:

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

创建一个FFT库回调类

写一个FFT回调类myfftcb.那:

  • 指定FFTW库。

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

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

Classdef.myfftcb 方法(静止的)功能th = getnumthreads编码器.inline('总是');th = int32(编码器.const(1));结尾功能lock()编码器.Cinclude('mylock.h''inallsourcefiles', 真的);编码器.inline('总是');Coder.CEVAL('inclock');结尾功能解锁()编码器.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. 配置代码生成以使用FFTW回调类和C代码调用开锁方法。配置代码生成以生成呼叫mylock_initialize.在初始化代码中。

    在“配置参数”对话框中:

    • 自定义FFT库回调myfftcb.

    • 代码>自定义代码, 在下面其他构建信息, 放源文件mylock.c.

    • 代码>自定义代码, 在下面在生成的中插入自定义C代码, 放初始化功能mylock_initialize();

  2. 构建模型。

也可以看看

相关话题

外部网站