網頁

2017年10月31日 星期二

20171031 GPU

1. Atomics
處理變數在每個thread進行read-modify-write的操作時會有dependency,例如x++。
利用shared memory處理atomicAdd可以減少對global memory重複讀取,增加效能。

2. Stream
cudaHostAlloc()和malloc()不一樣在於malloc()是page host memory,而cudaHostAlloc()是 page-locked (有時稱之為pinned memory)。在run time時,page-locked會讓buffer不會被swapped out到硬碟,會加速記憶體的讀取。最重要是如果今天有兩個stream。假設今天stream0進行kernel運算時,stream1利用cudaHostAlloc()可以讀取非現在kernel運算的陣列不會影響kernel的運算,否則用malloc()可能在kernel會無法使用原本的陣列來運算。

















這種方式會造成copy engine跟kernel engine會有較大空閒時間。














這種方式雖然也會造成copy engine跟kernel engine有空閒時間,但kernel engine比上一種快一格進行,而且stream0和stream1的kernel之間也縮短兩格。












這種方式是最佳的。

所以結論是利用breath-first或round-robin的assignment工作方式到stream是最好的。

2017年10月29日 星期日

20171019

static在C++的種類有五種使用方式

1. Static variable in a file
2. Static variable in a function
3. Static function
4. Static data member of a class 5. Static member function of a class
static在三種scope下有不同功能
1. global
global variable宣告static會讓global scope變file scope,意思是說當兩份cpp檔如果都有相同變數名稱時,他們各自屬於他們file內的變數,彼此之間沒有關係。
2. function
在function裡,local variable宣告static時,不會因為function被回收讓變數也被回收。
3. class
static data member
(i)不管產生多少個相同class的物件,static的members只會複製一份,而且共享給每一個物件。
(ii)不必在class scope內初始化。利用::在class外部初始化,如果沒有,系統會自動初始化為0。
static member function
只能用::access,即使沒有產生物件。
只能access “static” data member,enum, or nested types。
不能access到this pointer

2017年10月26日 星期四

20171026 資結程設

begin是管理記憶體空間的開頭
end是管理記憶體空間的尾
new size_t的倍數
假設A是200 bits
P1=new A
P2=new A[5]
P3=new A[5]
delete []P2

MemMgr的_activeBlock
new一個P2假設產生208 bits
_ptr指向8個bits前面
P2指向200前面

recycle list(RL)
recycle會先找記憶體容量相同的
first要先用型態A的pointer P2強迫轉型成size_t 把前面8 bits減掉還要把值設成0
first指向8個bits後面的位置
delete []P2
delete []P3
前面8 bits用P2指
first=P3指向下一個後面要刪除的200 bits

假設delete []P5 (261 bits)
空間只有255 >end
再要一個_activeBlock

vector<MemTestObj*> _objList;
vector<MemTestObj*> _arrList;deleteObj

delete _objList[ix];
...

_objList[i]? 'o' : 'x' (如果是NULL會印o)

#define toSizeT(t)
假設38 bits會把size變40 (8的倍數)

2017年10月25日 星期三

20171025 計結

EDA playground
https://www.edaplayground.com/

t_Full_Adder.v (testbench)放左邊
Full_Adder.v (module)放右邊
檔案用貼上別upload

Tools & Simulators
Icarus Verilog

Full_Adder FA_1(.a(a), .b(b), .ci(ci), .sum(sum), .cout(cout));
input reg 
output wire

$dumpfile("Full_Adder.vcd");
$dumpvars;
輸出file可以看waveform

initial #1000 $stop;
經過一千個單位時間會停下來

verilog-ex
// Code your design here
timescale 1 ns/ 1 ns

module alu (src_a, src_b, c, data_out);

input [7:0] src_a, src_b;
input [2:0] c;
output [7:0] data_out;

/* implement here */
reg [32:0] temp;
assign data_out = temp[32];

initial begin
if(c == 1) begin
  temp = src_a + src_b;
end
else if(c == 2) begin
  temp = src_a - src_b;
end
else if(c == 3) begin
  temp = src_a & src_b;
end
else if(c == 4) begin
  temp = src_a | src_b;
end
else if(c == 5) begin
  temp = src_a ^ src_b;
end

end


endmodule

20171018 計結

sign extension

rising edge or falling edge

clock cycle

MUX

數位系統

資結程設hw2

1. using C++ implements the terminal state without echo input, like login when asking for the password

參考資料
https://www.svbug.com/documentation/comp.unix.programmer-FAQ/faq_4.html

1. CmdParser cmd
    初始化_readBufPtr(_readBuf), _readBufEnd(_readBuf),_historyIdx(0), _tempCmdStored(false)
2. cmd.readCmd()
    呼叫另一個成員函式readCmdInt(cin) {
        (1) 呼叫另一個成員函式resetBufAndPrintPrompt() {
            初始化_readBufPtr = _readBufEnd = _readBuf;*_readBufPtr = 0;
            呼叫另一個成員函式printPrompt()印出cmd> (初始化和cout可以寫在.h)
        }
        (2) while (1) {
            (a) ParseChar pch = getChar(istr)
                (i) getChar(istream& istr)是一個global function回傳型態是enum
                (ii) 呼叫mygetc(istr)是一個global function回傳型態是ch
                () char mygetc(istream& istr)
                (ii) enum回傳LINE_BEGIN_KEY等字串
            (b) pch == INPUT_END_KEY 離開
            (c) switch (pch)
        }
    }

20171024 GPU

1. Texture memory
    texture memory被cash on chip,比off-chip DRAM更可以減少使用記憶體需求,提供更有效bandwidth。在二維晶格,因為CPU處理周遭晶格時在記憶體無法連續情況下無法被cash together。因此,texture memory非常適合處理"between a cell and neighbors"這種需要讀取周圍記憶體位置的情況,也比前一張使用shared memory的方式來的好。
    以課本例子因為有固定熱流點dev_constSrc,所以在anim_gpu function裡先把常數的部分先copy_const_kernel寫進dev_insrc,然後再呼叫blend_kernel把dev_inSrc覆寫後算出dev_outSrc。利用一維texture<float>或二維texture<float,2>的不同處理方式下,差別在二維會自動處理邊界問題,但兩者效能其實是差不多的。

2. Graphics interoperability
    和之前章節差別在這邊使用多張顯卡讓CUDA結合OpenGL和GLUT calls,不必像前幾章利用CPU執行CPUBitmap,減少使用CPU系統。特別的是,把圖片長寬跟datablock寫到GPUAnimBitmap function引數,會透過initialize讓cudaCHooseDevice自動搜尋適合這張圖的顯卡。

2017年10月18日 星期三

2017年10月10日 星期二

前置處理器 指示詞

Preprocessor directives
前置處理器 指示詞(Preprocessor directives)用#(hash sign)來表示。在編譯開始前,前置處理器會先檢視指示詞。因為前置處理器 指示詞沒有用;(semicolon)做結尾,所以前置處理器只能解析一行code為基準,若超過一行要在末行加上\(backslash)。

macro definitions (#define, #undef)
#define identifier replacement
當前置處理器看到這個指示詞,會將code裡任一個identifier用replacement取代,可以是expression, statement,block或者simply anything。

ex
1
2
3
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
int table2[TABLE_SIZE];

 
#define getmax(a,b) a>b?a:b

1
2
3
4
5
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
#undef TABLE_SIZE
#define TABLE_SIZE 200
int table2[TABLE_SIZE];

function macro definitions兩種特別運算元#和##在replacement。#後面的參數名字會被字串字母的引數取代 (就像是被雙引號框住)。
1
2
#define str(x) #x
cout << str(test);

##連接兩個引數使他們之間沒有空白
1
2
#define glue(a,b) a ## b
glue(c,out) << "test";
參考文獻

2017年10月9日 星期一

linux centos終端機顏色

修改ls顯示資料夾名稱顏色
cp /etc/DIR_COLORS ~/.dir_colors
vim ~/.dir_colors

第59行:DIR 01;34(01:粗體,34:藍色)
修改為:DIR 01;33(01:粗體,33:黃色)

參考資料

改txt亮顯、行號
vi ~/.vimrc

hi Comment ctermfg =blue
set nu

2017年10月6日 星期五

20171005資結程設

map是一種associated container。insert pair(key跟value)後可以利用find輸入key搜尋到相對應value。搜尋法為紅黑樹概念,complexity為log(n)。此外,也可以將key和value進行刪除或清空。
因為map的key不能重複,所以可以使用multimap來允許duplicate key的操作。

參考連結:
http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html

strtok()是將一連串string藉由設定delimiters來分割出個別字串

example
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

使用方法:
在程式裡面會有兩次function call。第一次function call引數(argument)為string,為了擷取這些string,每個string的第一個character(不包含delimiter)被用來當作scan的起始位置。當scan到delimiter時,會分割string而且包含delimiter,然後scan到null character終結function。因為第一個function call有static pointer指向string,所以第二個function call當string被scan到delimiter時,會回傳NULL pointer。

前置處理器運算子(Preprocessor)
運算子動作
字串化運算子 (#)以雙引號將實際對應的引數括住
字元化運算子 (#@)以單引號造成對應的引數會將和視為字元 (Microsoft 專用)
語彙基元帶入的運算子 (##)允許做為實際引數的語彙基元會串連形成其他語彙基元
DEFINED 運算子簡化的語式是否正確文字在某些巨集的指示詞
前置處理器指示詞(Preprocessor Directive)