此示例显示了如何生成独立代码(静态库,动态链接的库或可执行程序),同步多线程访问FFTW计划过程。
当所有这些条件都是真的时,代码生成器会产生FFTW库调用:
如果多个线程调用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初始化,设置和解开锁定的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回调类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);结尾结尾结尾
创建用于生成动态链接库的代码生成配置对象。
cfg = coder.config('DLL');
配置代码生成以使用FFT回调类myfftcb.
。
cfg。CustomFFTCallback ='myfftcb';
包括构建中的支持C代码。万博1manbetx
cfg。CustomSource =“mylock.c”;
在初始化代码中生成对锁定初始化功能的调用。
CFG.Custominitializer =“mylock_initialize();”;
生成库。
Codegen.-Config.CFG.mycustomfft报告
EnableOpenmp.
配置参数必须为真正的
或者您必须手动将OpenMP标志传递给您的编译器。默认情况下,EnableOpenmp.
参数是真正的
。中前面的例子Matlab编码器应用程序,使用这些项目设置:
指定FFT库回调类,设置自定义FFT库回调到myfftcb.
。
指定要包含的C代码,请设置额外的源文件到mylock.c.
。
指定呼叫的生成mylock_initialize.
在初始化代码中,设置初始化功能到mylock_initialize();
。
coder.ceval
|coder.fftw.standalonefftw3interface.