cachec語言
1. 如何編寫100% cache miss的C程序
1、查看你的系統cache大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size
我的系統是centos 5.8。以上命令是查看Level 2cache的大小,在我的伺服器上是256k,記住這個數,寫程序時要用。
2、查看cache line的大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size
我的伺服器上是64,單位是bytes,記住這個數,也要用到。
3、編寫測試程序cache.c:
[cpp] view plain print?
int matrix[8192][16]; //4*8192*16=2^18=512k bytes
void bad_access()
{
int k, j, sum = 0;
for(k = 0; k < 16; k++)
for(j = 0; j < 8192; j++)
sum += matrix[j][k];
}
int main()
{
int i;
for(i = 0; i< 5000000; i++)
bad_access();
return 0;
}
以上代碼雖然簡單,但要理解需要懂cache的簡單結構及原理:cache是以64位元組或者128位元組為一行的,分為多組(或者叫多路),每次發生cache miss取數據時,cache會按照cache line為單位(這里也就是一次取64位元組)從內存取數據。
第一步得知level 2 data cache總大小是256k,第二步得到每個cache line是64位元組,所以,level2 data cache共256k/64=2^12=4096行。
想像一個表,每行64位元組,一共4096行,共256k大小,這就是我們cache的簡單結構。為了保證每次取數據都會發生miss,我們必須以>=64位元組的步長取數據。
首先創建一個512K大的數組,要比cache大一倍。如果數組也是256k,當第一次循環結束,數組用完後再次從頭開始取數據時,cache就不再被替換,所以不會再發生cache
miss,為了保證每次取數據都要發生cache miss,數組必須至少是cache大小的兩倍及以上。
循環讀取數組中的數據,每次讀一個int大小,然後加64,再讀取下一個cache line的數據,循環直到數組數據全部取出。
oprofile統計cache miss有個最低限制(我的0.9.8版本是2000000次),所以發生的miss數太小的話是娶不到的,所以加大循環次數至5000000。
4、至此可以進行100% cache
miss的測試了,但是經過測試發現 cache miss壓根沒發生,百思不得其解,請教boss後才想起來,x86有個stream
buffer硬體預取器,如果你取數據非常規律,那麼硬體預取器經過訓練後,會在你真正取數據之前,將你要的數據直接放到cache中。所以,要在至強處理器的伺服器上做cache
miss測試,必須重啟系統後,關閉硬體預取器。否則就要修改程序,寫出真正隨機取數據的代碼,但是這無法保證cache
miss 率是100%,只能保證cache 命中率比較低而已。
5、SPEC CPU2006中的mcf發生cache miss rate很高,可以用其做測試。
2. c語言中,求內存緩沖區的詳細解釋!
緩沖區(Buffer)又稱為緩存(Cache),是內存空間的一部分。也就是說,在內存中預留了一定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。
3. C語言中使用inline函數會降低cache命中率么
inline vs. __forceinline
MS Visual C++, 以及其它幾種編譯器,提供了一個非標準的用於控制函數內嵌(inline)的關鍵字,作為對標准關鍵字inline的補充。為什麼要添加這個非標准關鍵字呢?先讓我們來看看inline的一些局限,決定一個聲明為inline的函數是否真的進行嵌入,完全取決於編譯器的判斷。因此inline只是一個建議,在一些情況下,比如在一些內嵌函數中包含有循環或是這個函數體太大了,那麼即使這個函數聲明為inline,編譯器也將拒絕這個函數的嵌入。
與此相反,非標准關鍵字__forceinline 將忽略編譯器的判斷並強迫編譯器去嵌入一個它本該拒絕嵌入的函數。我不太肯定使用這個關鍵字的意義,它可能會使可執行文件變得臃腫並降低cache的命中率。幸運的是,在一些極端條件下,編譯器可能不接受__forceinline的任何請求。所以,一般情況下最好是使用標準的inline,inline是可移植的並且讓編譯器去做出「正確的選擇」。
__forceinline 只應在下列條件全為真的情況下使用:inline不被編譯器接受;你的代碼不需要向其它平台進行移植;並且你能肯定嵌入這個函數會提高性能。
4. C語言 對位元組的高位和低位進行互換!
可以直接用位運算:按位與,按位或,移位等
#include "stdio.h"
int main()
{
unsigned char tmp1,tmp2;
printf("please input a char: ");
scanf("%c", &tmp1);
tmp2=
((tmp1&0x01)<<7)
|((tmp1&0x02)<<5)
|((tmp1&0x04)<<3)
|((tmp1&0x08)<<1)
|((tmp1&0x10)>>1)
|((tmp1&0x20)>>3)
|((tmp1&0x40)>>5)
|((tmp1&0x80)>>7);
printf("converted char is: %c\n", tmp2);
return 0;
}
5. C語言常用詞彙及函數有那些
常用詞彙:
1、short:修飾int,短整型數據,可省略被修飾的int。
2、long:修飾int,長整型數據,可省略被修飾的int。
3、long long:修飾int,超長整型數據,可省略被修飾的int。
4、signed:修飾整型數據,有符號數據類型。
5、unsigned:修飾整型數據,無符號數據類型。
6、restrict:用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式。
7、return:用在函數體中,返回特定值(如果是void類型,則不返回函數值)。
8、continue:結束當前循環,開始下一輪循環。
9、break:跳出當前循環或switch結構。
10、goto:無條件跳轉語句。
11、if:條件語句,後面不需要放分號。
12、else:條件語句否定分支(與if連用)。
13、switch:開關語句(多重分支語句)。
14、case:開關語句中的分支標記,與switch連用。
15、default:開關語句中的「其他」分支,可選。
常用函數:
1、int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z'),返回非0值,否則返回0。
2、int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9'),返回非0值,否則返回0。
3、int abs(int i) 返回整型參數i的絕對值。
4、double cabs(struct complex znum) 返回復數znum的絕對值。
5、double fabs(double x) 返回雙精度參數x的絕對值。
6、long labs(long n) 返回長整型參數n的絕對值。
6. linux環境下,用c語言,怎麼把文件從磁碟中讀到cache里
在C語言上層編程中 是沒有cache這個概念的
只有內存
你把文件讀到內存就可以了
不大的話,就是直接在cache裡面了。 系統會自行分配的。
7. 求一個用c語言寫的 cache
最難得不是回答網路知道中的問題 而是弄清閣下的意思
8. c語言chache是什麼意思
您說的是cache吧,緩存。
存儲器的高速緩沖存儲器存儲了頻繁訪問的 RAM 位置的內容及這些數據項的存儲地址。當處理器引用存儲器中的某地址時,高速緩沖存儲器便檢查是否存有該地址。如果存有該地址,則將數據返回處理器;如果沒有保存該地址,則進行常規的存儲器訪問。因為高速緩沖存儲器總是比主RAM 存儲器速度快,所以當 RAM 的訪問速度低於微處理器的速度時,常使用高速緩沖存儲器。
9. C語言二進制文件的讀取問題
C語言中二進制文件的讀取要用fread和fwrite來實現。
fwrite()與fprintf()是不同的。
fwrite將寫入的數據作為文件的磁碟內容保存。fprintf將寫入的數據的每個字元所對應的ASCII碼作為文件的磁碟內容保存。fprintf做了一個轉換的工作。
當打開文件時,記事本會自動把文件的磁碟內容作為ASCII碼轉換成對應的字元,然後再顯示出來,即顯示的是文本內容而不是磁碟內容。
例如,用fwrite向文件寫入「65」時,文件的磁碟內容就是保存的65(磁碟上以二進製表示)。當用記事本打開文件時,記事本會讀到65,並把65看作一個ASCII碼,再把對應的字元「A」顯示出來。因此屏幕上看到的文本內容是「A」。
而用fprintf向文件寫入「65」時,文件的磁碟內容保存的是「6」和「5」這兩個字元對應的ASCII碼,分別是54和53。因此文件的磁碟內容是54和53。當用記事本打開文件時,記事本讀到54,就顯示出對應的「6」。再讀到53,就顯示出對應的「5」。
10. C語言如何學到巔峰
因為我沒學到巔峰,所以我不知道怎麼直接回答你的問題,不過要真的想把C語言學好,記住一句話:深入底層!
你不僅要對C語言本身的語法要了如指掌,不會出現各種語言錯誤,在這個的基礎上要對計算機的體系結構有較為深入的了解,比如CPU的原理,內存的讀寫,cache的原理。另外對NUIX也要有所了解,因為C語言是因為NUIX而生的,二者相輔相成。對於匯編語言你最好要精通,了解從C語言到匯編語言的這個過程,這一步你最好看看《the
c
programming
language》,這本書是C語言的設計者寫的,他利用C語言把UNIX重寫了一遍,確立了C語言的至高地位!
其他的相關知識還有編譯原理、數據結構之類的,你要想看我可以推薦兩本《編譯原理》,這本你直接搜「龍書」就行了,另外一本就是《演算法導論》。
說白了,要成為C語言高手,就必須對計算機的主幹技術有一個深入認識,這不是一朝一夕可以練就的,需要深入的思考,持久的耐心還有豐富的實踐經驗,既然你有這么遠大的理想,那我希望你可以靜下心,好好的去研究,說不定有一天你的C語言真的就達到了巔峰!
好了,就這么多,不知道這樣算是回答了你的問題了么?