小编Tod*_*odd的帖子

将FFTW链接到Matlab Mex文件

我试图在mex文件中运行FFTW代码.这完全是为了开发和测试的目的.经过一些谷歌搜索,我看到其他人试图做类似的事情,并有相关的问题,但我没有找到任何解决方案.在尝试运行mex文件时,Matlab告诉我:

??? 使用错误==> chirpTransform.mxCta无效的MEX文件'\ removed\my\directory\+ chirpTransform\mxCta.mexw32':找不到指定的过程.

.

我正在使用gnumex和MinGW来构建mex文件,因为LCC似乎有一些问题.我尝试过使用FFTW站点的32位DLL(http://www.fftw.org/install/windows.html).我尝试在Matlab 2009b bin目录中使用fftwf3.dll.我使用Msys/MinGW从源代码构建了dll.在所有情况下,结果都是相同的.在所有情况下,我都执行以下操作来生成lib文件.

c:\ gnumex\mexdlltool.exe -d libfftw3f-3.def -D libfftw3f-3.dll -l libfftw3f.lib --as C:\ MinGW\bin\as.exe

我也尝试使用visual studio lib.exe工具并尝试各种mexdlltool标志.

看来我可以使用Matlab的loadlibrary功能直接调用fftwf3-3.dll中的函数.由于DLL似乎不是问题,我尝试构建静态版本的fftwf3并将其直接链接到mex文件.我得到了相同的结果!如果我删除FFTW代码,mex文件运行正常.我刚刚放弃了这一点,而且我想要提出其他测试方法.

windows matlab mex fftw

6
推荐指数
1
解决办法
1492
查看次数

可预测地分析单个函数

我需要一种更好的方法来分析数字代码。假设我在 64 位 x86 上的 Cygwin 中使用 GCC,并且我不打算购买商业工具。

情况是这样的。我有一个函数在一个线程中运行。除了内存访问之外,没有任何代码依赖性或 I/O,可能有一些数学库的链接是例外。但在大多数情况下,所有这些都是表查找、索引计算和数值处理。我已经缓存对齐堆和堆栈上的所有数组。由于算法的复杂性、循环展开和长宏,汇编列表可能会变得很长——数千条指令。

我一直在求助于使用 Matlab 中的 tic/toc 计时器、bash shell 中的时间实用程序,或者直接在函数周围使用时间戳计数器 (rdtsc)。问题是这样的:时间的方差(可能高达运行时间的 20%)大于我正在做的改进的大小,所以我无法知道代码是更好还是更糟改变后。你可能会认为是时候放弃了。但我不同意。如果您坚持不懈,许多渐进式改进可以带来两到三倍的性能提升。

我多次遇到的一个特别令人抓狂的问题是我进行了更改,并且性能似乎持续提高了 20%。第二天,收益就消失了。现在有可能我对代码进行了我认为无害的更改,然后完全忘记了它。但我想知道是否有可能发生其他事情。就像 GCC 可能不会像我相信的那样产生 100% 的确定性输出。或者可能是更简单的事情,比如操作系统将我的进程移到了一个更繁忙的核心。

我已经考虑了以下内容,但我不知道这些想法中的任何一个是否可行或有意义。如果是,我需要有关如何实施解决方案的明确说明。 目标是最小化运行时的差异,以便我可以有意义地比较优化代码的不同版本。

  • 将我的处理器的一个核心专用于运行我的例程。
  • 直接控制缓存(加载或清除)。
  • 确保我的 dll 或可执行文件始终加载到内存中的同一位置。我的想法是,缓存的集合关联性可能与 RAM 中的代码/数据位置交互,以改变每次运行的性能。
  • 某种周期精确仿真器工具(非商业)。
  • 是否可以对上下文切换进行一定程度的控制?或者它甚至重要吗?我的想法是上下文切换的时间会导致可变性,可能是导致管道在不合时宜的时间被刷新。

过去,我通过计算汇编列表中的指令在 RISC 架构上取得了成功。当然,这只适用于指令数量很少的情况。某些编译器(如 TI 的 C67x 代码编辑器)将为您详细分析它如何使 ALU 保持忙碌。

我还没有发现 GCC/GAS 生成的程序集列表特别有用。随着全面优化,代码被移动到所有地方。对于分散在汇编列表中的单个代码块,可以有多个位置指令。此外,即使我能理解程序集如何映射回我的原始代码,我也不确定现代 x86 机器上的指令数和性能之间是否有很大的相关性。

我尝试使用 gcov 进行逐行分析,但由于我构建的 GCC 版本与 MinGW 编译器不兼容,因此无法正常工作。

您可以做的最后一件事是在多次试运行中取平均值,但这需要很长时间。


编辑(RE:调用堆栈采样)

我的第一个问题是,实际上,我该怎么做?在你的一张幻灯片中,你展示了使用 Visual Studio 暂停程序。我拥有的是由 GCC 编译的 DLL,并在 Cygwin 中进行了全面优化。然后由 Matlab 使用 VS2013 编译器编译的 mex DLL 调用它。

我使用 Matlab 的原因是因为我可以轻松地试验不同的参数并将结果可视化,而无需编写或编译任何低级代码。此外,我可以将优化的 …

c optimization gcc profiling

5
推荐指数
1
解决办法
244
查看次数

具有多个功能输出的Julia内存重用

您可以按如下方式重用阵列内存

> a=[1,2,3];b=a;a=[1,2,3];is(a,b)
false

> a=[1,2,3];b=a;a.=[1,2,3];is(a,b)
true
Run Code Online (Sandbox Code Playgroud)

在我分配整个阵列时,这是唯一必要的.分配子集时,无论是使用.=还是使用,都将始终使用现有数组=.

当使用具有多个输出的函数时,我遇到了这个问题.例:

> f = () -> ([1,2,3],[4,5,6]);
> a, = f()
([1,2,3],[4,5,6])

> a, .= f()
 ERROR: syntax: invalid identifier name ".="

> (a,) .= f()
ERROR: MethodError: no method matching broadcast!(::Base.#identity,::Tuple{Array{Int64,1}}, ::Tuple{Array{Int64,1},Array{Int64,1}})
Closest candidates are:
  broadcast!{nargs}(::Any, ::AbstractArray{T,N}, ::Any...) at broadcast.jl:169
  broadcast!(::Base.#identity, ::AbstractArray{T,N}, ::Number) at broadcast.jl:19
  broadcast!{T,S,N}(::Base.#identity, ::AbstractArray{T,N}, ::AbstractArray{S,N}) at broadcast.jl:23
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,而不必a在每次通话时扔掉?

memory-management julia

0
推荐指数
1
解决办法
185
查看次数

标签 统计

c ×1

fftw ×1

gcc ×1

julia ×1

matlab ×1

memory-management ×1

mex ×1

optimization ×1

profiling ×1

windows ×1