2014-07-03 156 views
1

我目前有一段代码,我试图优化,瓶颈似乎是从一个相当大的矩阵中提取给定的列。高效提取矩阵的列

特别是,我的代码花了50%的时间来执行Wi = W(:,minColIdx)。我也试过线性索引,但没有改变。

我想知道是否有人知道这是为什么,如果有人有任何提示,可以帮助我优化我的代码的这一部分。

谢谢!

编辑:这是我的代码:http://pastebin.com/TnTy6a8D 它现在真的很差优化,我只是在我的新GPU上玩了一下gpuArray。 44行和53行,我试图从W中提取列,是代码瓶颈的地方。

+1

是否有可能共享其他代码呢? – Divakar

+2

这部分几乎不能优化。正如Divakar所说,给我们更多的东西:-) –

+0

@Divakar我将我的代码添加到原始文章。谢谢。 –

回答

1

操作速度能否提高?

当然是

是否值得优化索引代码?

大概不会


Matlab是在基本的矩阵运算真的很好(如果C++做起来快10%,我会很惊讶)。如果你真的想要显着提高性能,提高硬件性能可能是你最好的选择,你可以忘记寻找更好的索引矩阵的方法。

这就是说,当然总是值得考虑一下,你是否真的需要做大量的计算,或者你是否可以考虑更智能的算法。

+0

+1 for ** On-The-Face-Titles ** :)在一个严肃的说明中,我认为'runtime'可能是一个更好的术语,而不是'speed',因为我们正在处理GPU。 – Divakar

+0

所以你说即使在C++中,做这样的操作也会很慢?我打算重写我的代码来使用CUDA,而不是MATLAB内置的GPU计算能力 - 并且据我所知,在CUDA/C++下使用元素操作会更好,所以这个问题将会被绕过。 –

+0

@DanielCrane我建议像MAGMA这样的产品,因为它是基于GPU的,并且具有LAPACK,AFAIK产品线上的线性代数功能。 – Divakar

0

由于您没有提供足够的详细信息供我进行推测,所以我会从表面上看待您关于从矩阵中提取列的瓶颈的陈述,尽管我觉得这有点令人惊讶。

如果你有权访问matlab编译器,我建议你尝试编译你的瓶颈函数。尝试:

help mcc 

从这帮助中你会看到一个典型的用途是:

作出myfun.m一个独立的单独的C可执行文件:

mcc -m myfun 

您也可以尝试写作ac函数来获得你的列并用mex编译: http://www.mathworks.com/help/matlab/ref/mex.html

+0

感谢您的建议。我将我的代码添加到原始帖子中,谢谢。 –

+0

编译自写的循环有时可能会更快,但通常matlab的内置函数无法通过这种方式得到改进。 –

+0

无论您是否可以改进内置功能性能,取决于自行编写的代码,通常可以获得10-100倍的速度提升。原来的问题没有提到GPU;我同意,如果你已经在使用GPU,编译代码可能不是答案。 –