<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Cambria;
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
h1
        {mso-style-priority:9;
        mso-style-link:"Heading 1 Char";
        margin-top:17.0pt;
        margin-right:0cm;
        margin-bottom:16.5pt;
        margin-left:0cm;
        text-align:justify;
        text-justify:inter-ideograph;
        line-height:240%;
        page-break-after:avoid;
        font-size:22.0pt;
        font-family:"Calibri","sans-serif";}
h4
        {mso-style-priority:9;
        mso-style-link:"Heading 4 Char";
        margin-top:14.0pt;
        margin-right:0cm;
        margin-bottom:14.5pt;
        margin-left:0cm;
        text-align:justify;
        text-justify:inter-ideograph;
        line-height:155%;
        page-break-after:avoid;
        font-size:14.0pt;
        font-family:"Cambria","serif";}
p.MsoTitle, li.MsoTitle, div.MsoTitle
        {mso-style-priority:10;
        mso-style-link:"Title Char";
        margin-top:12.0pt;
        margin-right:0cm;
        margin-bottom:3.0pt;
        margin-left:0cm;
        text-align:center;
        font-size:16.0pt;
        font-family:"Cambria","serif";
        font-weight:bold;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:8.0pt;
        font-family:"Calibri","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        text-indent:21.0pt;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
span.Heading1Char
        {mso-style-name:"Heading 1 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 1";
        font-family:SimSun;
        font-weight:bold;}
span.Heading4Char
        {mso-style-name:"Heading 4 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 4";
        font-family:"Cambria","serif";
        font-weight:bold;}
span.TitleChar
        {mso-style-name:"Title Char";
        mso-style-priority:10;
        mso-style-link:Title;
        font-family:"Cambria","serif";
        font-weight:bold;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle24
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:176047353;
        mso-list-type:hybrid;
        mso-list-template-ids:-1666298196 67698689 67698689 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:21.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:21.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F075;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:63.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F06E;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F075;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:126.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F06E;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F075;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:189.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:337117229;
        mso-list-type:hybrid;
        mso-list-template-ids:-414299292 -1645566238 -1561842488 1593840458 1326879764 1495455694 -1966171496 1096998996 -1581208906 -1618587480;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:32.2pt;
        mso-level-number-position:left;
        margin-left:32.2pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2
        {mso-list-id:414015646;
        mso-list-type:hybrid;
        mso-list-template-ids:453543036 67698689 -635539534 1756249992 -1902889194 -1033238550 153660872 1837665024 77104174 1453521360;}
@list l2:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:18.0pt;
        mso-level-number-position:left;
        margin-left:18.0pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level2
        {mso-level-start-at:2363;
        mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:32.2pt;
        mso-level-number-position:left;
        margin-left:32.2pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:90.0pt;
        mso-level-number-position:left;
        margin-left:90.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:126.0pt;
        mso-level-number-position:left;
        margin-left:126.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:162.0pt;
        mso-level-number-position:left;
        margin-left:162.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:198.0pt;
        mso-level-number-position:left;
        margin-left:198.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:234.0pt;
        mso-level-number-position:left;
        margin-left:234.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:270.0pt;
        mso-level-number-position:left;
        margin-left:270.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l2:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:306.0pt;
        mso-level-number-position:left;
        margin-left:306.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3
        {mso-list-id:787160748;
        mso-list-type:hybrid;
        mso-list-template-ids:290734898 67698689 1866501538 -437600270 521991678 -1152106800 478971370 -707868914 515908794 917776284;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:18.0pt;
        mso-level-number-position:left;
        margin-left:18.0pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l3:level2
        {mso-level-start-at:2363;
        mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:32.2pt;
        mso-level-number-position:left;
        margin-left:32.2pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:90.0pt;
        mso-level-number-position:left;
        margin-left:90.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:126.0pt;
        mso-level-number-position:left;
        margin-left:126.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:162.0pt;
        mso-level-number-position:left;
        margin-left:162.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:198.0pt;
        mso-level-number-position:left;
        margin-left:198.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:234.0pt;
        mso-level-number-position:left;
        margin-left:234.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:270.0pt;
        mso-level-number-position:left;
        margin-left:270.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:306.0pt;
        mso-level-number-position:left;
        margin-left:306.0pt;
        text-indent:-18.0pt;
        font-family:"Arial","sans-serif";
        mso-bidi-font-family:"Times New Roman";}
@list l4
        {mso-list-id:1034112449;
        mso-list-type:hybrid;
        mso-list-template-ids:823938742 67698689 -423089454 627600076 1857324238 915289124 -905049002 -1845841248 1096833478 1877508842;}
@list l4:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F06C;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l4:level2
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l4:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5
        {mso-list-id:1087771331;
        mso-list-type:hybrid;
        mso-list-template-ids:118117262 143317786 763659492 -1427086490 -1806288704 -2036558004 -612434896 1881450128 -2073160062 -906885556;}
@list l5:level1
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level2
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l5:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6
        {mso-list-id:1204748942;
        mso-list-type:hybrid;
        mso-list-template-ids:1099844522 1103779732 1593976664 -560548736 582658292 450757134 842987842 -622285422 1675395376 -2055058448;}
@list l6:level1
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level2
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l6:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l7
        {mso-list-id:1392532599;
        mso-list-type:hybrid;
        mso-list-template-ids:-535939224 740837538 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l7:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:18.0pt;
        text-indent:-18.0pt;}
@list l7:level2
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%2\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:42.0pt;
        text-indent:-21.0pt;}
@list l7:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:63.0pt;
        text-indent:-21.0pt;}
@list l7:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;}
@list l7:level5
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%5\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;}
@list l7:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:126.0pt;
        text-indent:-21.0pt;}
@list l7:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;}
@list l7:level8
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%8\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;}
@list l7:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:189.0pt;
        text-indent:-21.0pt;}
@list l8
        {mso-list-id:2000762795;
        mso-list-type:hybrid;
        mso-list-template-ids:-1609502292 27001906 1676460732 464698988 -400652162 -698161052 -797516632 -1203852256 -810537176 1875967844;}
@list l8:level1
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level2
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l8:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9
        {mso-list-id:2001537176;
        mso-list-type:hybrid;
        mso-list-template-ids:-1021388566 518284884 279234924 -1344613492 536627392 1264108632 -580061614 1760960914 1423609748 -2042877032;}
@list l9:level1
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level2
        {mso-level-start-at:2393;
        mso-level-number-format:bullet;
        mso-level-text:\F0FC;
        mso-level-tab-stop:53.45pt;
        mso-level-number-position:left;
        margin-left:53.45pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l9:level3
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level4
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level5
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level6
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level7
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level8
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
@list l9:level9
        {mso-level-number-format:bullet;
        mso-level-text:\2022;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Verdana","sans-serif";}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi, community:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">For the sake of our business need, I want to enable “Function-based parallel code generation” to boost up the compilation of single module, please see the details of the design and provide your feedback<span style="color:#1F497D">s</span>
 on below aspects, thanks<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l7 level1 lfo19">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">Is this idea the proper solution for my requirement<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l7 level1 lfo19">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">This new feature will be enabled by llc –thd=N and has no impact on original llc when –thd=1<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l7 level1 lfo19">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US">Can this new feature of llc be accepted by community and merged into LLVM code tree<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Patches<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The patch is divided into four separated parts, the all-in-one patch could be found here:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><a href="http://llvm-reviews.chandlerc.com/D1152">http://llvm-reviews.chandlerc.com/D1152</a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Design<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="https://docs.google.com/document/d/1QSkP6AumMCAVpgzwympD5pI3btPJt4SRgjY-vhyfySg/edit?usp=sharing"><span style="color:windowtext">https://docs.google.com/document/d/1QSkP6AumMCAVpgzwympD5pI3btPJt4SRgjY-vhyfySg/edit?usp=sharing</span></a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoTitle"><span lang="EN-US" style="font-size:22.0pt">Function-based parallel LLVM backend code generation<o:p></o:p></span></p>
<p class="MsoNormal" align="center" style="text-align:center"><span lang="EN-US">Wan Xiaofei (xiaofei.wan@intel.com)</span><span lang="EN-US"><o:p></o:p></span></p>
<h1><span lang="EN-US">Background<o:p></o:p></span></h1>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Our business need to compile C/C++ source files into LLVM IR and link them into a big BC file; the big BC file is then compiled into binary code on different arch/target devices.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Backend code generation is a time-consuming activity happened on target device which makes it an important user experience.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Make –j or file based parallelism can’t help here since there is only one big BC file; function-based parallel LLVM backend code generation is a good solution to improve compilation time which will fully utilize
 multi-cores.<o:p></o:p></span></p>
<h1><span lang="EN-US">Overall design strategy and goal<o:p></o:p></span></h1>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level2 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Generate totally same binary as what single thread output<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level2 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">No impacts on single thread performance<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level2 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Little impacts on LLVM code infrastructure<o:p></o:p></span></p>
<h1><span lang="EN-US">Why not choose module-based parallelism<o:p></o:p></span></h1>
<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l3 level1 lfo4">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Module partition<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l3 level2 lfo4">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">How to partition one module into several modules which will consume similar time;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt"><span lang="EN-US">Compilation time is not decided by instructions number.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt"><span lang="EN-US">Compilation time depends on instruction categories + instruction number + CFG + others<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l1 level2 lfo6">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">We tried this solution and stopped after below obstacles.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt"><span lang="EN-US">Global variables & functions may be used by other modules; each global variables & constants has a use list, use list has to be re-constructed during module partition.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt"><span lang="EN-US">Functions and variables must be cloned out since they can’t belong to two modules; this may be a big effort and a waste of memory, especially for big BC files.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l2 level1 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Binaries merge<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Linking different binaries is needed after all modules are finished, usually linking is a time consuming activity.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l2 level1 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Validation strategy<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">To simplify the validation, generating same binary is the best solution (including symbols and function order). It is not easy to generate totally identical binaries even though it is correct in module-based
 parallelism. Symbol & temp variable mangling are done in different modules; it is difficult to ensure the symbols are same.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">The function order after linking may not be same as what it should be in one-module.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l2 level1 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Potential benefit<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">What is the benefit from module-based parallelism, can it bring more benefit than function-based parallelism?<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Module partition & module linkage are two extra overheads.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:32.2pt;text-indent:-18.0pt;mso-list:l2 level2 lfo8">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Global variables should be cloned for several times, it is a big memory penalty.<o:p></o:p></span></p>
<h1><span lang="EN-US">Design of function-based parallelism<o:p></o:p></span></h1>
<p class="MsoNormal"><span lang="EN-US"><img border="0" width="1217" height="697" id="Picture_x0020_2" src="cid:image001.png@01CE824E.0C5C7950"></span><span lang="EN-US"><o:p></o:p></span></p>
<h4><span lang="EN-US">Step 1: Make LLVM pass Reentrant<o:p></o:p></span></h4>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo10">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Function passes should be thread-safe since function-based parallelism is adopted.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo10">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">UseList and ValueHandleList of ‘Constant’ class may be accessed by different functions; all operations on UseList and ValueHandleList should be locked.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo10">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">LLVMContext will be shared by different functions; all accesses to LLVMContext should be locked.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo10">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">For allocators which use default SlabAllocator (which is static), operation on these kinds of allocators should be locked.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo10">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">l<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Symbols in MCContext are accessed by different functions, it should be locked.<o:p></o:p></span></p>
<h4><span lang="EN-US">Step 2: Multiple pass manager<o:p></o:p></span></h4>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l9 level1 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">The role of PM in LLVM code generator<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">PassManager is top level pass manager, it contains all module level passes which are necessary to generate the binary code; In all module-level passes, function pass manager is the biggest module pass.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">PassManager will control all steps during the code generation; a function should walk through all passes contained in function pass manager to emit final binary code.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Pass can’t be shared by different function/thread simultaneously since pass contain many immediate information.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l9 level1 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">Multiple pass managers<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Multiple pass managers are created to implement parallel compilation, each pass manager is owned by one thread.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">During all passes/pass managers, there is one parent pass/pass manager which will delegate some activities for other passes/pass managers<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:53.45pt;text-indent:-18.0pt;mso-list:l9 level2 lfo12">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">ü<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">AsmPrinter is the last pass for function passes, it is shared by all threads; in this pass, parent AsmPrinter will delegate the code emission for other threads.<o:p></o:p></span></p>
<h4><span lang="EN-US">Step 3: Share the last pass “AsmPrinter”<o:p></o:p></span></h4>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l5 level1 lfo14">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">AsmPrinter is the last function pass which will emit the final binary code; it is shared by different functions/threads.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l5 level1 lfo14">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">AsmPrinter is responsible for merging instructions generated by different threads.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l5 level1 lfo14">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">AsmPrinter will provide mechanism to make sure the instructions sequences are same as what they are in single thread.<o:p></o:p></span></p>
<h1><span lang="EN-US">Validation methodology & test result<o:p></o:p></span></h1>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l6 level1 lfo16">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">Parallel llc will generate totally same binary code as single thread, similar validation to single thread can be used<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l6 level1 lfo16">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">Long time stress tests are launched to guarantee the correctness and robustness.<o:p></o:p></span></p>
<h4><span lang="EN-US">Current status and test result<o:p></o:p></span></h4>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l8 level1 lfo18">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">Parallel llc can generate same code as single thread by “objdump -d”, it could pass 10 hours stress test for all performance benchmark<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l8 level1 lfo18">
<![if !supportLists]><span lang="EN-US" style="font-family:"Verdana","sans-serif""><span style="mso-list:Ignore">•<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span lang="EN-US">Parallel llc can introduce ~2.9X performance gain on XEON sever for 4 threads<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Wan Xiaofei<o:p></o:p></span></p>
</div>
</body>
</html>