星期一, 4月 20, 2009

NoneBlock sendfile


一般copy 的狀況下
  1. 從HW 的資料透過DMA 搬移至Kernel
  2. 再從 Kernel 搬至User space,送到Socket 時再搬依次。
  3. CPU Copy x 2 + DMA x 2
使用mmap + write 的狀況:
  • 從HW 的資料透過DMA 搬移至Kernel
  • 直接從 Kernel space 將Buffer搬至Socket buffer。
  • 缺點:當User/Kernel space 兩塊同時操作時須有解決方案,多了sendfile 一次的context switch。
  • 優點:當要送至socket時有sendfile的效能,user space也能存取資料。
  • 花費:CPU Copy x 1 + DMA x 2

使用Sendfile 的狀況:
  • 從HW 的資料透過DMA 搬移至Kernel
  • 直接從 Kernel space 將Buffer搬至Socket buffer。
  • 缺點: User space 無法取得資料。
  • 花費:CPU Copy x 1 + DMA x 2
較佳的方式:
  • 從HW 的資料透過DMA 搬移至Kernel
  • 利用HW support gather 的方式,直接從 socket/kernel dscr pointer 利用DMA gather的方式將資料直送底層。
  • 這個步驟目前還不確定方式,目前看來從AP層好像沒有現成的,要從Driver request DMA channel,setup, start 等動作,要找一下。
    asfd
  • 缺點: 需要HW support。
  • 花費:DMA x 2

DMA的操作,基本上DMA的動作,需要follow HW Handshaking,基本上會跑類似下列流程:

  • request_dma()
  • dma_setup_handlers()
  • dma_config_src()
  • dma_config_dst()
  • dma_setup_single
  • dma_enable
  • ==> wait for transfer complete event
  • dma_disable
  • dma_free
  • MultiBlock 的話還需要設定 setup_sg or setup_mlist








下面例子用以前寫的socket function測試,listen/connect 不列出來了,主要是測試 NoneBlock sendfile 的狀況,以及 EAGAIN 旗標產生的主因。( client/server在同一台機器)

以下四種狀況都會影響到Client side 每次下send 的大小。
  • Client 端 connect target ip = 192.168.1.85 or 127.0.0.1
  • Server端收到就丟棄。
  • Server端收到後存檔。
  • Server端收到後印出收到Size。

Server Side Code:

#include <stdio.h>
#include <stdlib.h>
#include <socketServer.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int fd, times=0;
void callback( int fd, unsigned char *buf, int size ){
// printf("MyFunction:\n FD[%d] str=%s size=%d\n", fd, buf, size );
// printf("[%d] MyFunction:\n FD[%d] size=%d\n", times, fd, size );
// fd = open("server.dat", O_WRONLY | O_APPEND );
// write( fd, buf, size );
// close( fd );
times++;
}

int main( int argc, char ** arg ) {
SOCKET_SERVER server;
int ret;
system("rm server.dat;touch server.dat");
// use User Define Callback
#if 1
ret = server.initServer( 9600, callback );
#else
ret = server.initServer( 9600);
#endif
printf(" server ret =%d\n", ret );

while ( 1 ) {
server.clientList();
sleep(3);
}
return EXIT_SUCCESS;
}



Client Side Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <socketClient.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/sendfile.h>
#include <errno.h>

int main( int argc, char ** arg ) {

SOCKET_CLIENT client;
int ret;
int fd;
//init sock
//ret = client.initClient( "127.0.0.1", 9600 );
ret = client.initClient( "192.168.1.85", 9600 );
if( ret != EXIT_SUCCESS ){
printf("Client create FAIL ret=%d\n", ret );
}

//send mydata
fd = open( "mydata", O_RDONLY);
int times=0;
size_t r;
off_t offset = 0;

struct timeval tv;
fd_set wfds;

while( 1 ){
FD_ZERO( &wfds );
FD_SET( client.m_iFD, &wfds);
tv.tv_sec = 1; tv.tv_usec = 0;
ret = select( client.m_iFD+1, NULL, &wfds, NULL, &tv);
if ( ret <= 0 ) printf("timeout or ret=%d\n", ret );

r = sendfile( client.m_iFD, fd, &offset, 1024*1024);
if( r == 0 ) break;
if( r == -1 ){//&& errno == EAGAIN ){
printf("EAGAIN\n");
continue;
}
printf("[%d]sendfile offset=%d r=%d \n", times,(int)offset, r);
times++;
}
return EXIT_SUCCESS;
}



Run: 可以看到連下兩道後的結果並不相同,但Server端是相同的,且不會出EAGAIN,EAGAIN發生的時機點為連下兩道sendfile才會發生,select 當次即使是送不完也不會發生。也就是說EAGAIN這個flag 是在ret = -1 時產生,buf 裡的位置為0 才會發生。
[root@192 ipSock_noneblock_sendfile]# ./client
[0]sendfile offset=1048576 r=1048576
[1]sendfile offset=2097152 r=1048576
[2]sendfile offset=2179072 r=81920
[3]sendfile offset=2785280 r=606208
[4]sendfile offset=2949120 r=163840
[5]sendfile offset=3112960 r=163840
[6]sendfile offset=3276800 r=163840
[7]sendfile offset=3440640 r=163840
[8]sendfile offset=3604480 r=163840
[9]sendfile offset=3768320 r=163840
[10]sendfile offset=3932160 r=163840
[11]sendfile offset=4096000 r=163840
[12]sendfile offset=4259840 r=163840
[13]sendfile offset=4423680 r=163840
[14]sendfile offset=4538368 r=114688
[15]sendfile offset=4685824 r=147456
[16]sendfile offset=4833280 r=147456
[17]sendfile offset=4964352 r=131072
[18]sendfile offset=5095424 r=131072
[19]sendfile offset=5226496 r=131072
[20]sendfile offset=5554176 r=327680
[21]sendfile offset=5898240 r=344064
[22]sendfile offset=6045696 r=147456
[23]sendfile offset=6193152 r=147456
[24]sendfile offset=6324224 r=131072
[25]sendfile offset=6455296 r=131072
[26]sendfile offset=6586368 r=131072
[27]sendfile offset=6717440 r=131072
[28]sendfile offset=6848512 r=131072
[29]sendfile offset=6979584 r=131072
[30]sendfile offset=7110656 r=131072
[31]sendfile offset=7241728 r=131072
[32]sendfile offset=7372800 r=131072
[33]sendfile offset=7503872 r=131072
[34]sendfile offset=7634944 r=131072
[35]sendfile offset=7766016 r=131072
[36]sendfile offset=7897088 r=131072
[37]sendfile offset=8028160 r=131072
[38]sendfile offset=8159232 r=131072
[39]sendfile offset=8191034 r=31802
[root@192 ipSock_noneblock_sendfile]# ./client
[0]sendfile offset=1048576 r=1048576
[1]sendfile offset=2097152 r=1048576
[2]sendfile offset=3145728 r=1048576
[3]sendfile offset=4194304 r=1048576
[4]sendfile offset=4538368 r=344064
[5]sendfile offset=5586944 r=1048576
[6]sendfile offset=6635520 r=1048576
[7]sendfile offset=7684096 r=1048576
[8]sendfile offset=8191034 r=506938


Conclusion:
  • 查了一下原因,也許跟下面有關,不確定,把wmem_max值加大,當busy時send出去的值就會接近設定的值。
    cat /proc/sys/net/core/wmem_max
    131071
  • 為何要用sendfile
    1.減少TLB cache flush,使用read/write function會導致 cashe 異動。
    2.減少kernel/user space context switch 次數。
    3.Copy 次數減少。
  • 長遠來看 IPCam/ DVR 長時間處理影像傳輸,應該使用第四種方式,減少CPU Loading,除了增加Performance,還可以增加 Client 的 Throughput。

星期二, 3月 10, 2009

必備良藥

2009/3/10(二) 陰
  • library
    • ld-uClibc.so.0
    • libcrypt.so.0
    • libc.so.0
    • libdl.so.0
    • libm.so.0
  • Device
    • console
    • null
    • ram0
    • random
    • urandom

星期一, 3月 09, 2009

Openssl-0.9.8j with Appweb 2.4.2

openssl
  • ./Configure linux-generic32 no-asm shared
  • vi Makefile
    • CC=arm-merlin-linux-uclibc-gcc
    • AR=arm-merlin-linux-uclibc-ar
    • RANLIB=arm-merlin-linux-uclibc-ranlib
    • MAKEDEPPROG= arm-merlin-linux-uclibc-gcc
  • make
appweb :
  • appweb-src-2.4.2/appweb/Makefile 內有 openssl gen key的方式.
  • appweb/server.* 有送現成的可試用, Password=server
  • configure w/ openssl:
    AR=${CROSS}ar CC=${CROSS}gcc LD=${CROSS}ld NM=${CROSS}nm RANLIB=${CROSS}ranlib STRIP=${CROSS}strip CFLAGS="-fno-stack-protector" CXXFLAGS="-fno-rtti -fno-exceptions" ./configure --host=arm-uclibc-linux --enable-shared --disable-static --disable-multi-thread --with-openssl=loadable --with-openssl-dir=${MYPATH}/application/openssl-0.9.8j --with-openssl-iflags=-I${MYPATH}/application/openssl-0.9.8j/include/ --with-openssl-libs=ssl --prefix=${MYPATH}/application/appweb-src-2.4.2/approot
  • configure w/ matrixssl:
    ./configure --with-matrixssl=loadable --with-matrixssl-dir=/your/matrixssldir --with-matrixssl-libs=matrixssl --with-matrixssl-iflags=-I/your/matrixssldir
  • appweb 3.0 alpha 出來了不過跟openssl build的時候有出問題,看起來是 iflags 出錯,--with--xxxx 也有蠻多改變,退回用2.4.2.
  • make 後將lib下的東西copy, lib/module/*Module.so 是module, 非 *Module.so 要移到/usr/lib or /lib 下,不然 *.Module.so 會要動態link 這些非 *Module.so
  • 正確的做法:
    configure 帶 --prefix,用make install 作,再將prefix作出來的copy ,這樣 openssl.cnf, key等都會帶到。

Reference:

星期四, 2月 26, 2009

kdesvn 下關於kernel ignore問題

2009/2/26(四) 陰
關於kernel 有許多 *.cmd , *.mod 不會自動ignore 的問題,此為Make 型態問題,*.cmd.c *.cmd *.mod ...etc 此一類型檔案為runtime 產生,故每一使用者build時都會產生不同path問題,造成build過後會跟svn上不match.
問題:
  • 若要人工去ignore 將花費大量時間。
  • kdesvn無提供rule 套用所有子目錄。
解決方式:
  • ~/.subversion/config,將這個檔裡面下面的注解拿掉,重啟kdesvn即可解決。
    原始:#global-ignores = *.mod.c *.ko *.cmd *.o *.lo *.la
    修改為:global-ignores = *.mod.c *.ko *.cmd *.o *.lo *.la *.mod arm-merlin arm-merlin.build

星期五, 2月 20, 2009

英國經濟學家鄧寧

十九世紀英國經濟學家鄧寧(T. J. Dunning)形容資本運用的一段話:

「一旦有適當利潤,資本就大膽起來;
如果有一○%的利潤,它就保證到處被使用;
有二○%的利潤,它就活躍起來;
有五○%的利潤,它就鋌而走險;
為了一○○%的利潤,它就敢踐踏一切人間法律;
有三○○%的利潤,它就敢犯任何罪行,甚至冒著被斷頭的風險。」

星期三, 2月 18, 2009

LDD Usage

2009/2/18(三) LDD 的簡化版,要看執行程式的動態鏈接簡單的方式: Type1:
  • export LD_TRACE_LOADED_OBJECTS=1
  • unset LD_TRACE_LOADED_OBJECTS
Type2:
  • eval LD_TRACE_LOADED_OBJECTS=1 '/lib/libcrypt-2.1.2.so'

jack@i7-build-server:~/git/titan/magic/web/cgi$ export LD_TRACE_LOADED_OBJECTS=1
jack@i7-build-server:~/git/titan/magic/web/cgi$ ./param.cgi
        linux-vdso.so.1 =>  (0x00007ffd664c5000)
        libmy.so => /lib/libmy.so (0x00007f5e96a7b000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f5e96873000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e964a9000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5e9628c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5e96cd7000)
jack@i7-build-server:~/git/titan/magic/web/cgi$ unset LD_TRACE_LOADED_OBJECTS

星期二, 2月 10, 2009

CUDA

2009/2/10(二) 晴

一間叫 CoreCodec的公司利用 CUDA 開發的 H.264 decoder ,不同於FFmpeg 使用 GPGPU 的資源去Decode。

第四堂課 CUDA 程式開發- 執行緒優化 (446.1 MB) 試聽心得 花費時間: 1:26:00
  • Thread - 每個Thread都會去跑 Kernel Code , Kernel Code(共用的) 是甚麼? 應該是前幾節有提到.
    這部份聽起來是每個Thread都要浪費的。
  • Thread ID - 每個Thread有ID,會去存取自己的 memory. 跑Code.
  • sm * sp = total thread ( SM > Block(每個block是有限制thread數) > SP ).
  • block 及 2D 觀念. 聽起來是正方矩陣,影片中沒人問,到時再問老師看看為啥要正方為啥要矩陣多維(2D/3D)而不用序列。(後段有講到,因流體、影像所要使用的資料為矩陣資料)應該是要搭配資料結構所衍伸的。
  • 同一個block 才能作 barrier sync , 每張顯卡能同時作block 的數量不同,為了跨不同效能的GPU 平台。
  • thread的Code 放進sm , sm 再分進 sp 這個動作誰做的? compiler?
  • n block assigment to sm ?誰做?
  • scheduling
    • 有score board 去選擇要做的 block. HW在做
    • 優先度?

  • G80 下 , dram access time 約要200ms.
  • Warp 的定義其實跟 Pipeline datapath 是相對的。warp 不知怎麼規劃?
  • G80下:shared memory 16kB, Thread互相是無法看到的 16k/block num = 每個
    dynamic partition. 故要多用mem, 就只能少block.
  • warp(32倍數) 跟block size , sm / sp 的分配 四者若分配不良,直接影響到performance.
  • warp 中 critical path 可能存在於memory access.
  • runtime library:
    • common component: sin, cos, pow, sqrt...
    • host component: data transfer/Memory managemen/Error handling.
    • device component: gpu math function.
  • dim3: buildin variable ( C structture ). just predefine data types. (機車勒後面都英文對談, 那個學生問的問題,聽的有點吃力).
  • 2 special function unit. (sfu). pipeline. hw sin/cos cal.
  • syncthread 要注意,全部都要sync 的問題,不然會有deadlock.
  • const var memory有 64k, cache 8k

Reference:

  • SPMD /SIMD

星期六, 2月 07, 2009

時機不好,有可以抽獎就抽了

時機不好,有可以抽獎就抽了

抽獎:

「歡樂抽獎箱」得獎公佈日期:中獎名單將於98年2月20日抽出,98年3月3日前公佈於本行活動網站。
https://www.cathaybk.com.tw/cathaybk/event/200812atm_gh03/1main_01.htm

星期五, 2月 06, 2009

光學顯微鏡

三、光學顯微鏡:
光學顯微鏡可觀察到的最小生命體是細菌(細菌的大小在0.2 至2.0 微米之間)。
放大倍率
放大倍率:影像與物體實際大小之間的比値。
(1)光學顯微鏡的放大倍率=物鏡倍率×目鏡倍率
(2)光學顯微鏡的最高放大倍率約為1,000 至1,500 倍
解像度
解像度:能分辨出兩個獨立物體的最短距離(D 値)
(1)兩獨立物體之間的距離小於D 値→無法分辨出兩者是獨立物體
(2)光學顯微鏡的D 値愈小→解像度愈高
(3)光學顯微鏡的解像度約為0.2 微米(μm)

四、電子顯微鏡:
魯斯卡:1931 年發明電子顯微鏡,可放大一百萬倍→可見0.001μm。
(1)穿透式電子顯微鏡:觀察細胞的內部構造。
(2)掃描式電子顯微鏡:觀察細胞的外部形態。

http://210.60.246.140/bio/PDF/grade1/1.pdf

星期四, 2月 05, 2009

九十七學年度研究生註冊選課須知

九十七學年度研究生註冊選課須知
註冊時間: (轉帳成功者免)

加退選時間:九月十四日前
本系課程開學後不開放網路或語音選課,如欲加退選,請於以選課清單併電腦選課單經指導老師簽名(非授課老師)後交回系辦辦理人工加退選,外系課程請填電腦選課單洽各開課單位,逾期即視選課動作完成。(因部份老師於該時間不在國內,請所屬研究生提前作業)
請各研究生務必上網確認選課資料,即視選課資料完作確認,請自行負責選課結果。
選課注意事項:
碩士班:
1. 核心選修課程需七選三:『高等化工流體力學』、『高等質傳現象』、『高等化工熱力學』、『高等程序控制』、『高等化工動力學』、『高等化工應用數學』、『高等物理化學』
2. 未通過工學院英文鑑定的同學,必需選修『科技英文』,且需70分及格方可畢業,但該科不列入畢業學分。
碩專班:
1.核心選修課程需七選二:『高等化工流體力學』、『高等質傳現象』、『高等化工熱力學』、『高等程序控制』、『高等化工動力學』、『高等化工應用數學』、『高等物理化學』
2. 碩專班二年級開設之『畢業研究報告』課程,暫行由參加各自研究室的討論課替代,該科分數由各指導老師評分。未來碩專班人數增加後再統一上課。
~如有任何問題請洽助理~