我用C ++编写了一个mex文件,以提高MATLAB中缓慢'for循环'的速度。我写了两个版本,一个没有openMP,另一个没有。获得的收益非常好,但是在测试我注意到的时序时,由于多线程,出现了意想不到的结果:当mex文件传回MATLAB时出现时滞。
我通过MATLAB中的主文件运行程序,该文件调用mex文件的两个版本并使用tic-toc计时;它还计算循环本身。每个mex文件完成后,时间将显示在MATLAB命令窗口中,随后进行下一次计算。此外,当多线程mex文件启动时,从观察CPU使用情况可以看出,因为两个CPU都达到了100%。代码格式为
Initial data generation for inputs....;
tic;
[Output] = mex_unthreaded(inputs...);
Time_unthreaded = toc
tic;
[Output_threaded] = mex_threaded(inputs...);
Time_threaded = toc
tic;
MATLAB loops...;
Time_MATALB = toc
从非openMP mex文件中,当C ++传回MATLAB时并不明显,因为CPU使用率没有明确的变化。但是,当openMP mex文件运行时,当C ++代码传回MATLAB时,它有明显的终点:CPU使用率下降。这意味着我可以粗略地将C ++时间用于观察CPU使用情况。从CPU使用率下降到MATLAB中的时序出现的时间似乎有大约20%的滞后。例如,从观察CPU的使用情况来看,我得到300s的CPU为100%,然后额外约75s,直到MATLAB从tic-toc定时注册~377s。
我只能认为这是传递回MATLAB的数据的某种开销,因为滞后时序随着输出的数据变大而增加。我对这个结果不满意的原因是我认为数据是在MATLAB内存中通过指向MATLAB mxArrays的指针在C ++中处理的。因此,不应该传回任何信息。
我想到的第二种可能性是,一旦mex文件结束,MATLAB可能正在对数据进行某种形式的分析,例如: max-mins等。
如果有人能够对此事有所了解,我们将不胜感激。
非常感谢
答案 0 :(得分:1)
我可以在我的系统上调用mex函数(也使用OpenMP),在一毫秒内传入相当大量的数据(大约100 MB,大约6 MB),根据{ {1}} / tic
,这意味着在我的情况下,任何后期处理的MatLab都是非常小的。
您返回的是哪类数据(实数或复数矩阵,单元数组,结构数组或其他内容)以及数据量是多少?
请记住,OpenMP可能无法并行化所有代码,最后通常需要执行减少步骤,或者计算的分割可能不均匀,因此一个CPU需要更长时间,或者如果没有OpenMP,您可能会有一大块处理编译指示。但我不认为回到MatLab导致你看到的延迟。
答案 1 :(得分:1)
我认为你认为滞后与数据大小成正比是正确的。我意识到我的帖子之后!我还使用GetTickCount在C ++中使用时序运行代码,并且与tic / toc几乎完全相同。
我正在使用intel i5来测试多线程。看起来分裂并不是偶然的,但是它总是在最后而不是在整个计算过程中似乎很奇怪。两个核心在代码开始时达到100%,并一直保持到最后。我假设一个线程必须在另一个线程之前完成,尽管从循环中,它们应该在两个线程之间非常均匀地分布,而不是20%不同。
感谢您的回复。我现在感到满意的是,在MATLAB和mex文件之间传输数据没有任何开销。我刚刚完成了我的C ++多线程编码!!!