|
本帖最后由 tjchkj 于 2017-12-7 16:04 编辑
看到论坛里几乎是清一色的在linux下使用Gaussian16的交流,使我这个linux门外汉感到居然找不到在windows平台下的任何前人的经验可以借鉴。找遍整个互联网也是没有什么发现,所以不得不潜心自己摸索一下。
先说一下运行环境:
软件:Gaussian 版本: Gaussian 16R A.03 WIN64, VERSION 1.1 单用户版。win10 64位版,win7旗舰版 64位版.
硬件:双路E5-22696v4(44核心)@2.2G ,超微X10DAL-i主板,三星原厂REG ECC 8G*8 总计64G内存。OCZ VECTOR 180 256G固态盘,显卡GTX750-2G,硬盘ST2000NM0033 ES.03 企业级2T。电源900瓦。满载cpu最高温度62度。
在win10下,无论是否打开和关闭超线程,观察Gaussian 各个模块,明显比I5 4440 的机器跑相同任务慢一个量级,因此不是两种cpu主频高低差别问题造成。在win7下也发现类问题。而关闭超线程后,win7下各个模块运行速度完全正常了。因此,可以得到结论就是在windows平台下使用Gaussian16,必须关闭超线程。
下面针对44核心的机器,做一些使用方面的经验,少于44核心的机器,可以类似参考。
一、Link 0中cpu使用的方法
1、老指令%nprocshared,可以用到所有的cpu核心。所以这个机器可以使用到44核心,即%nprocshared=44 可正常用,但这样使用每个cpu核心的使用率不很充分,瞬间cpu总使用率可达99%,但平均总使用率不到50%。测试发现,如果空出几个核心,可以达到计算用时短的效果,我这里是%nprocshared=42最佳。
2、新指令%CPU。该指令可以在任务中选择特定的核心。参数后面跟随用逗号分隔的核心列表例如%CPU=4,5,6,33,43等,或者用核心范围,例如%CPU=3-17 等.
探索发现这里存在bug,就是说%CPU这行核心列表里到最后一位字符,最长字符不能超过57个(win10里不能超过60个),去掉%CPU=这5个字符,在win7中核心列表字符最长是52个。即便你使用核心范围表示也是如此规则。
二、cpu核心限制
1、由于2中所出现的BUG问题,导致目前该版本的核心使用受到制约,采用%CPU指令时,最多核心的上限是21个(win10中是22个),如果你的核心列表里,没有使用到0-9这样单个字符表示的核心,那样能使用的核心只更会少而不会多。因为用范围表示的时候都是转换为列表来进行的。
2、采用多开的方式可以同时运行多个任务。我们知道在win平台下开一个Gaussian窗口只可以跑一个任务,但可以多开窗口实现同时跑多个任务。实验中可以做到1分钟同时运行起32个窗口,每个窗口都是调用BCF文件去运行。每个bcf中可以有上千行任务。这样可以一次投递几万个任务进去。
3、测试表明,Gaussian16 用%CPU=格式指定cpu使用的核心上限是32.不知道是他们用于开发的机器是只有32核心呢,还是在程序中存在BUG,定位核心的时候,采用了MOD函数,把你输入的cpu核心按32整除后得到的余数来定位cpu核心。也就是说,你即便是使用一个核心,这个值大于32就会按整除32后的余数去找核心。这样你多的核心就无法使用了。
三、从cpu负荷率来换个角度看并行效率
我们采用一个测试样本,由于指定核心职能最多用21个,测试了两种方式的cpu使用,完成任务时间比较接近。
以下研究的是多开计算的对比数据:
单开 share = 44 时间是7:46 ;单开 最佳42 核心 用时3分41秒。
四开 share = 11 用时10分10秒。 折算为 单个用时2分32秒,
可见,如果算多任务,宜采用多开。
另外 如果采用指定核心方式,则对于多任务计算的最佳方式就是32开每个指定1核心,折算后单个任务花费的时间是最少的。比较数据就略去不再赘述。如果你一次计算的任务不超过32个,可以适当组合一下,可以采用16开双核心,8开4核心,4开8核心,2开16核心的方式。或者是采用多开不均匀核心,比如三开:两个11核心加一个10核心这样做。四、采用缓存,利用机器的大内存对运算中的临时文件做缓存,我把scratch单独放在磁盘靠近中心的盘符里,用superchche 64位的来做缓存,大大降低磁盘的读写频次。懒写延迟可以任意设置。注意对系统盘不要做懒写。图中可以看到浅蓝色是读缓存命中。
有了大量多开,多窗口友好的界面,加上缓存运用,配合Gaussian View6 直接可视化的工具,在windows下直接运行Gaussian1做计算,就是一件愉快而高效的事情了,相信更多的人会越来越喜欢在windows下做运算了吧?运算的同时,你可以办公,写论文,娱乐休闲,一台机器就解决问题了。鉴于最后那个缓存scratch读写硬盘很多。我后来直接把scratch用RAMdisk 用内存虚拟成一个盘符,这样直接连supercache都不用给它分配内存了。而且是比supercache效率高的没法比。
|
评分 Rate
-
查看全部评分 View all ratings
|