这个例子展示了如何生成独立的代码(静态库、动态链接库或可执行程序)来同步对FFTW规划过程的多线程访问。
当所有这些条件都为真时,代码生成器会生成FFTW库调用:
如果多个线程调用FFTW库,则生成的代码必须防止对FFTW计划过程并发访问。要同步对FFTW规划的访问,请在FFT库回调类中实现锁
和解锁
方法。您还必须提供管理锁或互斥锁的C代码。许多库,如OpenMP、pthreads和c++标准库(c++ 11及更高版本)都提供了锁。这个例子展示了如何实现锁
和解锁
方法并提供支持的C代码。金宝app为了管理锁,本例使用OpenMP库。
在开始之前,对于在独立代码中生成FFTW库呼叫的基本工作流程,请参阅通过使用FFTW库调用加速生成的独立代码中的快速傅里叶变换.
你必须有:
访问已安装的FFTW库。
支持OpenMP库的编译器。金宝app要使用不同的库,如pthreads,请相应地修改支持C代码。金宝app
写一个matlab函数mycustomfft
调用a中的快速傅里叶变换函数parfor
循环:
功能y = mycustomfft()% # codegent = 0:1/50:10-1 / 50;X = SIN(2 * PI * 15 * T)+ SIN(2 * PI * 20 * T);y = fft(x);parfork = 1:100 y = y + ifft(x + k);结束
编写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回调类myfftcb
那:
指定FFTW库。
实施锁
和解锁
方法调用支持的C代码来控制对FFTW计划的访金宝app问。
使用这个类作为模板。取代fftwLocation
您的FFTW库安装的位置。
classdefmyfftcb方法(静止的)功能th = getnumthreads编码器.inline(“总是”);th = int32(编码器.const(1));结束功能锁()coder.cinclude (“mylock.h”,“InAllSourceFiles”,真正的);coder.inline (“总是”);coder.ceval ('yiclock');结束功能解锁()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);结束结束结束
创建用于生成动态链接库的代码生成配置对象。
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编码器App,使用这些项目设置:
要指定FFT库回调类,请设置自定义FFT库回调来myfftcb
.
要指定要包含的C代码,请设置附加源文件来mylock.c
.
指定调用的生成mylock_initialize
在初始化代码中,设置初始化函数来mylock_initialize ();
.
Coder.CEVAL.
|coder.fftw.StandaloneFFTW3Interface