文档

在从a生成的代码中同步多线程fftw规划MATLAB函数堵塞

此示例显示了如何生成代码,该代码同步到FFTW库的FFTW账户中的FFTW规划过程中的代码中的呼叫MATLAB函数块。

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

  • 一个MATLAB函数Block调用以下函数之一:FFT.fft2fftn传输线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函数块生成的代码中加速快速傅里叶变换(金宝app仿真软件编码器)。

你必须有:

  • 访问已安装的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函数来初始化、设置和取消设置锁。这个例子使用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 ('inclock');结束功能解锁()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. 配置代码生成以使用FFTW回调类和C代码调用解锁方法。配置代码生成以生成对的调用mylock_initialize在初始化代码中。

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

    • 自定义FFT库回调myfftcb

    • 代码生成>自定义代码下,额外的构建信息,设置源文件mylock.c

    • 代码生成>自定义代码下,在生成的代码中插入定制的C代码,设置初始化函数mylock_initialize ();

  2. 构建模型。

另请参阅

相关话题

外部网站