在代码中同步多线程FFTW规划MATLAB函数块
此示例展示了如何生成代码,以同步对FFTW库调用的FFTW规划过程的多线程访问MATLAB函数块。
当所有这些条件都为真时,代码生成器产生FFTW库调用:
如果您将包含FFTW调用的代码与运行在多个线程上的外部代码集成在一起,那么您必须防止并发访问FFTW规划过程。在FFT库回调类中,实现锁
和解锁
方法。您还必须提供管理锁或互斥锁的C代码。许多库,如OpenMP、pthreads和c++标准库(c++ 11及更高版本),都提供了锁。此示例展示了如何实现锁
和解锁
方法并提供支持的C代码。金宝app为了管理锁,本例使用OpenMP库。
先决条件
在开始之前,对于生成FFTW库的基本工作流,在a中调用快速傅里叶变换MATLAB函数块,看加速从MATLAB函数块生成的代码中的快速傅里叶变换.
你必须:
访问已安装的FFTW库。
一个支持OpenMP库的编译器。金宝app要使用不同的库,如pthreads,请相应地修改支持的C代码。金宝app
创建一个模型MATLAB函数调用FFT函数的块
创建Simulin金宝appk®模型并添加MATLAB函数阻挡它。
将此代码添加到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);结束
添加一个
外港
阻塞并连接到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);结束结束结束
配置代码生成参数并构建模型
配置代码生成以使用FFTW回调类和由
锁
和解锁
方法。配置代码生成以生成对mylock_initialize
在初始化代码中。在“配置参数”对话框中:
集自定义FFT库回调来
myfftcb
.在代码生成>自定义代码下,其他构建信息,设置源文件来
mylock.c
.在代码生成>自定义代码下,在生成中插入自定义C代码,设置初始化函数来
mylock_initialize ();
.
构建模型。
另请参阅
coder.fftw.StandaloneFFTW3Interface