์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: C++

C++

์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ C ++ ์ฝ”๋“œ๋ณด๋‹ค ๋А๋ฆฝ๋‹ˆ๊นŒ?

์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์™€ C ++ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋ ค๊ณ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๊ฐ€ 2000 ์ธ ๋‘ ๋ฐฐ์—ด์„ 100000 ํšŒ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#define TIMES 100000
void calcuC(int *x,int *y,int length)
{
    for(int i = 0; i < TIMES; i++)
    {
        for(int j = 0; j < length; j++)
            x[j] += y[j];
    }
}


void calcuAsm(int *x,int *y,int lengthOfArray)
{
    __asm
    {
        mov edi,TIMES
        start:
        mov esi,0
        mov ecx,lengthOfArray
        label:
        mov edx,x
        push edx
        mov eax,DWORD PTR [edx + esi*4]
        mov edx,y
        mov ebx,DWORD PTR [edx + esi*4]
        add eax,ebx
        pop edx
        mov [edx + esi*4],eax
        inc esi
        loop label
        dec edi
        cmp edi,0
        jnz start
    };
}

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค main():

int main() {
    bool errorOccured = false;
    setbuf(stdout,NULL);
    int *xC,*xAsm,*yC,*yAsm;
    xC = new int[2000];
    xAsm = new int[2000];
    yC = new int[2000];
    yAsm = new int[2000];
    for(int i = 0; i < 2000; i++)
    {
        xC[i] = 0;
        xAsm[i] = 0;
        yC[i] = i;
        yAsm[i] = i;
    }
    time_t start = clock();
    calcuC(xC,yC,2000);

    //    calcuAsm(xAsm,yAsm,2000);
    //    for(int i = 0; i < 2000; i++)
    //    {
    //        if(xC[i] != xAsm[i])
    //        {
    //            cout<<"xC["<<i<<"]="<<xC[i]<<" "<<"xAsm["<<i<<"]="<<xAsm[i]<<endl;
    //            errorOccured = true;
    //            break;
    //        }
    //    }
    //    if(errorOccured)
    //        cout<<"Error occurs!"<<endl;
    //    else
    //        cout<<"Works fine!"<<endl;

    time_t end = clock();

    //    cout<<"time = "<<(float)(end - start) / CLOCKS_PER_SEC<<"\n";

    cout<<"time = "<<end - start<<endl;
    return 0;
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์„ฏ ๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์„ธ์„œ ์‚ฌ์ดํด์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ˜ธ์ถœ ํ•  ๋•Œ๋งˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ๊ฐ€์˜ต๋‹ˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ :

Debug   Release
---------------
732        668
733        680
659        672
667        675
684        694
Average:   677

C ++ ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ :

Debug     Release
-----------------
1068      168
 999      166
1072      231
1002      166
1114      183
Average:  182

๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์˜ C ++ ์ฝ”๋“œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ณด๋‹ค ๊ฑฐ์˜ 3.7 ๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์™œ?

ํ•„์ž๊ฐ€ ์ž‘์„ฑํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ GCC์—์„œ ์ƒ์„ฑ ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋งŒํผ ํšจ๊ณผ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ ํ•œ ์ƒ๋Œ€๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๋” ๋นจ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•„์ž๊ฐ€ ์ž‘์„ฑํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜ ์„ฑ๋Šฅ์„ ๋ฏฟ์ง€ ๋ง๊ณ  C ++์— ์ง‘์ค‘ํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ์žŠ์–ด ๋ฒ„๋ฆฌ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ?



๋‹ต๋ณ€

์˜ˆ, ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์šฐ์„  ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์–ธ์–ด (์ด ๊ฒฝ์šฐ ์–ด์…ˆ๋ธ”๋ฆฌ)๊ฐ€ ํ•ญ์ƒ ๋†’์€ ์ˆ˜์ค€์˜ ์–ธ์–ด (์ด ๊ฒฝ์šฐ C ++ ๋ฐ C)๋ณด๋‹ค ๋น ๋ฅธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ž˜๋ชป๋œ ๊ฐ€์ •์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. C ์ฝ”๋“œ๋Š” ํ•ญ์ƒ Java ์ฝ”๋“œ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋‹ˆ์š”. ์•„ํ‚คํ…์ฒ˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ฝ”๋“œ์™€ ์ง€์‹์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค (์ด ๊ฒฝ์šฐ ์ฐธ์กฐ).

๋‹น์‹ ์€ ํ•  ์ˆ˜ ํ•ญ์ƒ ์†์œผ๋กœ ๋งŒ๋“  ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ž˜ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ๋ฅผ ์ƒ์‚ฐํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋Š” ๊ฐ€์ƒ์˜ ์˜ˆ ๋˜๋Š” ๋‹จ์ผ ๋ฃจํ‹ด์ด ์•„๋‹Œ์˜ ์ง„์ •ํ•œ C ++ ์ฝ”๋“œ์˜ 500.000+ ๋ผ์ธ์˜ ํ”„๋กœ๊ทธ๋žจ). ๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋” ๋‚˜์€ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ 95 %์˜ ์‹œ๊ฐ„์„ ์ƒ์‚ฐํ•˜๊ณ  ์ƒ๊ฐ ๋•Œ๋กœ๋Š”, ์ผ๋ถ€ ํฌ๊ท€ ํ•œ ๋ฒˆ, ๋‹น์‹ ์ด ์กฐ๋ฆฝ ๋ช‡ ์งง์€์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๋งค์šฐ ์‚ฌ์šฉ , ์„ฑ๋Šฅ ์ค‘์š”ํ•œ ๋ฃจํ‹ด ๋˜๋Š” ์•ก์„ธ์Šคํ•ด์•ผ ํ•  ๋•Œ ๋‹น์‹ ์˜ ๋งˆ์Œ์— ๋“œ๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ์–ธ์–ด ๊ธฐ๋Šฅ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ณต์žกํ•œ ์ž‘์—…์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด ๋ฉ‹์ง„ ๋‹ต๋ณ€์„ ์—ฌ๊ธฐ์—์„œ ์ฝ์œผ์‹ญ์‹œ์˜ค .

์™œ ์ด๋Ÿฐ๊ฐ€์š”?

์šฐ์„  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒ์ƒ์กฐ์ฐจ ํ•  ์ˆ˜์—†๋Š” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ( ์ด ์งง์€ ๋ชฉ๋ก ์ฐธ์กฐ ) ๋ช‡ ์ดˆ ๋งŒ์— ์ˆ˜ํ–‰ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ( ์ผ์ด ํ•„์š”ํ•  ๋•Œ ).

์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ฝ”๋”ฉ ํ•  ๋•Œ๋Š” ์ž˜ ์ •์˜ ๋œ ํ˜ธ์ถœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์ •์˜ ๋œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น , ์ƒ์ˆ˜ ์ „ํŒŒ , ๊ณตํ†ต ํ•˜์œ„ ์‹ ์ œ๊ฑฐ , ๋ช…๋ น์–ด ์Šค์ผ€์ค„๋ง ๋ฐ ๊ธฐํƒ€ ๋ณต์žกํ•œ ( ์˜ˆ : Polytope ๋ชจ๋ธ ) ๊ณผ ๊ฐ™์€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์ตœ์ ํ™” ๋ฐ ์ ˆ์ฐจ ๊ฐ„ ์ตœ์ ํ™” ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์— RISC ์•„ํ‚คํ…์ฒ˜๋“ค (์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค์šฐ ์–ด๋ ค์šด ๋ช…๋ น ์Šค์ผ€์ค„๋ง์ด ๋ช‡ ๋…„ ์ „ ๊ฑฑ์ • ์ค‘์ง€ ์†์œผ๋กœ ์กฐ์ • )๊ณผ ํ˜„๋Œ€ CISC์˜ CPU๋Š” ๋งค์šฐ ๊ธด์ด ํŒŒ์ดํ”„ ๋ผ์ธ์„ ๋„ˆ๋ฌด.

์ผ๋ถ€ ๋ณต์žกํ•œ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ๋‚˜์€ (๊ทธ๋ฆฌ๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์‰ฌ์šด) ์ตœ์ข… ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์กฐ์ฐจ ์–ด์…ˆ๋ธ”๋ฆฌ ๋Œ€์‹  C๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋•Œ๋•Œ๋กœ ์ž์ฒด์ ์œผ๋กœ ์ผ๋ถ€ MMX / SIMDx ๋ช…๋ น์–ด ๋ฅผ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ,์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹จ์ˆœํžˆ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (๋‹ค๋ฅธ ๋‹ต๋ณ€์€ ์ด๋ฏธ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž˜ ๊ฒ€ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค). ๋ฃจํ”„์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™•์ธ ํ•˜๋Š” ๋ฃจํ”„ ์ตœ์ ํ™” ์˜ ์งง์€ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค (C # ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ผ์ •์ด ๊ฒฐ์ •๋˜์—ˆ์„ ๋•Œ ํ˜ผ์ž์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?) ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ, ์ตœ์†Œํ•œ ๊ฐ„๋‹จํ•œ ์ตœ์ ํ™” ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค . ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ต๊ณผ์„œ ์˜ˆ์ œ ๋Š” ์‚ฌ์ดํด ์„ ์–ธ ๋กค๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ปดํŒŒ์ผ ํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ์•Œ๋ ค์ง). ๊ทธ๊ฒƒ์„ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์š”์ฆ˜์—๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ CPU ๊ฐ€ ๋งŽ์€ ๋‹ค๋ฅธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค . ๋‹น์‹ ์€ ๊ทธ๋“ค ๋ชจ๋‘๋ฅผ ์ง€์› ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ๊ฐ์—๋Š” ํŠน์ • ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜ ์™€ ํŠน์ • ๋ช…๋ น์–ด ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜์˜ ๊ธฐ๋Šฅ ์œ ๋‹›์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋ฐ”์˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๋ฆฝ ์ง€์นจ์„ ๋งˆ๋ จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค . C๋กœ ์ž‘์„ฑํ•˜๋ฉด PGO๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์กฐ๋ฆฝ์—์„œ๋Š” ํ•ด๋‹น ํŠน์ • ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ( ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์žฌ๊ณ ํ•˜๊ณ  ๋‹ค์‹œ ์‹คํ–‰ ). ์†Œ๊ทœ๋ชจ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ€ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋ณต์žกํ•œ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์  ์œผ๋กœ ์ž‘์—…์ด ์ƒํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ ์ปดํŒŒ์ผ๋Ÿฌ ๋Š” ์–ด์จŒ๋“  ๋” ์ž˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ).

์•‰์•„์„œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ๋””์ž์ธํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ์œ„๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ์—ฌ๊ธฐ์—์„œ ์ฝ์œผ์‹ญ์‹œ์˜ค ), ๊ณ ๊ธ‰ ์ตœ์ ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ํžŒํŠธ) ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์— ์˜์กดํ•˜๊ธฐ ์ „์— ํšจ๊ณผ์ ์œผ๋กœ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์ข… ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์—์„œ 5 ~ 10 ๋ฐฐ ๋น ๋ฅธ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ ๊ณ ๊ฐ์—๊ฒŒ ์ผ์ฃผ์ผ์˜ ์‹œ๊ฐ„ ์„ ์ง€๋ถˆ ํ•  ๊ฒƒ์ธ์ง€ 50 ๋‹ฌ๋Ÿฌ ๋น ๋ฅธ CPU ๋ฅผ ๊ตฌ๋งคํ•  ๊ฒƒ์ธ์ง€ ๋ฌผ์–ด๋ณด์•„์•ผํ•ฉ๋‹ˆ๋‹ค . ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ํŠนํžˆ LOB ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋ณด๋‹ค ๋” ๊ทน๋‹จ์  ์ธ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ฐจ์„ ์ฑ…์ด๋ฉฐ ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด๋ถ€ ๋ฃจํ”„์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ( EDX )๋ฅผ ๋ฐ€๊ณ  ํ„ฐ ๋œจ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„ ๋ฐ–์œผ๋กœ ์ด๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณต ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์‹œ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„ ๋ฐ–์œผ๋กœ ์ด๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹น์‹ ์€ loop์ง€์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ˜„๋Œ€์ ์ธ CPU์—์„œ ์ฃฝ์€ ๋А๋ฆฐ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ (๊ณ ๋Œ€ ์กฐ๋ฆฝ ์ฑ… *์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ)
  • ์ˆ˜๋™ ๋ฃจํ”„ ์–ธ ๋กค๋ง์˜ ์ด์ ์€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SIMD ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋”ฐ๋ผ์„œ ์–ด์…ˆ๋ธ”๋Ÿฌ์™€ ๊ด€๋ จ๋œ ๊ธฐ์ˆ ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์–ด์…ˆ๋ธ”๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

* ๋ฌผ๋ก  loop๊ณ ๋Œ€ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ถ์—์„œ ์‹ค์ œ๋กœ ๊ตํ›ˆ์„ ๋ฐ›์•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ๊ฑฐ์˜ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐฉ์ถœ ํ• ๋งŒ ํผ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š๊ธฐ loop๋•Œ๋ฌธ์— IMHO ๋‚˜์˜๊ณ  ์˜ค๋ž˜๋œ ์ฑ…์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ํƒ๊ตฌํ•˜๊ธฐ ์ „์—๋„ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
  for (int i = 0; i < TIMES; i++) {
    for (int j = 0; j < length; j++) {
      x[j] += y[j];
    }
  }
}

๋ฃจํ”„ ํšŒ์ „ ์„ ํ†ตํ•ด ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
    for (int j = 0; j < length; ++j) {
      for (int i = 0; i < TIMES; ++i) {
        x[j] += y[j];
      }
    }
}

๋ฉ”๋ชจ๋ฆฌ ๋กœ์ปฌ ๋ฆฌํ‹ฐ๊ฐ€์žˆ๋Š” ํ•œ ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋” ์ตœ์ ํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค a += b.X ์‹œ๊ฐ„์„ํ•˜๋Š” a += X * b๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
    for (int j = 0; j < length; ++j) {
      x[j] += TIMES * y[j];
    }
}

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ (LLVM) ์ด์ด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[ํŽธ์ง‘] ๊ทธ๋ฆฌ๊ณ  restrictํ•œ์ •์ž๋ฅผ xand๋กœ ์‚ฌ์šฉ ํ•˜๋ฉด ๋ณ€ํ™˜์ด ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค y. ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์ œํ•œ์—†์ด, x[j]๊ทธ๋ฆฌ๊ณ  y[j]์ˆ˜ ๋ณ€ํ™˜์ด ์˜ค๋ฅ˜ํ•˜๊ฒŒ ๋™์ผํ•œ ์œ„์น˜ ๋ณ„๋ช…. [ํŽธ์ง‘ ์ข…๋ฃŒ]

์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์ตœ์ ํ™” ๋œ C ๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ASM์—์„œ์˜ ๊ท ์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (Clang์ด ์ƒ์„ฑํ•˜๋„๋กํ•˜๊ณ , ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค).

calcuAsm:                               # @calcuAsm
.Ltmp0:
    .cfi_startproc
# BB#0:
    testl   %edx, %edx
    jle .LBB0_2
    .align  16, 0x90
.LBB0_1:                                # %.lr.ph
                                        # =>This Inner Loop Header: Depth=1
    imull   $100000, (%rsi), %eax   # imm = 0x186A0
    addl    %eax, (%rdi)
    addq    $4, %rsi
    addq    $4, %rdi
    decl    %edx
    jne .LBB0_1
.LBB0_2:                                # %._crit_edge
    ret
.Ltmp1:
    .size   calcuAsm, .Ltmp1-calcuAsm
.Ltmp2:
    .cfi_endproc

๋‚˜๋Š” ๊ทธ ๋ชจ๋“  ์ง€์นจ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์žฌ๋ฏธ ์žˆ๊ณ  ๋น„๊ตํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ฝ”๋“œ์—์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฒ„์ „๋ณด๋‹ค๋Š” ์ตœ์ ํ™” ๋œ C ๋ฒ„์ „์„ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ํœด๋Œ€์šฉ.


๋‹ต๋ณ€

์งง์€ ๋Œ€๋‹ต : ์˜ˆ.

๊ธด ๋Œ€๋‹ต : ์˜ˆ, ์‹ค์ œ๋กœ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋‚ด asm ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  __asm
{
    mov ebx,TIMES
 start:
    mov ecx,lengthOfArray
    mov esi,x
    shr ecx,1
    mov edi,y
label:
    movq mm0,QWORD PTR[esi]
    paddd mm0,QWORD PTR[edi]
    add edi,8
    movq QWORD PTR[esi],mm0
    add esi,8
    dec ecx
    jnz label
    dec ebx
    jnz start
};

์ถœ์‹œ ๋ฒ„์ „์˜ ๊ฒฐ๊ณผ :

 Function of assembly version: 81
 Function of C++ version: 161

๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” C ++๋ณด๋‹ค ๊ฑฐ์˜ 2 ๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋‚ด ์†์œผ๋กœ ์“ด ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜ ์„ฑ๋Šฅ์„ ์‹ ๋ขฐํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ๊ฒƒ์ด ์ •ํ™•ํžˆ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ด๋ฉฐ ๋ชจ๋“  ์‚ฌ๋žŒ ์—๊ฒŒ ํ•ด๋‹น ๋ฉ๋‹ˆ๋‹ค ์–ธ์–ด์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์–ธ์–ด X๋กœ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ X๋กœ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์‹ ๋ขฐํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ํŠนํžˆ ์ด๊ฒƒ์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹น์‹ ์ด ๋ณด๋Š” ๊ฒƒ์ด ๋‹น์‹ ์ด ์–ป๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. CPU๊ฐ€ ์‹คํ–‰ํ•  ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ๋งŽ์€ ๋น„ ํšจ์œจ์„ฑ์„ ์ œ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ betweeen์— ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋ฆฝ์„ ํ†ตํ•ด ๋‹น์‹ ์€ ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์˜ค๋Š˜๋‚  ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” ์–ธ์–ด๋กœ ์•ก์„ธ์Šค ํ•  ์ˆ˜์—†๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์Œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • MMU์™€ ๊ฐ™์€ ํŠน์ • ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•ด์•ผํ•˜๋Š” ์ปค๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋งค์šฐ ํŠน์ •ํ•œ ๋ฒกํ„ฐ ๋˜๋Š” ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งค์šฐ ์˜๋ฆฌ d = a / b; r = a % b;ํ•ฉ๋‹ˆ๋‹ค .C์— ๊ทธ๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋ถ„ํ• ์„ ๊ณ„์‚ฐํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ๋‚˜๋จธ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ๋ช…๋ น๋ฌธ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
.


์ด ๊ธ€์€ C++ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.