CN103207786B - 渐进式智能回溯向量化代码调优方法 - Google Patents

渐进式智能回溯向量化代码调优方法 Download PDF

Info

Publication number
CN103207786B
CN103207786B CN201310154727.0A CN201310154727A CN103207786B CN 103207786 B CN103207786 B CN 103207786B CN 201310154727 A CN201310154727 A CN 201310154727A CN 103207786 B CN103207786 B CN 103207786B
Authority
CN
China
Prior art keywords
tuning
vectorization
information
vectorizer
compiler
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN201310154727.0A
Other languages
English (en)
Other versions
CN103207786A (zh
Inventor
韩林
赵荣彩
姚远
赵博
高伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
PLA Information Engineering University
Original Assignee
PLA Information Engineering University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by PLA Information Engineering University filed Critical PLA Information Engineering University
Priority to CN201310154727.0A priority Critical patent/CN103207786B/zh
Publication of CN103207786A publication Critical patent/CN103207786A/zh
Application granted granted Critical
Publication of CN103207786B publication Critical patent/CN103207786B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明涉及一种渐进式智能回溯向量化代码调优方法,主要包括以下步骤:(1)静态调优:在源程序中添加编译指示语句,生成向量化程序;(2)动态调优:进行动态插桩,获取程序剖面信息和动态插桩信息,根据反馈信息文件生成优化后的向量化程序;(3)配置向量化基础选项和优化选项,在向量化过程中逐一添加优化选项,并将调优结果与添加前的调优结果相比较,如当前调优结果优于上一次,则保留,否则回溯。通过采用上述步骤,能够优化生成代码中的向量化语句,提高生成代码的执行效率,从而缓解程序员设计和编写并行程序的压力,并充分发挥当前高性能巨型计算机系统的计算能力。

Description

渐进式智能回溯向量化代码调优方法
技术领域
本发明涉及一种渐进式智能回溯向量化代码调优方法。
背景技术
在当前高性能计算机的构建中,采用的CPU芯片中所集成的SIMD(SingleInstructionMultipleData,单指令多数据流)短向量功能部件能够有效提升计算机系统的整体计算能力,其对于通过适度扩展指令系统以显著提高数据执行宽度、改善多媒体处理性能具有重大的意义。
但与之相应地,在实践过程中,手工编写或者改写高质量的向量化代码对程序员是一种极大的挑战。一方面,由于SIMD并行性的发掘往往需要进行一系列的代码变换与优化,手工向量识别过程对程序员具有较高的要求,对于各种程序变换和优化措施的实施,需要程序员对编译技术有深入的理解;另一方面,半个多世纪以来,计算机技术的飞速发展为研发人员积累了大量的宝贵经验和财富,现有的标量计算机应用过程中,大量发挥过重要作用的优秀软件急需有效地转移到高性能计算机系统上运行,此时为了充分利用给定的CPU中提供的SIMD短向量功能部件,就需要程序员进行大量的手工变换或者重新编写并行程序的工作,这是一项既费时又费力的事情,从而给程序员造成了极大的工作压力,同时也不利于充分发挥高性能计算机的计算能力。
发明内容
为克服以上现有技术的不足,本发明要解决的技术问题是提供一种渐进式智能回溯向量化代码调优方法,能够扩充可用软件集合,深入挖掘程序中的可向量化语句,优化生成代码中的向量化语句,提高生成代码的执行效率,从而缓解程序员设计和编写并行程序的压力,并充分发挥当前高性能巨型计算机系统的计算能力。
本发明的技术方案是:
一种渐进式智能回溯向量化代码调优方法,包括以下步骤:
(1)对源代码进行静态编译,根据编译器的静态编译信息,在源程序中添加编译指示语句,由自动向量化工具生成向量化程序;
(2)对生成的向量化程序进行动态调优,具体步骤为:
(2.1)在向量化程序中进行动态插桩,编译向量化程序;
(2.2)试运行程序,获取程序剖面信息和动态插桩信息,生成反馈信息文件;
(2.3)编译器读取反馈信息文件,根据反馈信息文件的信息再次编译源程序,自动生成优化后的向量化程序;
(3)配置向量化基础选项和优化选项,在向量化过程中逐一添加优化选项,试运行程序得到调优结果,并与添加前的调优结果相比较,如当前调优结果优于上一次调优结果,则将该优化选项添加到基础选项中,否则回溯到上一次调优选项;反复进行该步骤,直至达到预期调优效果或者运行次数达到阈值而停止调优。
上述渐进式智能回溯向量化代码调优方法,其中基于步骤(1)中的编译指示语句生成向量化程序的具体步骤为:
(1.1)前端指示语句的识别:基于Open64的编译前端,加入对编译指示语句的识别和分析,确定编译指示语句作用域内的语句序列,将源程序转换成相应的中间表示;
(1.2)指示语句的分析和预处理:根据编译指示语句,跳过相关的约束条件,强制执行向量化变换过程,或者跳过相关的分析过程不进行向量化变换与优化;
(1.3)向量化程序的生成:根据分析和预处理阶段所获得的信息,调用向量化程序生成功能,将中间程序转换成为向量化程序。
上述渐进式智能回溯向量化代码调优方法,其中步骤(2.2)中的程序剖面信息为通过底层运行时系统提供的程序运行信息,提示未向量化循环的实际执行时间、执行次数、迭代总次数、单次执行时间、循环嵌套等辅助确定热点循环的信息;动态插桩信息为通过插桩所收集的循环中的访存地址信息,以及通过访存地址的分析所获取的对齐信息和连续性访问信息和依赖关系信息。
上述渐进式智能回溯向量化代码调优方法,其中步骤(3)中的基础选项包括自动向量化和源源翻译,优化选项包括循环展开,限制常数传播,过程间分析和外层循环向量化。
上述渐进式智能回溯向量化代码调优方法,其中步骤(1)中的编译指示语句包括强制性编译指示,强制性编译指示包括强制向量化编译指示和强制不向量化编译指示,当执行强制向量化编译指示时,不进行对齐分析、连续性分析和依赖关系分析,直接进入向量化程序的变换生成,当执行强制不向量化编译指示时,不进行任何变换,直接按照源程序形式输出。
上述渐进式智能回溯向量化代码调优方法,其中的编译指示语句还包括数据访问的对齐性编译指示,对齐性编译指示包括不对齐编译指示和对齐编译指示。
上述渐进式智能回溯向量化代码调优方法,其中的编译指示语句还包括优化编译指示,优化编译指示包括函数内联,设定循环展开因子和循环不变量外提。
上述渐进式智能回溯向量化代码调优方法,其中步骤(2.2)中的反馈信息文件的信息还通过函数接口反馈至用户交互调优界面。
本发明的有益效果是:
1、本发明通过采用渐进式智能回溯向量化代码调优方法,能够深入挖掘程序中的可向量化语句,产生优化、高效、易于阅读的向量化代码,从而极大地减轻了程序员编写向量化代码的压力,并同时能够提高生成代码的执行效率,充分发挥了当前高性能巨型计算机系统的计算能力;
2、本发明通过采用静态调优与动态调优相结合的方法,使得用户能够积极参与程序的并行性发掘,获得性能更优的并行程序,并且该发明提供的交互调优方式可以便捷、直观地进行代码级的调优工作,而且用户交互调优界面中的向量化报告和阻碍向量化原因报告均对程序员的代码调试工作提供了极大的帮助。
附图说明
下面结合附图对本发明的具体实施方式作进一步详细的说明。
图1是渐进式智能回溯向量化代码调优方法的流程示意图。
具体实施方式
参照图1,渐进式智能回溯向量化代码调优方法具体包括三个步骤:静态调优,动态调优和智能渐进回溯。详细描述如下。
(1)静态调优:对源代码进行静态编译,根据编译器的静态编译信息,在源程序中添加编译指示语句,由自动向量化工具生成向量化程序。这样,把向量化过程中的诊断信息进行反馈,据此在源代码中直接添加向量化编译指示语句,将应用程序特点信息以直观的方式传递给自动向量化工具,从而进一步提高自动向量化的识别率。
在上述步骤(1)中,基于编译指示语句生成向量化程序的具体步骤又可为:
(1.1)前端指示语句的识别:基于Open64的编译前端,加入对编译指示语句的识别和分析,确定编译指示语句作用域内的语句序列,将源程序转换成相应的中间表示;
(1.2)指示语句的分析和预处理:根据编译指示语句,跳过相关的约束条件,强制执行向量化变换过程,或者跳过相关的分析过程不进行向量化变换与优化;
(1.3)向量化程序的生成:根据分析和预处理阶段所获得的信息,调用向量化程序生成功能,将中间程序转换成为向量化程序。
(2)动态调优:对生成的向量化程序进行动态调优,具体步骤为:
(2.1)在向量化程序中进行动态插桩,编译向量化程序,其中动态插桩是指在向量化程序中插入动态采样的信息语句,利用插桩后的目标代码收集程序运行时的有关信息,然后利用这些信息重新编译,生成性能更高的目标代码。在应用过程中,根据所要收集的信息不同,选择适当的插桩位置插入收集信息的代码,并生成带有插桩函数的代码文件,此时用户可以自行选择所需要的编译器编译程序生成可执行文件。
(2.2)试运行程序,获取程序剖面信息和动态插桩信息,生成反馈信息文件。
步骤(2.2)中的程序剖面信息可为通过底层运行时系统提供的程序运行信息,提示未向量化循环的实际执行时间、执行次数、迭代总次数、单次执行时间、循环嵌套等辅助确定热点循环的信息,而动态插桩信息可为通过插桩所收集的循环中的访存地址信息,以及通过访存地址的分析所获取的对齐信息和连续性访问信息和依赖关系信息。通过获取循环运行时的热点信息和运行时循环内地址动态采样信息,便可精确分析循环内的依赖关系等制约向量化的关键因素,从而进一步提高向量化过程的识别率和程序效率。通过程序试运行过程,在此试运行经插桩且编译生成的可执行文件。并实现了通过插桩代码收集并分析程序运行时的信息,并在程序结束时将动态采样信息存至反馈信息文件。
(2.3)编译器读取反馈信息文件,根据反馈信息文件的信息再次编译源程序,自动生成优化后的向量化程序。
作为一种优选,为了能够更好的实现编译器与用户的交互,弥补编译器自动向量化方面的不足,反馈信息文件的信息还通过函数接口反馈至用户交互调优界面。这样动态采样信息一方面以某种形式提供给编译器进行向量代码的自动生成,另一方面通过函数接口在用户交互调优界面中提供给用户,由用户通过编译指示等方式对代码进行一些较高层次的修改,如算法级的修改,从而更利于编译器的向量识别和优化。
(3)智能渐进回溯:配置向量化基础选项和优化选项,在向量化过程中逐一添加优化选项,试运行程序得到调优结果,并与添加前的调优结果相比较,如当前调优结果优于上一次调优结果,则将该相应的优化选项添加到基础选项中,否则回溯到上一次调优选项;反复进行该步骤,直至达到预期调优效果或者运行次数达到阈值而停止调优。
图1中所示的用户交互调优界面主要分为四个部分显示:(1)程序列表的显示,在应用过程中,程序员可以选择某个程序进行必要的变换;(2)程序源码的显示,程序员可以对程序源码做适当的变换,此部分可读可写;(3)向量化后的代码显示,此部分只显示向量化结果,向量化后的代码对程序的改动较大,并不主张程序员去修改;(4)从向量化工具中得到的程序信息,这些信息主要包括循环是否向量化成功以及未向量化成功的原因,通过这些信息可以更好的帮助程序员进行向量化工作。
作为一种优选,在实际应用过程中,自动并行化工具用来收集静态调优和动态调优过程中的编译信息并反馈给用户,用户在进行向量化变换时,可根据反馈的编译信息在用户调优界面下操作,进行编译指示语句和优化选项的添加,生成向量化代码后经本机编译器编译后进行程序的试运行,并将试运行的结果反馈给用户。如果调优结果达到预期效果,则可终止调优,记录下最后调优所用的优化选项和编译指示。如果调优结果达不到预期效果,则继续持续进行静态调优和动态调优相结合的向量化调优过程,直至当试运行次数达到阈值时停止调优,并记录下所有调试过程中最优的优化选项组合。并且,在每次修改优化选项、然后进行向量化、基础编译和试运行的过程中,如果当前调优结果优于上一次调优结果,则把当前调优结果覆盖上一次调优结果,从而渐进式地达到最优的向量化选项组合。
上述渐进式智能回溯向量化代码调优方法,其中步骤(3)中的基础选项包括自动向量化和源源翻译,优化选项包括循环展开,限制常数传播,过程间分析和外层循环向量化。
上述渐进式智能回溯向量化代码调优方法,其中步骤(1)中的编译指示语句包括强制性编译指示,强制性编译指示包括强制向量化编译指示和强制不向量化编译指示,当执行强制向量化编译指示时,不进行对齐分析、连续性分析和依赖关系分析,直接进入向量化程序的变换生成,当执行强制不向量化编译指示时,不进行任何变换,直接按照源程序形式输出。
上述渐进式智能回溯向量化代码调优方法,其中的编译指示语句还包括数据访问的对齐性编译指示,对齐性编译指示包括不对齐编译指示和对齐编译指示。在含有指针、结构体的情况下,根据动态调优可以分析出数据访问的对齐信息,这时可通过数据访问的对齐性编译指示直接说明数据访存是否对齐,使得自动向量化直接跳过对齐分析步骤,进行后续的处理。在加入数据访存对齐编译指示后,如果循环不满足可向量化候选循环或者存在阻碍向量化的依赖等情况,则循环仍然不能向量化。当数据访存不对齐时,可根据给出的对齐偏移量直接进入如数组填充等相关的对齐优化阶段,对非对齐访问进行向量化代码生成。
上述渐进式智能回溯向量化代码调优方法,其中的编译指示语句还包括优化编译指示,优化编译指示包括函数内联、设定循环展开因子和循环不变量外提。在自动向量化过程中,有很多因素都影响对程序的分析,如指针的对齐性和连续性分析,如果函数调用的参数为指针,则随着指针参数的不同,其传递进入被调过程的对齐信息不一定相同,在这种情况下,若采用专门的过程间分析来优化指针的对齐偏移量将非常复杂,实际性能也往往不好,而如果在过程调用前加入函数内联编译指示,将每次调用都内联编译,则大大简化了分析过程,可以在主函数中对不同的调用过程进行向量化变换和优化。
通过采用渐进式智能回溯向量化代码调优方法,本发明能够深入挖掘程序中的可向量化语句,产生优化、高效、易于阅读的向量化代码,从而极大地减轻了程序员编写向量化代码的压力,并同时能够提高生成代码的执行效率,充分发挥了当前高性能巨型计算机系统的计算能力。此外,本发明通过采用静态调优与动态调优相结合的方法,使得用户能够积极参与程序的并行性发掘,通过该发明提供的交互调优方式可以便捷、直观地进行代码级的调优工作,而且用户交互调优界面中的向量化报告和阻碍向量化原因报告均对程序员的代码调试工作提供了极大的帮助,从而更有效地保证了获得性能更优的并行程序。
上面结合附图对本发明优选的具体实施方式和实施例作了详细说明,但是本发明并不限于上述实施方式和实施例,在本领域技术人员所具备的知识范围内,还可以在不脱离本发明构思的前提下作出各种变化。

Claims (8)

1.一种渐进式智能回溯向量化代码调优方法,包括以下步骤:
(1)对源代码进行静态编译,根据编译器的静态编译信息,在源程序中添加编译指示语句,由自动向量化工具生成向量化程序;
(2)对生成的向量化程序进行动态调优,具体步骤为:
(2.1)在向量化程序中进行动态插桩,编译向量化程序;
(2.2)试运行程序,获取程序剖面信息和动态插桩信息,生成反馈信息文件;
(2.3)编译器读取反馈信息文件,根据反馈信息文件的信息再次编译源程序,自动生成优化后的向量化程序;
(3)配置向量化基础选项和优化选项,在向量化过程中逐一添加优化选项,试运行程序得到调优结果,并与添加前的调优结果相比较,如当前调优结果优于上一次调优结果,则将该优化选项添加到基础选项中,否则回溯到上一次调优选项;反复进行该步骤,直至达到预期调优效果或者运行次数达到阈值而停止调优。
2.如权利要求1所述的渐进式智能回溯向量化代码调优方法,其特征在于:基于步骤(1)中所述编译指示语句生成向量化程序的具体步骤为:
(1.1)前端指示语句的识别:基于Open64的编译前端,加入对编译指示语句的识别和分析,确定编译指示语句作用域内的语句序列,将源程序转换成相应的中间表示;
(1.2)指示语句的分析和预处理:根据编译指示语句,跳过相关的约束条件,强制执行向量化变换过程,或者跳过相关的分析过程不进行向量化变换与优化;
(1.3)向量化程序的生成:根据分析和预处理阶段所获得的信息,调用向量化程序生成功能,将中间程序转换成为向量化程序。
3.如权利要求1或2所述的渐进式智能回溯向量化代码调优方法,其特征在于:步骤(2.2)中所述程序剖面信息为通过底层运行时系统提供的程序运行信息,提示未向量化循环的实际执行时间、执行次数、迭代总次数、单次执行时间、循环嵌套等辅助确定热点循环的信息;所述动态插桩信息为通过插桩所收集的循环中的访存地址信息,以及通过访存地址的分析所获取的对齐信息和连续性访问信息和依赖关系信息。
4.如权利要求3所述的渐进式智能回溯向量化代码调优方法,其特征在于:步骤(3)中所述基础选项包括自动向量化和源源翻译,所述优化选项包括循环展开,限制常数传播,过程间分析和外层循环向量化。
5.如权利要求3所述的渐进式智能回溯向量化代码调优方法,其特征在于:步骤(1)中所述编译指示语句包括强制性编译指示,所述强制性编译指示包括强制向量化编译指示和强制不向量化编译指示,当执行强制向量化编译指示时,不进行对齐分析、连续性分析和依赖关系分析,直接进入向量化程序的变换生成,当执行强制不向量化编译指示时,不进行任何变换,直接按照源程序形式输出。
6.如权利要求5所述的渐进式智能回溯向量化代码调优方法,其特征在于:所述编译指示语句还包括数据访问的对齐性编译指示,所述对齐性编译指示包括不对齐编译指示和对齐编译指示。
7.如权利要求5或6所述的渐进式智能回溯向量化代码调优方法,其特征在于:所述编译指示语句还包括优化编译指示,所述优化编译指示包括函数内联,设定循环展开因子和循环不变量外提。
8.如权利要求1或2所述的渐进式智能回溯向量化代码调优方法,其特征在于:步骤(2.2)中所述反馈信息文件的信息还通过函数接口反馈至用户交互调优界面。
CN201310154727.0A 2013-04-28 2013-04-28 渐进式智能回溯向量化代码调优方法 Expired - Fee Related CN103207786B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310154727.0A CN103207786B (zh) 2013-04-28 2013-04-28 渐进式智能回溯向量化代码调优方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310154727.0A CN103207786B (zh) 2013-04-28 2013-04-28 渐进式智能回溯向量化代码调优方法

Publications (2)

Publication Number Publication Date
CN103207786A CN103207786A (zh) 2013-07-17
CN103207786B true CN103207786B (zh) 2016-03-23

Family

ID=48755018

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310154727.0A Expired - Fee Related CN103207786B (zh) 2013-04-28 2013-04-28 渐进式智能回溯向量化代码调优方法

Country Status (1)

Country Link
CN (1) CN103207786B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103838571B (zh) * 2013-12-03 2017-04-19 华为技术有限公司 一种信息处理方法及装置
CN104965687B (zh) * 2015-06-04 2017-12-08 北京东方国信科技股份有限公司 基于指令集生成的大数据处理方法及装置
US10996989B2 (en) * 2016-06-13 2021-05-04 International Business Machines Corporation Flexible optimized data handling in systems with multiple memories
CN108614700B (zh) * 2016-12-23 2021-08-20 北京三快在线科技有限公司 一种业务迭代的方法及装置
CN108255721A (zh) * 2018-01-12 2018-07-06 深圳市海派通讯科技有限公司 智能终端编译脚本预插值结果分析的方法、系统及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1894674A (zh) * 2003-11-19 2007-01-10 英特尔公司 存储器访问指令向量化
CN102473104A (zh) * 2009-08-19 2012-05-23 国际商业机器公司 插入用于优化的simd代码的操作-和-指示指令
CN102782644A (zh) * 2010-03-01 2012-11-14 国际商业机器公司 执行具有回滚由积极优化导致的变化的能力的积极代码优化

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060156284A1 (en) * 2002-10-07 2006-07-13 Edss., Inc. Architecture of Ticc-Ppde, a new paradigm for parallel programming

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1894674A (zh) * 2003-11-19 2007-01-10 英特尔公司 存储器访问指令向量化
CN102473104A (zh) * 2009-08-19 2012-05-23 国际商业机器公司 插入用于优化的simd代码的操作-和-指示指令
CN102782644A (zh) * 2010-03-01 2012-11-14 国际商业机器公司 执行具有回滚由积极优化导致的变化的能力的积极代码优化

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
反馈指导的SIMD向量识别及优化技术研究;郝云龙;《中国优秀硕士学位论文全文数据库信息科技辑》;20120715;I138-1290 *

Also Published As

Publication number Publication date
CN103207786A (zh) 2013-07-17

Similar Documents

Publication Publication Date Title
Dave et al. Cetus: A source-to-source compiler infrastructure for multicores
Strout et al. The sparse polyhedral framework: Composing compiler-generated inspector-executor code
CN103207786B (zh) 渐进式智能回溯向量化代码调优方法
Fauzia et al. Characterizing and enhancing global memory data coalescing on GPUs
US20170344349A1 (en) Sample driven profile guided optimization with precise correlation
CN104536898A (zh) C程序并行区域的检测方法
Huda et al. Using template matching to infer parallel design patterns
Ismail et al. Quantitative overhead analysis for python
Blickstein et al. The GEM optimizing compiler system
Huda et al. Automatic parallel pattern detection in the algorithm structure design space
Shirako et al. Optimized two-level parallelization for gpu accelerators using the polyhedral model
CN113553057B (zh) 一种针对不同架构的gpu进行并行计算的优化系统
CN101944040A (zh) 一种基于谓词的自动并行优化方法
Benoit et al. Kimble: a hierarchical intermediate representation for multi-grain parallelism
Hayashi et al. Performance evaluation of OpenMP's target construct on GPUs-exploring compiler optimisations
CN112558977B (zh) 面向异构众核后端基于代价模型的多面体优化方法
Calvert Parallelisation of java for graphics processors
Ferrer et al. Mercurium: Design decisions for a s2s compiler
Zheng et al. Designing the agassiz compiler for concurrent multithreaded architectures
Bosilca et al. From serial loops to parallel execution on distributed systems
Fumero et al. accull: An user-directed approach to heterogeneous programming
Aguilar et al. Parallelism extraction in embedded software for Android devices
El-Shobaky et al. Automatic vectorization using dynamic compilation and tree pattern matching technique in Jikes RVM
Aumage et al. Detecting simdization opportunities through static/dynamic dependence analysis
Aguilar et al. Towards parallelism extraction for heterogeneous multicore android devices

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160323

Termination date: 20170428