主要内容

在代码中同步多线程FFTW规划MATLAB函数

此示例展示了如何生成代码,以同步对FFTW库调用的FFTW规划过程的多线程访问MATLAB函数块。

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

  • 一个MATLAB函数Block调用以下函数之一:fftfft2fftn传输线ifft2,或ifftn

  • 的模型生成C/ c++代码MATLAB函数块。

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

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

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

如果您将包含FFTW调用的代码与运行在多个线程上的外部代码集成在一起,那么您必须防止并发访问FFTW规划过程。在FFT库回调类中,实现解锁方法。您还必须提供管理锁或互斥锁的C代码。许多库,如OpenMP、pthreads和c++标准库(c++ 11及更高版本),都提供了锁。此示例展示了如何实现解锁方法并提供支持的C代码。金宝app为了管理锁,本例使用OpenMP库。

先决条件

在开始之前,对于生成FFTW库的基本工作流,在a中调用快速傅里叶变换MATLAB函数块,看加速从MATLAB函数块生成的代码中的快速傅里叶变换

你必须:

  • 访问已安装的FFTW库。

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

创建一个模型MATLAB函数调用FFT函数的块

  1. 创建Simulin金宝appk®模型并添加MATLAB函数阻挡它。

  2. 将此代码添加到MATLAB函数块。

    函数Y = mycustomfft() t = 0:1/50:10-1/50;X = sin(2* *15*t) + sin(2* *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_nest_lock_t lockVar;void mylock_initialize(void) {omp_init_nest_lock(&lockVar);}无效mylock(无效){omp_set_nest_lock(&lockVar);}无效myunlock(无效){omp_unset_nest_lock(&lockVar);}

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

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

创建一个FFT库回调类

编写一个FFT回调类myfftcb:

  • 指定FFTW库。

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

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

classdefmyfftcb < coder. fftw3 . standalone efftw3 interface方法(静态)函数th = getNumThreads coder.inline“总是”);Th = int32(coder.const(1));结束函数锁()coder.cinclude (“mylock.h”“InAllSourceFiles”,真正的);coder.inline (“总是”);coder.ceval (“mylock”);结束函数解锁()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”;[~, libeext] = ctx.getStdLibInfo();libName1 = [libName1 libeext];addLinkObjects(buildInfo, libName1, libPath, 1000, true, true);%的单libName2 =“libfftw3f-3”;[~, libeext] = ctx.getStdLibInfo();libName2 = [libName2];addLinkObjects(buildInfo, libName2, libPath, 1000, true, true);结束结束结束

配置代码生成参数并构建模型

  1. 配置代码生成以使用FFTW回调类和由解锁方法。配置代码生成以生成对mylock_initialize在初始化代码中。

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

    • 自定义FFT库回调myfftcb

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

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

  2. 构建模型。

另请参阅

相关的话题

外部网站