์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ์ธ์ด์ 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์ ๊ทธ๋ฌํ ์ฐ์ฐ์๊ฐ์๋ ๊ฒฝ์ฐ์๋ ๋ถํ ์ ๊ณ์ฐํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ ๋ฒ์ ๋๋จธ์ง๋ฅผ ๊ณ์ฐํ๋ ๋จ์ผ ๋ช
๋ น์ผ๋ก ๋ ๊ฐ์ ๋ณ๋ ๋ช
๋ น๋ฌธ์ ๋ฐ๊ฟ ์๋ ์์ต๋๋ค
.