R compiled with Intel C Compiler
前几天安装了Intel C Compiler, 据说在基于Intel处理器的数值计算方面性能普遍优于GNU C compiler, 今天以R为例做了一个测试.(实际上只做了一半)
测试环境:
Intel Pentium Dual Core T2390 1.86G
icc (ICC) 12.0.3 20110309
1. 原来的R: ubuntu的APT
R version 2.13.0 (2011-04-13)
Platform: i486-pc-linux-gnu (32-bit)
2. 新的R: ICC编译
R version 2.13.0 (2011-04-13)
Platform: i686-pc-linux-gnu (32-bit)
3. 未做的测试: GCC编译
R version 2.13.0 (2011-04-13)
Platform: i686-pc-linux-gnu (32-bit)
内容:
1.
$ sudo apt-get install R
$ R
2.
$ wget http://ftp.ctex.org/mirrors/CRAN/src/base/R-2/R-2.13.0.tar.gz
$ tar -xvzpf ./R-2.13.0.tar.gz
$ cd ./R-2.13.0
$ CC="icc" CXX="icpc" LD="xild" AR="xiar" CFLAGS="-fast" CXXFLAGS="${CFLAGS}" ./configure --with-x=no
$ make
$ ./bin/R
由于没有安装X的编译包(应该是类似X-devel之类的东西吧?), 所以disable了X支持, 画不了图.
3.
(以下为假想, 未做测试)
接 2.
$ make clean
$ ./configure --with-x=no
$ make
$ ./bin/R
测试:
不知道有什么合适的测试, 用了C6H5NO2的R中快速计算欧式距离中那个笨重的方法作为测试. 哪位同学有好的测试内容请告诉我 : )
________________________________________________
测试1: 计算欧式距离
code:
> mat = matrix(runif(200*100),nrow=200)
> system.time( mat7 <- as.matrix(dist(mat)) )
result:
环境1.
user system elapsed
0.056 0.004 0.062
0.060 0.000 0.059
0.060 0.000 0.058
0.056 0.000 0.059
0.056 0.000 0.058
0.060 0.000 0.058
环境2.
user system elapsed
0.02 0.00 0.02
0.016 0.000 0.017
0.016 0.000 0.018
0.016 0.000 0.018
0.020 0.000 0.017
0.016 0.000 0.017
code:
> mat = matrix(runif(2000*1000),nrow=2000)
> system.time( mat7 <- as.matrix(dist(mat)) )
result:
环境1:
user system elapsed
92.101 0.356 93.327
环境2:
user system elapsed
30.069 0.332 30.687
结论:
时间消耗大概是3:1的比例, ICC 远胜通用的二进制包.
_____________________________________________
测试2: Terry提议的矩阵求逆
code: (不知道有没有问题, 再检查一下吧)
> t = seq(0,0,length=101)
> t[1] = 1
> I = matrix(t,nrow=100,ncol=100)
Warning message:
In matrix(t, nrow = 100, ncol = 100) :
data length [101] is not a sub-multiple or multiple of the number of rows [100]
> system.time( {for(i in 1:1000){ mat <- matrix(0.2*runif(100*100)-0.1,nrow=100)
+ mat = mat+I
+ imat <- solve(mat)}})
result:
环境1.
user system elapsed
4.664 0.012 4.684 (it's weird, 这次时间显著的短. 重复了1000次有这么大的误差, 是小概率事件吧?)
4.816 0.000 4.822 (也很短)
4.929 0.000 4.934
4.892 0.008 4.910
4.924 0.000 4.932
环境2.
user system elapsed
4.821 0.024 4.851
4.784 0.028 4.820
4.772 0.056 4.836
4.769 0.028 4.809
code:
> system.time(result <- solve(matrix(runif(1500*1500),nrow=1500)))
result:
环境1.
user system elapsed
8.905 0.136 9.049
8.793 0.140 8.940
8.692 0.168 8.868
8.737 0.172 8.910
环境2.
user system elapsed
9.760 0.136 9.903
9.425 0.168 9.598
9.548 0.156 9.714
9.517 0.180 9.705
结论: 差异不大.(1似乎更快?) 是不是求逆的过程是写在R的代码里的, 与编译器环境的数值计算速度无关?
________________________________________________
未来可能的工作:
1. 补完GCC的测试.
2. 添加X窗口支持, 即画图支持.
3. Intel 的 Math Kernel Library支持矩阵运算的C接口, 可能的话, 也许R 的Matrix包用这些Intel的库效率会更高. 不过这可能需要直接修改R 的源码了.
测试环境:
Intel Pentium Dual Core T2390 1.86G
icc (ICC) 12.0.3 20110309
1. 原来的R: ubuntu的APT
R version 2.13.0 (2011-04-13)
Platform: i486-pc-linux-gnu (32-bit)
2. 新的R: ICC编译
R version 2.13.0 (2011-04-13)
Platform: i686-pc-linux-gnu (32-bit)
3. 未做的测试: GCC编译
R version 2.13.0 (2011-04-13)
Platform: i686-pc-linux-gnu (32-bit)
内容:
1.
$ sudo apt-get install R
$ R
2.
$ wget http://ftp.ctex.org/mirrors/CRAN/src/base/R-2/R-2.13.0.tar.gz
$ tar -xvzpf ./R-2.13.0.tar.gz
$ cd ./R-2.13.0
$ CC="icc" CXX="icpc" LD="xild" AR="xiar" CFLAGS="-fast" CXXFLAGS="${CFLAGS}" ./configure --with-x=no
$ make
$ ./bin/R
由于没有安装X的编译包(应该是类似X-devel之类的东西吧?), 所以disable了X支持, 画不了图.
3.
(以下为假想, 未做测试)
接 2.
$ make clean
$ ./configure --with-x=no
$ make
$ ./bin/R
测试:
不知道有什么合适的测试, 用了C6H5NO2的R中快速计算欧式距离中那个笨重的方法作为测试. 哪位同学有好的测试内容请告诉我 : )
________________________________________________
测试1: 计算欧式距离
code:
> mat = matrix(runif(200*100),nrow=200)
> system.time( mat7 <- as.matrix(dist(mat)) )
result:
环境1.
user system elapsed
0.056 0.004 0.062
0.060 0.000 0.059
0.060 0.000 0.058
0.056 0.000 0.059
0.056 0.000 0.058
0.060 0.000 0.058
环境2.
user system elapsed
0.02 0.00 0.02
0.016 0.000 0.017
0.016 0.000 0.018
0.016 0.000 0.018
0.020 0.000 0.017
0.016 0.000 0.017
code:
> mat = matrix(runif(2000*1000),nrow=2000)
> system.time( mat7 <- as.matrix(dist(mat)) )
result:
环境1:
user system elapsed
92.101 0.356 93.327
环境2:
user system elapsed
30.069 0.332 30.687
结论:
时间消耗大概是3:1的比例, ICC 远胜通用的二进制包.
_____________________________________________
测试2: Terry提议的矩阵求逆
code: (不知道有没有问题, 再检查一下吧)
> t = seq(0,0,length=101)
> t[1] = 1
> I = matrix(t,nrow=100,ncol=100)
Warning message:
In matrix(t, nrow = 100, ncol = 100) :
data length [101] is not a sub-multiple or multiple of the number of rows [100]
> system.time( {for(i in 1:1000){ mat <- matrix(0.2*runif(100*100)-0.1,nrow=100)
+ mat = mat+I
+ imat <- solve(mat)}})
result:
环境1.
user system elapsed
4.664 0.012 4.684 (it's weird, 这次时间显著的短. 重复了1000次有这么大的误差, 是小概率事件吧?)
4.816 0.000 4.822 (也很短)
4.929 0.000 4.934
4.892 0.008 4.910
4.924 0.000 4.932
环境2.
user system elapsed
4.821 0.024 4.851
4.784 0.028 4.820
4.772 0.056 4.836
4.769 0.028 4.809
code:
> system.time(result <- solve(matrix(runif(1500*1500),nrow=1500)))
result:
环境1.
user system elapsed
8.905 0.136 9.049
8.793 0.140 8.940
8.692 0.168 8.868
8.737 0.172 8.910
环境2.
user system elapsed
9.760 0.136 9.903
9.425 0.168 9.598
9.548 0.156 9.714
9.517 0.180 9.705
结论: 差异不大.(1似乎更快?) 是不是求逆的过程是写在R的代码里的, 与编译器环境的数值计算速度无关?
________________________________________________
未来可能的工作:
1. 补完GCC的测试.
2. 添加X窗口支持, 即画图支持.
3. Intel 的 Math Kernel Library支持矩阵运算的C接口, 可能的话, 也许R 的Matrix包用这些Intel的库效率会更高. 不过这可能需要直接修改R 的源码了.