n*******l 发帖数: 2911 | 1 似乎看不到哪个版面更合适,就问问众位经验丰富的牛牛们吧。
现在我在做一个耗时间非常长的计算,用谱方法解微分方程,主要就是
重复的FFT。现在我用Matlab,在我的iMac上算一次要用好几个礼拜。
这要是增加一下规模的话,算一次就是好几个月了,受不了。而且学校
太烂,也没有像样的有足够内存的并行机可用。
据说c++要比Matlab快一点儿,但是我想问的是,按说Matlab的向量运
算和并行处理已经优化得很好了,反正是要调用一些已经优化好了的库函
数,C++真的会比Matlab强一点儿么?强在哪儿呢? |
a**********y 发帖数: 2367 | 2 并行计算?are you sure 你使用了matlab的并行计算吗,这个可不是自动的,是需要
编程解决的,matlab的并行很呆瓜,但对于一些固定的计算也可以将就一下
大型的并行计算fft很成熟了吧,并行效率很高,这个据说是最快的,但是你得会用http://www.fftw.org/ |
l********n 发帖数: 804 | 3 matlab 最新的版本应该fft是自动多核运算的
不知道你说的并行运算是不是这个
matlab慢的是for loop
你做time domain pseudospectral method?
估计也是要用for loop吧
C应该会快至少2-3倍
但是你这个要算几个星期太夸张了
可以考虑加GPU
我试过可以再快7-8倍 |
n*******l 发帖数: 2911 | 4 Matlab的FFT确实是自动并行多核运行,反正我的iMac的四个核是
基本全速运行。
我现在是在一个512x512的网格上用一个semi-implicit scheme
解一个parabolic equation, 时间步长是10^{-6}, 每步要几次FFT,
时间从0到七八十的样子就要算三个礼拜了。这里面用了个while
循环以及几个if判断,也许时间花在了while循环上?
我把网格变成1024x1024时,花费时间基本上是x4,所以时间似乎
是主要花费在FFT上。
我对于这样规模的问题,在四核iMac上到底应该花费多少时间没有什
么概念。已经多年没有进行严肃的计算了。至于GPU计算,受GPU内
存的限制,对于网格的大小限制也比较大。我看到有文章里说6GB内
存的GPU只能处理128x128x128的三维网格,那就是1024x1024的
二维网格呗?我还想尝试一下2048x2048甚至更大点的网格,GPU可
能有困难。
【在 l********n 的大作中提到】 : matlab 最新的版本应该fft是自动多核运算的 : 不知道你说的并行运算是不是这个 : matlab慢的是for loop : 你做time domain pseudospectral method? : 估计也是要用for loop吧 : C应该会快至少2-3倍 : 但是你这个要算几个星期太夸张了 : 可以考虑加GPU : 我试过可以再快7-8倍
|
p*****u 发帖数: 225 | 5 新版本的matlab(好像是2010以后)fft是自动多核的,如果你的瓶颈是fft用C写不会
快多少,可以用profiler看不同函数运行了多长时间和次数。用GPU能块,不过你所有
的东西都要在GPU上实现,不然在GPU内存和系统内存间互相倒数据也会很费时间,特别
是数据很大的时候。
【在 n*******l 的大作中提到】 : 似乎看不到哪个版面更合适,就问问众位经验丰富的牛牛们吧。 : 现在我在做一个耗时间非常长的计算,用谱方法解微分方程,主要就是 : 重复的FFT。现在我用Matlab,在我的iMac上算一次要用好几个礼拜。 : 这要是增加一下规模的话,算一次就是好几个月了,受不了。而且学校 : 太烂,也没有像样的有足够内存的并行机可用。 : 据说c++要比Matlab快一点儿,但是我想问的是,按说Matlab的向量运 : 算和并行处理已经优化得很好了,反正是要调用一些已经优化好了的库函 : 数,C++真的会比Matlab强一点儿么?强在哪儿呢?
|
w*x 发帖数: 518 | 6 瞎说两句……
MATLAB如果用了大量LOOP会很慢,所以可以用C来优化(不一定C++,一般C就够了……
优化瓶颈即可)。
推荐些mex code来把有循环的函数重写一遍:
http://www.mathworks.com/help/matlab/ref/mex.html
当然,也可以用C先compile成dll然后调用。这个方法的好处是同样的C代码可以被别的
除了MATLAB以外的语言使用,比如PYTHON……
最后,推荐用profiling找一下瓶颈。
【在 n*******l 的大作中提到】 : 似乎看不到哪个版面更合适,就问问众位经验丰富的牛牛们吧。 : 现在我在做一个耗时间非常长的计算,用谱方法解微分方程,主要就是 : 重复的FFT。现在我用Matlab,在我的iMac上算一次要用好几个礼拜。 : 这要是增加一下规模的话,算一次就是好几个月了,受不了。而且学校 : 太烂,也没有像样的有足够内存的并行机可用。 : 据说c++要比Matlab快一点儿,但是我想问的是,按说Matlab的向量运 : 算和并行处理已经优化得很好了,反正是要调用一些已经优化好了的库函 : 数,C++真的会比Matlab强一点儿么?强在哪儿呢?
|
n*******l 发帖数: 2911 | 7 很有道理。多谢。
我刚刚用profile看了看,2/3的时间是fft和ifft。估计那些部分是没办法了,看看
其他部分能不能省点儿是点儿。
我的程序总共就一个400来行,一层循环,就是每个时间步长计算若干次FFT 和 IFFT,
让我看看能不能把IFFT省掉。
【在 w*x 的大作中提到】 : 瞎说两句…… : MATLAB如果用了大量LOOP会很慢,所以可以用C来优化(不一定C++,一般C就够了…… : 优化瓶颈即可)。 : 推荐些mex code来把有循环的函数重写一遍: : http://www.mathworks.com/help/matlab/ref/mex.html : 当然,也可以用C先compile成dll然后调用。这个方法的好处是同样的C代码可以被别的 : 除了MATLAB以外的语言使用,比如PYTHON…… : 最后,推荐用profiling找一下瓶颈。
|
T*****u 发帖数: 7103 | 8 matlab提供分析功能,你可以看看时间都花在哪里。 |
w*******U 发帖数: 256 | 9 it could be better to use fortran or c to call fftw. this should be much
faster than matlab. fortran or c generates binary code whereas matlab runs
line by line and is pretty slow for doing loops.
【在 n*******l 的大作中提到】 : 似乎看不到哪个版面更合适,就问问众位经验丰富的牛牛们吧。 : 现在我在做一个耗时间非常长的计算,用谱方法解微分方程,主要就是 : 重复的FFT。现在我用Matlab,在我的iMac上算一次要用好几个礼拜。 : 这要是增加一下规模的话,算一次就是好几个月了,受不了。而且学校 : 太烂,也没有像样的有足够内存的并行机可用。 : 据说c++要比Matlab快一点儿,但是我想问的是,按说Matlab的向量运 : 算和并行处理已经优化得很好了,反正是要调用一些已经优化好了的库函 : 数,C++真的会比Matlab强一点儿么?强在哪儿呢?
|
j***o 发帖数: 5096 | 10 没听说过严肃的计算数学问题用matlab搞的,不就是fft吗,又不是什么特殊的toolbox
,推翻用fortran或者c++重写吧,速度差了三到10倍,而且可以传到cluster上算,学
校里难道没有HPC? |
|
|
n*******l 发帖数: 2911 | 11 其实我本来就是要画几张图,做个小电影什么的来支持我的分析结果的,然后就偷懒用
Matlab。看来还是逃不掉,改天把程序改成c++。
toolbox
【在 j***o 的大作中提到】 : 没听说过严肃的计算数学问题用matlab搞的,不就是fft吗,又不是什么特殊的toolbox : ,推翻用fortran或者c++重写吧,速度差了三到10倍,而且可以传到cluster上算,学 : 校里难道没有HPC?
|
e****m 发帖数: 18 | 12 用Fortran吧,速度和Matlab不是一个级别的,虽然编的过程略痛苦。
Matlab的loop的计算效率简直是让人生不如死。 |
s***e 发帖数: 7166 | 13 这年头随着PC速度提升,已经几乎没人用FORTRAN了吧。
【在 e****m 的大作中提到】 : 用Fortran吧,速度和Matlab不是一个级别的,虽然编的过程略痛苦。 : Matlab的loop的计算效率简直是让人生不如死。
|
w*******U 发帖数: 256 | 14 many people are using fortran. in computational fluid dynamics community,
large-scale numerical computations are done with fortran. in many cases
fortran performs better than c and fortran has more libraries than c because
of history of numerical computation.
【在 s***e 的大作中提到】 : 这年头随着PC速度提升,已经几乎没人用FORTRAN了吧。
|
l**********1 发帖数: 5204 | 15 +1
our recent 5 Ys papers: F is flos and Matlab is leaf ..
3D movie simulation by it and ffmpeg
because
【在 w*******U 的大作中提到】 : many people are using fortran. in computational fluid dynamics community, : large-scale numerical computations are done with fortran. in many cases : fortran performs better than c and fortran has more libraries than c because : of history of numerical computation.
|
l**********1 发帖数: 5204 | 16 Gnuplot?
【在 n*******l 的大作中提到】 : 其实我本来就是要画几张图,做个小电影什么的来支持我的分析结果的,然后就偷懒用 : Matlab。看来还是逃不掉,改天把程序改成c++。 : : toolbox
|
n*******l 发帖数: 2911 | 17 网上有人说Matlab的FFT就是调用的fftw, 我用Profile仔细分析了一下我的
Matlab程序,它的FFT的性能是跟fftw一样的。
对于n=1024, 二维(nxn)的实数数据,12001次FFT 耗时141.538秒。
对于一维FFT,它的运算量是 5N log_2(N). 所以我的程序里的FFFT应该对应
N=2^_20,它的FLOPS是
5 * 2^20 *20*12001/141.538 = 8459 M FLOPS.
同时我的系统对复数进行了12000次IFFT,耗时222.933秒,对应的FLOPS是
5383 M FLOPS。
这基本就是fftw在四核系统里的benchmark值。
这个FFT/IFFT是我的程序的主要部分,耗时占总时间的63%, 所以就算把程
序用C, C++ 或者Fortran重写,也基本没有什么改善了,除非放到更多核的
并行系统上去。要是想要利用GPU,倒腾数据是一个耗时严重的问题,要仔细
考虑一下。
【在 l**********1 的大作中提到】 : +1 : our recent 5 Ys papers: F is flos and Matlab is leaf .. : 3D movie simulation by it and ffmpeg : : because
|
c****u 发帖数: 584 | 18 换个算法。
我解过积分方程,时域的算法是local的,可以用非等分grid. Matlab 1分钟就能算到1
毫秒,精度到皮妙量级。蘋域FFT的算法是global 的,要用等分的grid. 我们用了640
个CPU, 两天才能算出同样结果。而且FFT 对round off errors非常敏感,还要用
infinity precision package 来算。
【在 n*******l 的大作中提到】 : 网上有人说Matlab的FFT就是调用的fftw, 我用Profile仔细分析了一下我的 : Matlab程序,它的FFT的性能是跟fftw一样的。 : 对于n=1024, 二维(nxn)的实数数据,12001次FFT 耗时141.538秒。 : 对于一维FFT,它的运算量是 5N log_2(N). 所以我的程序里的FFFT应该对应 : N=2^_20,它的FLOPS是 : 5 * 2^20 *20*12001/141.538 = 8459 M FLOPS. : 同时我的系统对复数进行了12000次IFFT,耗时222.933秒,对应的FLOPS是 : 5383 M FLOPS。 : 这基本就是fftw在四核系统里的benchmark值。 : 这个FFT/IFFT是我的程序的主要部分,耗时占总时间的63%, 所以就算把程
|
l**********1 发帖数: 5204 | 19 Sre, smartgrid should ask stoppingtime general..
到1
640
【在 c****u 的大作中提到】 : 换个算法。 : 我解过积分方程,时域的算法是local的,可以用非等分grid. Matlab 1分钟就能算到1 : 毫秒,精度到皮妙量级。蘋域FFT的算法是global 的,要用等分的grid. 我们用了640 : 个CPU, 两天才能算出同样结果。而且FFT 对round off errors非常敏感,还要用 : infinity precision package 来算。
|
c*******h 发帖数: 1096 | 20 想要数量级上的速度提升,申请一个computing cluster的帐号是正道
不过fft其实不是特别scabable,因为communication开销太大,
所以你还得找一个网络特别快的cluster
换个数值算法是根本解决方法。。。要么就心安理得不要算那么大的n
【在 n*******l 的大作中提到】 : 网上有人说Matlab的FFT就是调用的fftw, 我用Profile仔细分析了一下我的 : Matlab程序,它的FFT的性能是跟fftw一样的。 : 对于n=1024, 二维(nxn)的实数数据,12001次FFT 耗时141.538秒。 : 对于一维FFT,它的运算量是 5N log_2(N). 所以我的程序里的FFFT应该对应 : N=2^_20,它的FLOPS是 : 5 * 2^20 *20*12001/141.538 = 8459 M FLOPS. : 同时我的系统对复数进行了12000次IFFT,耗时222.933秒,对应的FLOPS是 : 5383 M FLOPS。 : 这基本就是fftw在四核系统里的benchmark值。 : 这个FFT/IFFT是我的程序的主要部分,耗时占总时间的63%, 所以就算把程
|