主要内容

同步多线程访问FFTW规划生成独立的代码

这个例子展示了如何生成独立的代码(静态库,动态链接库,或可执行程序),同步多线程访问FFTW规划过程。

代码生成器产生FFTW库调用当所有这些条件是正确的:

  • 你的MATLAB®代码调用一个函数:fft,fft2,fftn,传输线,ifft2,或ifftn

  • 你生成独立的C / c++代码。

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

  • 您指定FFTW库安装在一个FFT来源于图书馆回调类coder.fftw.StandaloneFFTW3Interface

  • 你设置CustomFFTCallback配置参数回调类的名称。在MATLAB编码器™应用,使用定制FFT库调设置。

如果多个线程调用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

使用这个类作为一个模板。取代fftwLocationFFTW库安装的位置。

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,真的,真的);结束结束结束

生成一个动态链接库

  1. 创建一个代码生成配置对象生成一个动态链接库。

    cfg = coder.config (“dll”);

  2. 配置代码生成使用FFT回调类myfftcb

    cfg。CustomFFTCallback =“myfftcb”;
  3. 包括支持C代码的构建。金宝app

    cfg。CustomSource =“mylock.c”;

  4. 生成一个锁调用初始化函数初始化代码。

    cfg。CustomInitializer =“mylock_initialize ();”;

  5. 生成库。

    codegen配置cfgmycustomfft报告
    下面的例子使用了OpenMP图书馆。因此,EnableOpenMP配置参数必须真正的或者你必须手动将OpenMP旗帜传递给编译器。默认情况下,EnableOpenMP参数是真正的

指定的配置参数MATLAB编码器应用程序

对于前面的示例MATLAB编码器应用程序,使用这些项目设置:

  • 指定FFT图书馆回调类,集定制FFT库调myfftcb

  • 包括指定C代码,设置额外的源文件mylock.c

  • 指定代打个电话mylock_initialize在初始化代码,设置初始化函数mylock_initialize ();

另请参阅

|

相关的话题

外部网站