|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 277|回復: 0
打印 上一主題 下一主題

C++ 代码性能优化 -- 循环分割提高并行性

[複製鏈接]

56

主題

0

好友

475

積分

中學生

Rank: 3Rank: 3

  • TA的每日心情

    2024-3-15 19:20
  • 簽到天數: 191 天

    [LV.7]常住居民III

    推廣值
    0
    貢獻值
    0
    金錢
    179
    威望
    475
    主題
    56
    樓主
    發表於 2014-7-18 20:47:11
    对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法,
    我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能。

    原理:
    普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器。
    当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降。

    用代码来描述,如下:
    [url=][/url]
    // 一般情况下的代码    for (i = 1; i < n+1; i++){    res = res OPER i;}// 循环分割后代码for (i = 1; i < n; i+=2){    res1 = res1 OPER i;    res2 = res2 OPER (i+1);}[url=][/url]

    int 整数加法,性能测试结果对比如下:
    整数的加法,普通代码运行 26s,循环分割后,18s。
    浮点数计算的性能提升,明显大于整数,乘法的性能提升,略大于加法。

    完整测试代码:
    [url=][/url]
    #include <time.h>#include <iostream>#define OPER +#define INIT 0using namespace std;int calc1(int n){    int i;    int res = INIT;    for (i = 1; i < n+1; i++)    {        res = res OPER i;    }    return res;}int calc2(int n){    int i;    int res1 = INIT;    int res2 = INIT;    for (i = 1; i < n; i+=2)    {        res1 = res1 OPER i;        res2 = res2 OPER (i+1);    }    for (; i < n+1; i++)    {        res1 = res1 OPER i;    }    return res1 OPER res2;}typedef int (*FUNC)(int n);int time_test(FUNC calc, int param){    cout << " Result: " << calc(param) << "\t";    time_t t_begin;    time(&t_begin);    for (int i = 0; i < 10000; i++)        for (int j = 0; j < 10000; j++)            calc(param);    time_t t_end;    time(&t_end);    cout << "Time Cost: " << difftime(t_end, t_begin) << endl;}int main(){    cout << "calc1 ";    time_test(calc1, 100);    cout << "calc2 ";    time_test(calc2, 100);    return 0;}[url=][/url]


    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-5-17 06:26 , Processed in 0.025212 second(s), 26 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部