about Sdsoc_examples

網址:https://github.com/Xilinx/SDSoC_Examples/tree/master/cpp/getting_started

一、Array_partion
1:zero_copy-->Which has Direct Memory Interface with DDR and PL(AXI-master),以前以爲只有讀+寫型數組纔可用zero_copy放在共享區,原來只讀型數組也可以!
2:硬件函數內部的local memory是由BRAM(最多兩個端口:一個時鐘最多訪問2個位置)實現的!一般將only-read型數組從DDR內burst read給local memory(支持隨機訪問);將結果寫給local memory,然後一次性burst write給結果形參。書上和例子中都推薦這麼做。(好像對形參是DDR的才推薦burst read/write?)
3:對每一個for循環,只要loop bound是形參變量,都要使用LOOP_TRIPCOUNT(哪怕兩個for使用同一個變量,那麼也要LOOP_TRIPCOUNT兩次)(如果使用assert是否只要一次?)
4:PIPELINE下級的loops都會自動unroll。但因爲A and B are local memorys(DRAM),max port is 2.所以arraypart3不可能自動unroll completely,而是自動unroll 2 times.

arraypart1: for (int i = 0; i < mat_dim; i++) {
#pragma HLS LOOP_TRIPCOUNT min=64 max=64
	arraypart2: for (int j = 0; j < mat_dim; j++) {
	#pragma HLS LOOP_TRIPCOUNT min=64 max=64
	#pragma HLS PIPELINE
	    int result = 0;
	    arraypart3: for (int k = 0; k < MAX_SIZE; k++) {
		result += A[i][k] * B[k][j];
	    }
	    C[i][j] = result;
	}
}


二、burst read and write
1:burst-->到底怎樣才叫burst,看第一個例子我以爲是將DDR中的數組與local memory直接的讀/寫才叫burst read/write,但是這個例子不是local memory:

void vec_incr_accel(int *in, int *out, int size, int inc_value){
    calc_write: for(int j=0; j < size; j++){
    #pragma HLS LOOP_TRIPCOUNT min=1 max=2048
    #pragma HLS PIPELINE
        out[j] = in[j] + inc_value;
    }
}

所以應該是DDR中的數組in/out只要是使用類似上述結構read/write都叫burst read/write!

三、custom data type
1:struct-->struct裏類型之和一定要是32bit的整數倍!這樣能高效率的訪問全局變量!所以當自定義的struct不到32bit時一定要湊到32bit,哪怕多增加一個元素

typedef struct RGBcolor_struct
{
  unsigned char r;
  unsigned char g;
  unsigned char b;
  unsigned char pad;
 } __attribute__ ((packed, aligned(4))) RGBcolor;


四、direct connect
1:access_pattern:默認是RANDOM,只有指定爲SEQUENTIAL纔是流形式訪問(從這個例子的註釋看也意味着在DDR中)?!
2:burst_write:因爲這個例子direct connect與第一個例子array partition都有對乘法的加速,不同之處是array partition中write時是從local memory寫道DDR的;而這個例子是直接寫到DDR,沒有使用local memory。我將這兩個例子的乘法硬件函數的輸入數組大小都設置成64x64,差別就是第一個例子使用zero_copy優化且使用了local memory進行read/write;而這個例子使用的是access_pattern:SEQUENTIAL優化,只使用了local memory來read,沒有使用local memory來write而是直接write。
    當我重新編譯並比較這兩個函數的報告:函數1的HLS報告latency是12883個時鐘,Data motion network 報告的Accelerator Callsites中的Data mover setup time是976,transfer time是14005540;函數2的HLS報告latency是8201個時鐘,Data motion network 報告的Accelerator Callsites中的Data mover setup time是1112,transfer time是28524。
    我以爲第二種方法使用了流,傳輸會更快,好像報告顯示也是這樣哦;我以爲第一種方法全部使用了local memory那麼函數HLS報告中時鐘應該更少,可是卻顯示更多?!那些官網文檔不是都很提倡使用local cache嗎說這樣很快啊?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章