同步多线程访问FFTW规划生成独立的代码
这个例子展示了如何生成独立的代码(静态库,动态链接库,或可执行程序),同步多线程访问FFTW规划过程。
代码生成器产生FFTW库调用当所有这些条件是正确的:
如果多个线程调用FFTW库,那么生成的代码必须防止并发访问FFTW规划过程。同步访问FFTW规划、FFT图书馆回调类,实现锁
和解锁
方法。您还必须提供管理锁或互斥的C代码。许多图书馆,如OpenMP, pthreads和c++标准库(c++,后来11日)提供锁。这个例子展示了如何实现锁
和解锁
方法和提供支持的C代码。金宝app管理一个锁,这个示例使用OpenMP图书馆。
先决条件
在你开始之前,对生成的基本工作流FFTW库调用在独立的代码中,看到的加快快速傅里叶变换使用FFTW库调用生成的独立的代码。
你必须有:
访问一个安装FFTW图书馆。
一个编译器,它支持OpenMP图金宝app书馆。使用不同的库,比如pthreads,相应地修改支持C代码。金宝app
创建一个MATLAB函数
编写一个MATLAB函数mycustomfft
调用一个快速傅里叶变换函数内parfor
循环:
函数y = mycustomfft ()% # codegent = 0:1/50:10-1/50;x =罪(2 *π* 15 * t) +罪(2 *π* 20 * t);y = fft (x);parfork = 1:10 0 y = y +传输线(x + k);结束
编写支持C代金宝app码
编写C函数,初始化、设置和设置一个锁。下面的例子使用了OpenMP图书馆管理锁。不同的图书馆,相应地修改代码。
创建一个文件
mylock.c
包含这个C代码:# include“mylock。h omp # include。h”静态omp_nest_lock_t lockVar;空白mylock_initialize (void) {omp_init_nest_lock (&lockVar);}无效mylock (void) {omp_set_nest_lock (&lockVar);}无效myunlock (void) {omp_unset_nest_lock (&lockVar);}
创建一个头文件
mylock.h
包含:的ifndef MYLOCK_H # define MYLOCK_H空白mylock_initialize(无效);空白mylock(无效);空白myunlock(无效);# endif
写一个FFT图书馆回调类
写一个FFT回调类myfftcb
:
指定FFTW图书馆。
实现了
锁
和解锁
方法调用支持C代码来控制访问FFTW规划。金宝app
使用这个类作为一个模板。取代fftwLocation
FFTW库安装的位置。
classdefmyfftcb < coder.fftw.StandaloneFFTW3Interface方法(静态)函数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”;[~,libExt] = ctx.getStdLibInfo ();libName1 = [libName1 libExt];addLinkObjects (buildInfo libName1 libPath 1000,真的,真的);%的单libName2 =“libfftw3f-3”;[~,libExt] = ctx.getStdLibInfo ();libName2 = [libName2 libExt];addLinkObjects (buildInfo libName2 libPath 1000,真的,真的);结束结束结束
生成一个动态链接库
创建一个代码生成配置对象生成一个动态链接库。
cfg = coder.config (“dll”);
配置代码生成使用FFT回调类
myfftcb
。cfg。CustomFFTCallback =“myfftcb”;
包括支持C代码的构建。金宝app
cfg。CustomSource =“mylock.c”;
生成一个锁调用初始化函数初始化代码。
cfg。CustomInitializer =“mylock_initialize ();”;
生成库。
codegen配置cfgmycustomfft报告
EnableOpenMP
配置参数必须真正的
或者你必须手动将OpenMP旗帜传递给编译器。默认情况下,EnableOpenMP
参数是真正的
。
指定的配置参数MATLAB编码器应用程序
对于前面的示例MATLAB编码器应用程序,使用这些项目设置:
指定FFT图书馆回调类,集定制FFT库调来
myfftcb
。包括指定C代码,设置额外的源文件来
mylock.c
。指定代打个电话
mylock_initialize
在初始化代码,设置初始化函数来mylock_initialize ();
。
另请参阅
coder.ceval
|coder.fftw.StandaloneFFTW3Interface