高速缓存对c程序的影响
生活随笔
收集整理的這篇文章主要介紹了
高速缓存对c程序的影响
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CSAPP中習題6.32:
void transpose(int* dst,int *src,int dim){int i,j;for(i=0;i<dim;i++){for(j=0;j<dim;j++)dst[j*dim+i]=src[i*dim+j];//dst[i*dim+j]=src[j*dim+i];} }習題中要求對這個函數進行優化,使其運行的盡可能快(注意:如果dst=src時 該函數將無法給出正確的轉置 對于 i< j dst[ j][i]=src[i][j];之后dst[i][j]=src[j][i]=src[i][j] 所以嚴格來說程序并不正確)
這里函數對src(讀)有良好的空間局部性,而注釋對dst(寫)有良好的空間局部性
那么dst 跟src 究竟該如何抉擇呢?
asus-x450v ubuntu-15.04 下結果如下:
racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -O2 -g test632.c -o test632 racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.088328 0.075335 0.073660 0.073343 0.073186 0.072931 0.073345 0.073347 0.074611 0.073000 0.072897 0.073458 0.075522 0.075008 0.073786 0.072985 0.075262 0.075496 0.073429 0.072996 0.073051 0.073508 0.073138 0.073082 0.074234 0.073698 0.074394 0.073021 0.073352 0.073151 0.073128 0.073185 0.074191 0.073191 0.072762 0.073210 0.073014 0.072896 0.073125 0.072591 aver:0.073946 s 0.049332 0.047900 0.046897 0.047084 0.046906 0.047104 0.047036 0.046972 0.046993 0.046783 0.046938 0.046898 0.046930 0.047189 0.047473 0.047003 0.046958 0.046712 0.046854 0.047030 0.046735 0.047645 0.047265 0.046955 0.047009 0.047043 0.047726 0.046963 0.046967 0.046807 0.046846 0.046896 0.046896 0.046859 0.047024 0.046946 0.047065 0.046977 0.046886 0.047514 aver:0.047100 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.084686 0.076081 0.075047 0.074284 0.073946 0.074174 0.074238 0.076167 0.074529 0.074541 0.074332 0.074224 0.074126 0.074360 0.074123 0.074419 0.075260 0.074071 0.074187 0.074304 0.075282 0.074347 0.074233 0.074390 0.075235 0.074127 0.074435 0.074133 0.074109 0.074204 0.074046 0.074090 0.075034 0.075260 0.074775 0.074160 0.074719 0.074155 0.074127 0.074014 aver:0.074749 s 0.050311 0.047773 0.048264 0.047943 0.047927 0.047646 0.047647 0.047723 0.047994 0.048185 0.048238 0.048592 0.047814 0.048007 0.047583 0.047755 0.047714 0.047627 0.047711 0.047575 0.047744 0.047751 0.047677 0.047710 0.047637 0.048277 0.047633 0.047530 0.047603 0.047713 0.047731 0.047675 0.048529 0.047599 0.047695 0.047654 0.047894 0.047875 0.048047 0.047687 aver:0.047892 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.082047 0.073840 0.072420 0.071705 0.071752 0.071794 0.071699 0.071718 0.073112 0.073322 0.072200 0.072203 0.071850 0.071716 0.071814 0.071924 0.072867 0.071798 0.071790 0.071810 0.071607 0.071649 0.071929 0.073472 0.073022 0.072104 0.071859 0.071631 0.071654 0.071951 0.072790 0.075006 0.073715 0.073955 0.072266 0.071710 0.073423 0.072129 0.072035 0.071950 aver:0.072581 s 0.049054 0.046517 0.047292 0.046432 0.046773 0.046447 0.046462 0.046626 0.046376 0.046437 0.046548 0.046430 0.046498 0.046488 0.046497 0.047664 0.047689 0.046329 0.046878 0.046456 0.046634 0.046550 0.046425 0.046385 0.046579 0.046496 0.046582 0.047478 0.046812 0.046804 0.046515 0.046495 0.046446 0.046419 0.046643 0.046944 0.046495 0.047526 0.046815 0.046748 aver:0.046742 s racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -g test632.c -o test632 racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.122130 0.085775 0.080064 0.079610 0.081753 0.080143 0.080409 0.080180 0.080013 0.079075 0.079429 0.079397 0.079768 0.079550 0.081045 0.079677 0.079382 0.082167 0.080054 0.079457 0.079770 0.080644 0.080005 0.079555 0.079195 0.079632 0.079787 0.079580 0.079617 0.082464 0.079843 0.079464 0.079540 0.079318 0.078787 0.079691 0.080524 0.080312 0.079748 0.079406 aver:0.081149 s 0.066526 0.064227 0.066351 0.064425 0.063982 0.065758 0.064626 0.064171 0.064065 0.064223 0.064018 0.064469 0.064082 0.064184 0.065250 0.064371 0.064498 0.064185 0.066242 0.064440 0.064189 0.064346 0.064304 0.064076 0.065550 0.064569 0.064197 0.064044 0.064074 0.064283 0.064150 0.064099 0.064069 0.066287 0.064383 0.064390 0.064025 0.064515 0.064124 0.064165 aver:0.064548 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.120574 0.086958 0.080388 0.079176 0.079785 0.079070 0.080510 0.080163 0.079730 0.078555 0.079258 0.079752 0.079117 0.079233 0.082527 0.079547 0.079418 0.080343 0.079406 0.079329 0.079273 0.079682 0.081512 0.079872 0.079763 0.079258 0.081703 0.079283 0.079184 0.080931 0.079930 0.079299 0.079689 0.079735 0.079395 0.079055 0.079363 0.081646 0.079598 0.081784 aver:0.081070 s 0.066352 0.064712 0.064443 0.064541 0.064353 0.065876 0.064595 0.064547 0.064274 0.064248 0.064334 0.064348 0.064512 0.064587 0.066906 0.064796 0.064625 0.064405 0.064660 0.064412 0.064296 0.064545 0.064248 0.064476 0.065931 0.064548 0.064279 0.064523 0.064120 0.066050 0.064737 0.064529 0.064500 0.065931 0.064861 0.064320 0.064276 0.064485 0.064596 0.072743 aver:0.064938 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.122052 0.085333 0.081154 0.078984 0.079097 0.079069 0.079228 0.079709 0.079206 0.079090 0.079385 0.078957 0.079293 0.079001 0.081142 0.081622 0.081766 0.081070 0.082323 0.080718 0.080691 0.079533 0.082441 0.079065 0.078835 0.079196 0.078658 0.081808 0.079852 0.079209 0.079229 0.082747 0.080583 0.079319 0.079200 0.079500 0.083713 0.079674 0.079310 0.081437 aver:0.081305 s 0.067318 0.064429 0.063979 0.063841 0.066023 0.065258 0.063543 0.063999 0.064761 0.065045 0.063799 0.063685 0.063846 0.063971 0.065120 0.065325 0.063770 0.063889 0.063745 0.063748 0.063683 0.063611 0.063643 0.063773 0.063759 0.063804 0.063719 0.065702 0.065945 0.063706 0.064501 0.064801 0.065215 0.064310 0.063874 0.063728 0.067117 0.064128 0.063954 0.063537 aver:0.064390 s由數據有:
1.方法2較方法1有更高的效率(windows下驗證似乎不一樣)
另外可以看出在運行過程中兩種方法在前期都隨著循環次數的增加效率有相應略有提高方法一較為明顯,向來原因應該是隨著循環次數增加緩存加熱
稍加修改
clock_t transpose1(int *dst,int *src,int dim) {clock_t t;t=clock();int i,j,ind=0;for(i=0;i<dim;++i){for(j=0;j<dim;j++,ind++){dst[j*dim+i]=src[ind];}}return clock()-t; } clock_t transpose2(int *dst,int *src,int dim) {clock_t t;t=clock();int i,j,ind=0;for(i=0;i<dim;++i){for(j=0;j<dim;j++,ind++){dst[ind]=src[j*dim+i];}}return clock()-t; }運行結果如下:
racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -O2 -g test632.c -o test632 racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.084458 0.075859 0.074590 0.072886 0.072274 0.072222 0.072555 0.073080 0.074069 0.073654 0.072600 0.072344 0.072298 0.072224 0.073314 0.072481 0.073612 0.072769 0.072215 0.072412 0.072598 0.072943 0.071944 0.074446 0.074197 0.072660 0.071958 0.072494 0.073029 0.072012 0.072273 0.072656 0.072866 0.073366 0.072502 0.072940 0.072097 0.074132 0.072559 0.072618 aver:0.073205 s 0.048772 0.047302 0.047230 0.046929 0.046964 0.046979 0.047092 0.047104 0.047271 0.046971 0.056692 0.051896 0.049736 0.048199 0.047937 0.046960 0.047637 0.047354 0.046993 0.046952 0.047132 0.047019 0.046908 0.047226 0.046869 0.046991 0.047643 0.046949 0.047217 0.046840 0.046965 0.047027 0.046847 0.047020 0.046989 0.046852 0.047136 0.047634 0.047324 0.047520 aver:0.047627 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.084992 0.076507 0.074758 0.074010 0.073281 0.073785 0.073780 0.074170 0.074103 0.073692 0.073397 0.073403 0.073768 0.073308 0.073912 0.074869 0.075446 0.073672 0.073505 0.074010 0.073993 0.073380 0.073659 0.073600 0.074605 0.073816 0.073644 0.073798 0.074404 0.073839 0.073768 0.074083 0.074847 0.073810 0.073622 0.073698 0.074074 0.073294 0.073356 0.073794 aver:0.074236 s 0.050402 0.047505 0.046684 0.048188 0.046826 0.046937 0.046893 0.046985 0.046747 0.047056 0.047123 0.047017 0.046983 0.047612 0.046699 0.047031 0.046815 0.047046 0.047093 0.046888 0.046893 0.046904 0.046932 0.046897 0.046855 0.048757 0.047388 0.046670 0.047011 0.046884 0.047040 0.046999 0.046993 0.046836 0.046801 0.046968 0.046939 0.046940 0.046789 0.047624 aver:0.047141 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.084189 0.075493 0.074127 0.073255 0.073321 0.073593 0.073394 0.073426 0.074503 0.074099 0.073860 0.073401 0.073464 0.073300 0.073193 0.073463 0.074668 0.073453 0.073147 0.073713 0.073453 0.073303 0.073321 0.075217 0.074663 0.073041 0.073480 0.073736 0.073672 0.073454 0.073374 0.073242 0.074612 0.073217 0.073261 0.073230 0.073338 0.075376 0.073375 0.073374 aver:0.073970 s 0.049225 0.048562 0.047818 0.047795 0.047756 0.047704 0.047725 0.047676 0.047797 0.047630 0.047793 0.047866 0.047955 0.048452 0.047615 0.047759 0.048482 0.047703 0.047669 0.047894 0.047699 0.047597 0.048389 0.047699 0.049340 0.047589 0.048373 0.047722 0.047690 0.047733 0.047761 0.047964 0.047593 0.047820 0.047646 0.047687 0.047577 0.048760 0.048463 0.047649 aver:0.047941 s racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -g test632.c -o test632 racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.122716 0.086362 0.082700 0.080401 0.080727 0.081098 0.081830 0.080317 0.080449 0.080064 0.080239 0.080359 0.080420 0.079966 0.085387 0.094534 0.082094 0.080165 0.080270 0.080074 0.080150 0.081805 0.080163 0.079872 0.080156 0.079962 0.079943 0.081869 0.080046 0.080753 0.080143 0.080261 0.080021 0.080187 0.080106 0.079921 0.082196 0.080038 0.079927 0.082148 aver:0.082246 s 0.066301 0.063151 0.062934 0.063150 0.064173 0.063381 0.063141 0.063207 0.063248 0.062927 0.063162 0.063043 0.063133 0.062887 0.064249 0.065513 0.063405 0.063180 0.062891 0.063312 0.063376 0.062926 0.062985 0.064083 0.063272 0.063050 0.062981 0.063155 0.063215 0.063016 0.062984 0.065242 0.063195 0.064563 0.063039 0.063325 0.063345 0.062916 0.063077 0.063300 aver:0.063436 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.121766 0.086219 0.081244 0.080589 0.080695 0.082554 0.082421 0.080667 0.080788 0.080655 0.080920 0.081549 0.080667 0.080635 0.082151 0.080919 0.080578 0.082405 0.080733 0.080761 0.080572 0.082288 0.081716 0.081723 0.080914 0.080728 0.081216 0.080548 0.080664 0.083382 0.081254 0.080850 0.080655 0.080770 0.081024 0.080329 0.081973 0.080894 0.080530 0.080600 aver:0.082289 s 0.064781 0.062581 0.063687 0.062970 0.063897 0.062843 0.062615 0.063088 0.062528 0.062491 0.062472 0.062594 0.062364 0.062480 0.063648 0.062838 0.062317 0.062464 0.064040 0.062967 0.062779 0.062335 0.062394 0.062993 0.063761 0.062774 0.062622 0.062505 0.062445 0.062322 0.062315 0.062619 0.062388 0.068484 0.063168 0.062984 0.063127 0.062280 0.063158 0.063005 aver:0.063003 s racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 0.120738 0.084820 0.078652 0.078008 0.077840 0.078297 0.078046 0.080617 0.078352 0.078110 0.078125 0.078487 0.078211 0.077910 0.079978 0.077921 0.078019 0.078059 0.078081 0.078066 0.079595 0.078495 0.107833 0.090293 0.079568 0.078143 0.078213 0.078590 0.078465 0.080077 0.079048 0.078129 0.080188 0.078737 0.078187 0.078668 0.078489 0.079858 0.078282 0.118088 aver:0.081832 s 0.068486 0.062927 0.062152 0.062148 0.062176 0.064607 0.062751 0.062466 0.062035 0.062176 0.062074 0.062454 0.062078 0.062051 0.063207 0.062713 0.062123 0.062230 0.061972 0.062334 0.062180 0.061981 0.064263 0.062685 0.063387 0.062356 0.062260 0.062422 0.062106 0.061973 0.062297 0.062388 0.062045 0.062234 0.063351 0.062524 0.062171 0.061992 0.064258 0.062602 aver:0.062666 s可以看見在修改了小地方后 在不開啟O2優化時運行時間減少了約0.02秒
O2優化下相差不明顯
總結
以上是生活随笔為你收集整理的高速缓存对c程序的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令--tac(倒序查看文件所
- 下一篇: 给你三个必须要学C语言的理由!