我不能相信这实际工作。
对于较小的问题,不能向量化,一个MEX文件中正确设置多线程可以创造出足够的开销单线程解决方案通常更快。使用线程池消除了开销。池被创建一次,然后可以重新用于多次调用您的MEX功能。然后线程池被关闭并从由分型存储器清零“清除所有”在命令行或“清晰MEX”(或关闭MATLAB)。
根据不同的问题,您可以看到可能高达“maxNumCompThreads”的加速,虽然这可能并不容易。在我的非常基本的测试,我看到〜2倍的加速(四个线程)在一个小问题多次迭代。对于现实世界的问题,我创造了这个对,我发现了约60%,增速比标准MEX多线程,救了我一两天的总模拟时间。
另外,加入多线程的MEX文件现在容易得多,因为你只需要学习如何使用一个功能,AddThreadPoolJob。那么你一定要记得关闭与SynchronizeThreads您的MEX文件,这样你就不会得到真棒竞争条件。
查看包括madd_threadpool.c例子,并比较madd.c使用正多线程弄清楚发生了什么事情。还有在threadpool.h更多的文档。要了解如何单线程与多线程与线程池与量化代码进行比较,编译的东西,并检查了threadpool_timings.m。
注:正确矢量MATLAB代码总是会比这更快。只有用这个东西,如果你不能向量化你的代码,但它仍然本身借给简单的并行化,例如集成在多个维度递推关系。
oreoman(2020)。简单MEX多线程W / A永久线程池(https://www.github.com/michael-nix/MATLAB-MEX-Threadpool),GitHub的。检索。
1.1.1 | 连接到GitHub上... |
|
1.1.0 | 添加了一些辅助功能,使我的生活更轻松,并有可能使用多个MEX文件中相同的线程池。不能正确记录因为我懒。 |