计算化学公社

标题: 简单对比了一下GPU与CPU的速度 [打印本页]

作者
Author:
sky    时间: 2017-11-17 15:16
标题: 简单对比了一下GPU与CPU的速度
最近刚装了google专门为机器学习开发的python库tensorflow,可以利用GPU来加速计算。简单对比了一下tensorflow,numpy和手写的C++双精度矩阵乘法的速度,结果如下:
电脑配置:
cpu: Xeon E5-2609 v3 @ 1.90GHz
内存:单通道DDR4 16GB 2133MHz
显卡:NVIDIA Quadro K2200(双精度浮点性能大概是0.24TFlops)
----------------------------------------------------------------------------------------
手写单核for循环C++,1000*1000的两个矩阵相乘:146秒
在天河二号上运行:8秒(cpu:E5-2692)
----------------------------------------------------------------------------------------
使用numpy库,10000*10000矩阵:13秒(6核并行)Matlab,10000*10000矩阵:13秒(6核并行)
使用tensorflow库,10000*10000矩阵:0.002秒

----------------------------------------------------------------------------------------
这个结果还是挺吃惊的,numpy底层使用C++编写,使用了BLAS库,即使用C++和BLAS库也快不了多少了,然而比起GPU却依然慢了几个数量级。
CPU发展已经快到头了,反观GPU计算才刚刚开始起步。现在NVIDIA借着机器学习的浪潮在GPU领域不断发力,去年NVIDIA发布的计算卡P100,双精度浮点性能达到了5.3TFlops。

Gaussian, vasp之类的软件也纷纷搞起了GPU计算,虽然效果一般,但这肯定是将来发展的方向了。



作者
Author:
wgbigfatcat    时间: 2017-11-17 17:10
就现在来说,波函数求解需要迭代这个限制了量化类的程序GPU不是太合适。
作者
Author:
万里云    时间: 2017-11-17 21:08
正好最近在学MPI,基于mpi4py写了个手动并行版:

  1. #! /usr/bin/env python

  2. import numpy as np
  3. from mpi4py import MPI

  4. # Initialize MPI environment
  5. comm = MPI.COMM_WORLD
  6. rank = comm.Get_rank()
  7. size = comm.Get_size()

  8. # Generate a random matrix
  9. dim = 1000
  10. if rank == 0:
  11.     mat_a = np.random.random((dim, dim))
  12.     mat_b = np.random.random((dim, dim))
  13. else:
  14.     mat_a = np.empty((dim, dim), dtype='float')
  15.     mat_b = np.empty((dim, dim), dtype='float')
  16. comm.Bcast(mat_a, root=0)
  17. comm.Bcast(mat_b, root=0)

  18. # Distribute jobs among processes
  19. if rank == 0:
  20.    jobs = [[i for i in range(dim) if i % size == k] for k in range(size)]
  21. else:
  22.    jobs = None
  23. jobs = comm.bcast(jobs, root=0)


  24. # Multiply the matrices
  25. mat_work = np.zeros((dim, dim), dtype='float')
  26. rows = jobs[rank]
  27. for i in rows:
  28.     np.matmul(mat_a[i,:], mat_b, out=mat_work[i,:])

  29. # Collect the results
  30. if rank == 0:
  31.     prod = np.zeros((dim, dim), dtype='float')
  32. else:
  33.     prod = None
  34. comm.Reduce(mat_work, prod, root=0)
  35. #if rank == 0:
  36. #    print(mat_a)
  37. #    print(mat_b)
  38. #    print(prod)
复制代码


服务器都排满了任务,放虚拟机里试了一下(i3-4160)。
1000*1000矩阵相乘,用两个进程花两秒多一点,再大的就测不动了。
作者
Author:
niobium    时间: 2017-11-18 05:36
不知道GPU在运算的时候能不能指定运行所用的核心数,如果可以的话,不知道楼主可不可以给个数据,或者测试一下核心数对运行速度的影响。
我用CPU曾经做过测试,9000*9000的矩阵相乘,用12核的时间是比6核的时间要长的。(Fortran,Intel编译器,Intel MKL)
作者
Author:
kyuu    时间: 2017-11-18 14:05
本帖最后由 kyuu 于 2017-11-19 15:53 编辑

我们昨天刚买了252块P100,可是并没有任何卵用
作者
Author:
laoman    时间: 2017-11-18 18:28
kyuu 发表于 2017-11-18 14:05
我们昨天刚买了225块P100,可是并没有卵用

目前的超算资源没有P100,你们组真土豪啊~~
不知道P100要是拿来跑MD(单精度就够),速度上会不会比1080类的家用卡快。。。
作者
Author:
kyuu    时间: 2017-11-19 07:17
本帖最后由 kyuu 于 2017-11-19 07:28 编辑
laoman 发表于 2017-11-18 18:28
目前的超算资源没有P100,你们组真土豪啊~~
不知道P100要是拿来跑MD(单精度就够),速度上会不会比1080 ...


PERFORMANCE SPECIFICATION FOR NVIDIA TESLA P100 ACCELERATORS

P100 for PCIe-Based
Servers
P100 for NVLink-Optimized Servers
Double-Precision Performance
4.7 TeraFLOPS
5.3 TeraFLOPS
Single-Precision Performance
9.3 TeraFLOPS
10.6 TeraFLOPS
Half-Precision Performance
18.7 TeraFLOPS
21.2 TeraFLOPS
NVIDIA NVLink™ Interconnect Bandwidth
-
160 GB/s
PCIe x16 Interconnect Bandwidth
32 GB/s
32 GB/s
CoWoS HBM2 Stacked Memory Capacity
16 GB or 12 GB
16 GB
CoWoS HBM2 Stacked Memory Bandwidth
732 GB/s or 549 GB/s
732 GB/s
Enhanced Programmability with Page Migration Engine
ECC Protection for Reliability
Server-Optimized for Data Center Deployment

单卡单精度与1080Ti持平 但单机上不大可能会做速力

作者
Author:
laoman    时间: 2017-11-19 20:14
kyuu 发表于 2017-11-19 07:17
PERFORMANCE SPECIFICATION FOR NVIDIA TESLA P100 ACCELERATORS

单卡单精度与1080Ti持平 但单机上 ...

谢谢大神的资料,看来配个1080ti的工作站来跑MD还是挺值得的~
作者
Author:
sky    时间: 2017-11-19 21:08
niobium 发表于 2017-11-18 05:36
不知道GPU在运算的时候能不能指定运行所用的核心数,如果可以的话,不知道楼主可不可以给个数据,或者测试 ...

我刚开始用,能否指定核心数不清楚。
同核心数比较完全没有意义,肯定是CPU快。GPU之所以快就是因为核心数远多于CPU.
至于12核比6核时间长可能是因为矩阵太小的关系,这个现在我在用vasp计算的时候也见过。矩阵太小而核数太多的话,分配任务会占用过多时间,而真正用来计算的时间很少,导致总耗时增加。
作者
Author:
sky    时间: 2017-11-19 21:09
kyuu 发表于 2017-11-18 14:05
我们昨天刚买了252块P100,可是并没有任何卵用

现在的量化程序对GPU支持都一般吧,相对好一点的可能也就是vasp了
作者
Author:
sky    时间: 2017-11-19 21:15
wgbigfatcat 发表于 2017-11-17 17:10
就现在来说,波函数求解需要迭代这个限制了量化类的程序GPU不是太合适。

迭代每一步照样也得求矩阵,没什么不合适的。vasp用GPU之后提速明显。
作者
Author:
sky    时间: 2017-11-19 21:18
万里云 发表于 2017-11-17 21:08
正好最近在学MPI,基于mpi4py写了个手动并行版:

numpy或者tensorflow一行代码就搞定了。
我没写过计算类程序,不知道自己写的计算小程序是否可能被numpy替代?
作者
Author:
sky    时间: 2017-11-19 21:20
kyuu 发表于 2017-11-19 07:17
PERFORMANCE SPECIFICATION FOR NVIDIA TESLA P100 ACCELERATORS

单卡单精度与1080Ti持平 但单机上 ...

你这张图我才注意到P100单精度就比1080好一点,看样子钱都用来堆双精度了
作者
Author:
kyuu    时间: 2017-11-20 00:59
sky 发表于 2017-11-19 21:20
你这张图我才注意到P100单精度就比1080好一点,看样子钱都用来堆双精度了

单精度帕斯卡,双精度特斯拉
作者
Author:
bluewhale    时间: 2017-11-26 22:36
kyuu 发表于 2017-11-18 14:05
我们昨天刚买了252块P100,可是并没有任何卵用

这种卡多少米?
作者
Author:
kyuu    时间: 2017-11-28 12:24
bluewhale 发表于 2017-11-26 22:36
这种卡多少米?

15000$ per each
作者
Author:
psfan    时间: 2018-1-21 13:29
sky 发表于 2017-11-19 21:15
迭代每一步照样也得求矩阵,没什么不合适的。vasp用GPU之后提速明显。

vasp启用gpu加速是不是要求lreal=true啊?




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3