검색결과 리스트
분류 전체보기에 해당되는 글 83건
- 2013.02.23 Flash Memory 쪽의 기본
- 2013.02.15 H.264/AVC Prediction_3
- 2013.02.15 H.264/AVC Prediction_2
- 2013.02.15 H.264/AVC Prediction_1
- 2013.02.14 H.264/AVC intro 2
- 2013.02.13 Verilog Vector and Arrays
- 2013.01.30 verilog inout 2
- 2013.01.30 SRAM timing diagram
- 2013.01.29 SIMD
- 2013.01.29 verilog $setup, $hold, $width
글
Flash Memory 쪽의 기본
아 잠온다....
피곤해 ㅠ
ㅋㅋㅋㅋㅋㅋㅋㅋ
NAND flash는 전통적인 disk에 비해 높은 random access speed와 low power, random read 시간이 짧다는 점에서 각광받고 있음 ㅇㅇ
NAND flash에 대한 연구는 기본적으로
1. Internal research : flash 자체를 연구를 해서 write 속도를 늘리는 데에 초점
2. external research : 주로 flash 를 memory와 disk 사이의 I/O-latency gap cache, 그렇기 때문에 caching algorithm 이 high penalty of write나 flash 의 life time 을 늘리는데 많이 관여를 하게 돠ㅣㄴ다
이것은 NAND Flash의 다음과 같은 특성때문인데....
1. Overuse 로 인해서 memory가 wear_out 이 된다. 그걸 막아주는게 wear-leveling 이다.
2. Disparity in latency : read 하는데 몇십 마이크로 세컨이 걸리는 반면 write 하는데 몇백 마이크로 세컨이 걸린다. read에 비해 write가 10에서 40배 더 걸린다. 이로 인해 발생하는 Performance degradation 해결!
3. Occupied block 에 write를 할 경우 먼저 다 copy를 한 다음 erase를 하고 modified 된 정보를 write 해 준다.
'Learning stuff' 카테고리의 다른 글
NAND FLASH_읽기,쓰기 (0) | 2013.02.24 |
---|---|
NAND FLASH_특징 (0) | 2013.02.23 |
H.264/AVC Prediction_3 (0) | 2013.02.15 |
H.264/AVC Prediction_2 (0) | 2013.02.15 |
H.264/AVC Prediction_1 (0) | 2013.02.15 |
설정
트랙백
댓글
글
H.264/AVC Prediction_3
아까 하던 Prediction 계소옥
●Inter-prediction의 전체적인 순서
◆interpolate the picture(s) in the DPB(Decoded Picture Buffer) to generate 1/4-sample position in the luma component and 1/8-sample positions in the chroma components.
◆Choose an inter prediction mode : reference picture, block size, prediction type
◆Choose motion vector
◆Predict the motion vectors from already transmitted motion vectors : motion vector difference 생성
◆Code (the macroblock type, choice of prediction reference, motion vector difference, residual)
●Interpolating and divide reference pictures
◆움직임 보상 예측을 할 때 정수화소 이하의 화소정밀도 신호(1/4, 1/8-pixel resoultion)는 참조픽처의 화소값들간의 보간을 통해 생성한다.
◆inter-prediction 의 단위는 저번에도 말했다 싶이 Macroblock 이고 이것은 상황에 따라 submacro-block 으로 나뉘어 질 수 있음. 물론 이 과정은 서로 비교해보고 더 이득을 보겠다 싶은걸로 가져감
●Motion vector prediction
◆ 시작하기에 앞서 motion vector 가 필요한 이유에 대해서 생각해보아여. 당연한 것이지만 헤깔림..... 특히 B-frame 같은 경우 무엇을 어떻게 참조하길래 2개나 참조하는것일까? 3개는 안될까? 이런거... 여튼 다음그림
◆Motion vectors for neighboring partitions are often highly correlated and so each motion vector is predicted from vectors of nearby.
◆먼저 same block size 의 경우는 다음과 같이
◆16*8 일 경우 upper block 은 B에서 lower block 은 A에서
◆8*16 일 경우 left block은 A에서 right block은 C에서
◆B block 에서 motion vector prediction 하는 방법
▲Bipredicted motion vector prediction
-두 reference frame이 각각 past 와 future 인 경우
two vectors are predicted from neighboring motion vectors that have the same temporal direction (transmission 되는것은 prediction한것과의 차이값 각각 2개)
-두 reference frame이 둘다 past 거나 둘다 future 인 경우( 잘 모르겠음... )
one vector(from list 0) is predicted from neighboring motion vectors and the other vector(list1) is predicted from the differentail vector (transmission 되는것은 prediction 한것과(list0) 차이값 한개와 그 prediction 한거와 실제 값의 차이)
▲Direct mode motion vector prediction
- No motion vector is transmitted for B slice macro block.
- 시간 직접 예측 모드에서는 앵커픽처에서 부호화대상블록과 같은 위치에 있는 블록의 움직임 벡터를 스케일링하여 2개의 움직임 벡터를 구한다..... 말로 들으니까 뭔말인지 한개도 모르겠지?
-시간 직접예측 (temporal direct mode)는 위와 같은 방법으로 구하기 때문에 일정한 속도를 가지는 물체를 나타내는 영상에 좋다.
- 공간 직접 예측 모드에서는, list0 and list1 vectors of neighboring previously coded macroblocks or partitions in the same slice are used to caculate the list 0 and list 1 vectors of current MB or partition.
●Motion compensated prediction
◆One reference : 그냥 한다.......
◆Two references : biprediction
보통 두개의 motion vector 로 가져온 값의 평균값을 취한다.
◆Weighted prediction : 여기저기서 엄청 새로운것처럼 설명해놨지만, 별거 아니다. 이때까지 그랬듯이 Temporal distance 가 있을 경우 weight를 취해서 prediction 을 해준다.
▲Explicit mode : weight W0 또는 W1 그리고 차분값(offset) D를 준다
▲Implicit mode : 안준다 구해라
막 복잡해 보이진만 x,y 그래프 위에서 1차 extrapolation 또는 interpolation 한거임(temporal distance 만큼 떨어진 점 두개주고 한 점을 구하여라)
'Learning stuff' 카테고리의 다른 글
NAND FLASH_특징 (0) | 2013.02.23 |
---|---|
Flash Memory 쪽의 기본 (0) | 2013.02.23 |
H.264/AVC Prediction_2 (0) | 2013.02.15 |
H.264/AVC Prediction_1 (0) | 2013.02.15 |
H.264/AVC intro (2) | 2013.02.14 |
설정
트랙백
댓글
글
H.264/AVC Prediction_2
● Inter-prediction
Inter-prediction is the process of predicting a block of luma and chroma samples from a picture that has previously been coded and transmitted, reference pictures.
Previously coded picture 들은 그럼 어디에 있느냐 Decoded Picture Buffer 에 있다. 그러므로 먼져 frame의 종류와 구조부터 봐야할것 같음
● Frame 의 종류 : I-frame, P-frame, B-frame
◆ I-frame : Intra-frame 은 다른 이미지를 참조하지 않고, 독립적으로 해독이 가능한 독립형 프레임이다. 항상 처음 프레임은 I-frame 이 어야하고, 아마 우리가 되감기나 빨리감기할때 돌아가는 단위가 있자나..... 난 분명 45초부터 보고 싶은데 42초에서 50초 사이에는 42초 부터 밖에 실행이 안되는거.... 경험이 있을거라고 생각하다. 어쨌든 이런거나 전송된 비트스트림이 손상되었을 경우 재동기화 지점, 새로운 클라이언트가 스트리밍 시청에 참여하였을때 등등 시작점의 기능으로서 사용된다.
◆ P-frame : Predictive-frame 은 이전의 I-frame 이나 P-frame을 참조하여 부호화 하는 프레임이다.
◆ B-frame : Bi-Predictive Inter-frame은 이전의 참조프레임이나 이후의 참조프레임 2개를 모두 참조해서 부호화하는 프레임이다.
● H.264 Overview 는 다음과 같다. 아... 물론 여기서는 Decoding 쪽에 초점을 두어서 ㅎㅎ
● inter-prediction 을 decoding 할때! Decoding order와 실제 Display order 가 다르다는 것이다.
◆ Decoding order : The order in which a video decoder should process the coded picture (frame_num)
◆ Display order : The order in which a video is displayed. Determined by Top_Field_Order_Count , Bottom_Field_Order_Count. (Top_Field_Order_Count + Bottom_Field_Order_Count = Picture_Order_Count)
◆Display order 에 따라서 다음과 같이 나뉘고 그에 따른 표 (Type 3 생략)
◆ Prediction 대상 frame 은 B 냐 P 냐에 따라서 Previously decoded picture 을 참조하게 되는데 이 참조되는 picture 들은 그 전에 list0 과 list1 로 미리 분류되어 저장되어 있다. P는 list 0 을 B 는 list0 과 list1 의 데이터를 모두 참조한다. list0 과 list1 이 나뉘어지는 기준은 다음과 같이 되어있긴한데 솔직히 먼말인지 몰갓음...... ㅠ
- List 0 defaults to prediction from the most recent 'past' picture in display order
- List 1 defaults to prediction from the nearest future picture in display order
'Learning stuff' 카테고리의 다른 글
Flash Memory 쪽의 기본 (0) | 2013.02.23 |
---|---|
H.264/AVC Prediction_3 (0) | 2013.02.15 |
H.264/AVC Prediction_1 (0) | 2013.02.15 |
H.264/AVC intro (2) | 2013.02.14 |
Verilog Vector and Arrays (0) | 2013.02.13 |
설정
트랙백
댓글
글
H.264/AVC Prediction_1
Prediction을 소개하는 한 글을 보면 이런 부분이 나온다.
The reason for the widespread adoption of H.264/AVC is its compression performance and that peformance gain compared with previous version is mainly due to H.264/AVC's efficient prediction methods.
그렇다. Prediction은 중요한거시였다. 나중에 보면 알겠지만 얘들 할수있는 것들은 모조리 다 prediction 하려고 한다. 심지어 motion vector나 intra-prediction mode도 prediction으로 데이터를 줄이려고 한다. 독한놈들이다. 여튼 그래서 Prediction.
1. Intra-prediction : using data within the current frame.
2. Inter-prediction : using data which come from the previously coded frames.
두 종류에 대한것들이다
●Macro block 이란
◆16*16-pixel 의 region of the frame. Basic unit for motion compensated prediction(MPEG-1,-2,-3,-4, H.261, H.263, H.264)
◆거의 4:2:0 format 이다. 즉 256(16*16) luminance sample 들이 네개의 8*8 sample block에 있고 각각 64개의 red chrominance samples, blue chrominance samples 들이 한 8*8 sample block 에 있다.
◆3개의 macro block : I macro block, P macro block, B macro block.
◆ I macro block : predicted using intra-prediction from neighbouring samples in the current frame.
◆ P macro block : predicted from neighbouring samples in a previously-coded frame.
◆ B macro block : predicted from samples in one or two previously-coded frames.
●Intra prediction 이란
◆block 안이나 해당 block 과 인접한 block 들과의 correlation 이 높다는 점을 이용함
◆block size : 16*16, 8*8 , 4*4
◆당연히 block size가 작으면 more accurate, less residual data, more required bit for choice of prediction 크면 less accurate, more residual data, less required bit for choice of prediction
상황에 따라서 적절히 씀...예시는 다음과 같음
◆ 총 9개의 예측 모드가 있고 그것들은 다음과 같음
※참고로 많이 쓰는 mode 일수록 작은 숫자의 mode로 할당하였다고 함. 그래.
◆ 예를 들어 예측모드 4 같은 경우에는 다음과 같이 됨
◆ 중요한건 아니지만 부호화가 안된화소..... 설명하기 귀찮다 그림으로 대체
◆ 여기까지가 block 내에서의 prediction 이다. 그리고 block 끼리 prediction mode도 prediction 한다.
◆ current block 의 prediction mode 가 이웃한 블록의 prediction mode 와 high correlation을 가진다는 점을 이용하였다. 다음 그림과 같이.....
◆부호화의 순서는 다음과 같고 그 이유는 따라가다 보면 알게 되어있다. 예를들어 3을 prediction 하려면 2와 1이 필요하고 2와 1을 prediction하려면 1이 필요하기 때문에 저런식으로 한다.
◆예측모드 flag(pre_intra_pred_mode)가 1이면 예측한 값이 맞다는 의미라서 그냥 쓰고 0이면 예측한값이 실제값과 틀렸다는것을 의미하며 실제 값(9가지 mode중 예측한 1가지 값을 뺀 8가지 값)을 나타내는 예측모드 flag(rem_intra_pred_mode)를 전송하여 준다.
'Learning stuff' 카테고리의 다른 글
H.264/AVC Prediction_3 (0) | 2013.02.15 |
---|---|
H.264/AVC Prediction_2 (0) | 2013.02.15 |
H.264/AVC intro (2) | 2013.02.14 |
Verilog Vector and Arrays (0) | 2013.02.13 |
verilog inout (2) | 2013.01.30 |
설정
트랙백
댓글
글
H.264/AVC intro
●H.264 란
H.264란 압축방식의 규격 이름입니다. (통칭적으로는 CODEC) MPEG(Moving Picture Experts Groups) 에서 영상 표준 압축방식을 개발했는데요 이것과 따로 ITU-T Video Coding Experts Group 에서 H.263이라는 표준 방식을 사용하고 있었어요. 근데 따로 만들다가 둘이 눈맞아서 JVT(Joint Video Team) 이라는 그룹을 형성 하여 H.264로 통일한거에요. 그래서 MPEG 에서는 MPEG4-AVC(Advanced Video Coding)으로 불리고 ITU 에서는 H.264라고 불리기 때문에 H.264/AVC로 부른답니다.
●H.264의 장단점
화질이 극찬받을만큼 좋은것은 아니지만... 그래도 저번보다는 좋겠지요
장점 : 화질 개선 알고리즘(MPEG과 같이 lossy compression방식은 화질개선 알고리즘이나 복구 알구리즘이 화질에 상당한 영향을 미침), 뛰어난 compression rate
단점 : computation complexity 가 높다 ㅠ(느려느려.... 그래서 이걸 빠르게 하기위해서 시스템 관점으로 보는게 필요한거)
●H.264 압축방식의 포인트는 Entropy coding 을 하기에 용이한 format 으로 만드는 것입니다.
다음 그림이 매우매우 중요함!
위에 그림을 보면 흐미......
Encoder 가 크고 Decoder 은 사실 Encoder 의 한 부분인것을 알 수 있다.
대략적인 과정은 다음과 같다
1. Inter-prediction(Motion Estimation, 서로 다른 프레임 간) 을 해본다 : Motion Vector가 생김
2. Intra-prediction(같은 프레임 안에서) 을 해본다 : Prediction Mode가 생김
3. 두개중 어느것이 나은지 비교해본다 (두개의 residual 을 비교해 본다 : ( <원본 - Motion compensation> vs <원본 - Intra prediction으로 생긴> )
4. 나은거 중에서 선택을하여 Transform, Quatizer, Reorder을 해준다
5. Entropy coding 을 한다.(압축을 한다)
사실 1부터 4까지의 과정은 압축하기 용이한 형태로 만들어주는 과정이라고 할 수 있다.
1) Prediction : 원본 파일과 prediction 을 한 파일의 차이값만 전송한다 : 숫자가 작아진다. 사실 그거보다 더 중요한것은 high frequency info가 줄어든다. 왜냐하면 residual이 생긴걸 보면 삐쭊뺴쭊이 아니라 밋밋한 정보거든
2) Transform : 이 밋밋한 정보를 가지고 transform을 하면 당연히 정보들이 한쪽으로(low frequency) 모이겠지 그러면 0이 모여서 압축하기 좋은 형태가 된다나
3) Quantizer : 애매한 값들을 ROUND 시키는거 (이건 잘 모르겠음 추후에 더 추가)
4)Reorder : low frequency 쪽으로 모인 정보들을 더 모아주는 과정, 0이 연속되어 있으면 압축이 잘되기 때문에 2D 에서 완전히 low frequency => high frequency 순서로 정보를 모아준다.
이 네 과정을 통해서 압축하기 좋게 만들어 주는 것이다.
사실 이 하나하나가 만만치 않은 과정이다. 그러나 대충보면 이러하다는 것이다
'Learning stuff' 카테고리의 다른 글
H.264/AVC Prediction_2 (0) | 2013.02.15 |
---|---|
H.264/AVC Prediction_1 (0) | 2013.02.15 |
Verilog Vector and Arrays (0) | 2013.02.13 |
verilog inout (2) | 2013.01.30 |
SRAM timing diagram (0) | 2013.01.30 |
설정
트랙백
댓글
글
Verilog Vector and Arrays
오늘 누가 물었는데 갑자기 생각하니까 헷깔리더라고
- Arrays, Vectors and Memories
Verilog supports three similar data structure : Arrays, Vectors, Memories.
Arrays : objects of same type.
Vectors : represent multi-bit busses
Memories : array of vector reg
'Learning stuff' 카테고리의 다른 글
H.264/AVC Prediction_1 (0) | 2013.02.15 |
---|---|
H.264/AVC intro (2) | 2013.02.14 |
verilog inout (2) | 2013.01.30 |
SRAM timing diagram (0) | 2013.01.30 |
SIMD (0) | 2013.01.29 |
설정
트랙백
댓글
글
verilog inout
inout are actually "wire" so we can't use any procedural assignments. we need to use continuous
assignments.
inout a,b;
input wire enable;
wire a_out, b_out;
wire a_in, b_in;
//output assignment of inout port
assign a = (enable) ? a_out : 1'bz;
assign b = (enable) ? b_out : 1'bz;
//input assignment of inout port
assign a_in = (enable) ? a : 1'bz;
assign b_in = (enable) ? b : 1'bz;
'Learning stuff' 카테고리의 다른 글
H.264/AVC intro (2) | 2013.02.14 |
---|---|
Verilog Vector and Arrays (0) | 2013.02.13 |
SRAM timing diagram (0) | 2013.01.30 |
SIMD (0) | 2013.01.29 |
verilog $setup, $hold, $width (0) | 2013.01.29 |
설정
트랙백
댓글
글
SRAM timing diagram
메모리에서 가장 간단한 SRAM 부터 시작욥
SRAM 의 Timing diagram 은 아주 간단한 편이다.
Here, I will ignore the setup time for address and data.
For write, we should set up the address and data on the A , D. And then we should generate the writing pulse which is long enough for the write access time.
For read, we should disassert the writing operation (W) and we should assert reading operation. Once we assert read operation, the memory start to give some data. But until we give the right address that we want to access, memory would give garbage data. If we present the specific address that we want to access, valid data will be available at the output after a delay of the Write Access Time Also after we change the address, data bus maintain the data during Output hold time.
'Learning stuff' 카테고리의 다른 글
Verilog Vector and Arrays (0) | 2013.02.13 |
---|---|
verilog inout (2) | 2013.01.30 |
SIMD (0) | 2013.01.29 |
verilog $setup, $hold, $width (0) | 2013.01.29 |
Cache Optimization (0) | 2013.01.25 |
설정
트랙백
댓글
글
SIMD
기글 하드웨어 특성상 소프트웨어 보단 하드웨어를 전문적으로 다루시는 분들이 많을 것입니다. 이 글은 x86의 SIMD 명령과 SIMD 명령의 개략적 원리 및 프로그래밍에 대해 설명하고 있습니다. 약간의 프로그래밍 지식이 필요한데, 아무 프로그래밍 언어 하나를 해보셨다면 이해하기 수월하실 겁니다. (암드 쪽은 철저히 배제했습니다. 왜냐면 제 맘이거든요. 3DNow!, SSE4a, SSE5쪽은 직접 문서를 참조하시기 바랍니다.)
1. SIMD란?
SIMD란 Single Instruction, Multiple Data의 약자로 Flynn의 컴퓨터 분류법에서 단일 명령으로 다중 데이터를 처리하는 컴퓨터를 일컫습니다.
SIMD는 대량의 데이터를 하나의 명령으로 한 번에 처리합니다. 쉽게 이야기 하면 세단과 덤프트럭의 비교라고 볼 수 있는데, 덤프트럭과 세단이 같은 속도로 달릴 수 있다고 치면 덤프트럭이 훨씬 더 많은 데이터를 담아갈 수 있는 이치와 같습니다.
이런 SIMD 구조의 명령(instruction)을 프로세서에 도입함으로써, 설계자들은 프로세서의 처리능력을 강화시키려 했습니다. 인텔의 경우 펜티엄 프로세서에 도입 된 MMX(MultiMedia eXtensions)을 시작으로 펜티엄 III에 도입된 SSE(Streaming SIMD Extensions), 샌디 브릿지에 도입된 AVX(Advanced Vector eXtensions)가 있고, 요즘 잘나가는 스마트 폰에 들어가는 ARM 코어에는 NEON이라는 명령이 있습니다.
2. 스칼라와 벡터
스칼라와 벡터는 수학/물리시간에 들어볼 법한 용어입니다. 컴퓨터에서도 사용되는 용어인데, 스칼라(scalar)는 임의의 타입(데이터 유형)을 갖는 단일 변수를 의미합니다. 즉, 일반적으로 우리가 변수라 부르는 것들은 모두 스칼라 데이터로 보시면 됩니다. 벡터(vector)는 임의지만 동일한 타입을 갖는 변수들의 모임을 의미합니다. 즉, 동질성 배열을 의미하는데, 일반적으로 여러 프로그래밍 언어에서 사용하는 배열과 의미가 같다고 보시면 됩니다.
3. SIMD 명령은 왜 필요한가?
SIMD 명령은 벡터 처리 성능을 끌어올리기 위해 만들어진 명령이라고 생각 하시면 쉽습니다. 어차피 스칼라 처리를 위하는데 굳이 SIMD가 필요할까요? 프로그래밍을 조금이라도 해보신 분은 알겠지만 배열의 데이터를 쉽게 처리하기 위해선 반복문을 필요로 합니다. 반복문은 스칼라 단위로 데이터를 처리합니다. 편의상 C언어(조금 더 정확하게는 C++)의 for문을 예로 들어보겠습니다.
float arr_a[4] = {1.0f,2.0f,3.0f,4.0f};
float arr_b[4] = {5.0f,6.0f,7.0f,8.0f};
float arr_c[4] = {0.0f};
for (int i = 0; i < 4; ++i)
arr_c[i] = arr_a[i] + arr_b[i];
다음과 같은 코드가 있습니다. arr_a, arr_b, arr_c라는 3개의 배열이 있고 이 배열은 각각 4개의 원소를 갖습니다. arr_a와 arr_b 배열에 있는 값을 각 인덱스끼리 대응하여 더한 다음 arr_c의 인덱스에 정확히 대입합니다. 즉, 다음 일러스트와 같은 과정을 거치게 됩니다.
그런데 위의 반복문은 스칼라 단위로 처리합니다. 즉, 덧셈을 4번을 반복하는 것입니다. 계산량이 적어서 별 것 아니라고 생각 하실 수도 있겠지만 스칼라 단위로 처리를 하게 되면 그만큼 다음과 같은 손해가 옵니다.
① 반복문은 반복 조건을 검사해서 탈출 판단을 해야 하므로 분기문(i < 4)을 사용합니다. 반복 횟수가 늘어나면 분기 횟수도 비례해서 늘어납니다. 그만큼 처리해야할 명령 수가 많아질뿐더러, 비록 분기 예측능력이 매우 좋아졌다지만 분기문은 프로세서 특성상 자주 사용되면 그만큼 성능에는 좋지 않은 영향을 끼치게 됩니다.
② 반복문의 조건 평가를 위해 증가식(++i)이 사용되는데, 반복 횟수가 늘어나면 증가식 처리 횟수 또한 비례해서 늘어납니다. 그만큼 처리해야할 명령 수가 늘어납니다.
전통적인 반복문은 이런 문제 때문에 성능을 끌어올리는데 걸림돌이 되곤 합니다. 그래서 프로세서 개발자들은 SIMD라는 아주 좋은 방법을 떠올렸습니다. SIMD는 그렇다면 어떤 점이 다를까요? 역시 프로그래밍 소스로 보겠습니다. 다음은 x86의 SSE 명령을 이용한 코드입니다.
__declspec(align(16)) float arr_a[4] = {1.0f,2.0f,3.0f,4.0f};
__declspec(align(16)) float arr_b[4] = {5.0f,6.0f,7.0f,8.0f};
__declspec(align(16)) float arr_c[4] = {0.0f};
__asm{
movaps xmm0, arr_a
movaps xmm1, arr_b
addps xmm0, xmm1
movaps arr_c, xmm0
}
어? for문이 아닌 이상한 코드가 들어갔습니다. 게다가 __declspec 또한 뭘까요.
먼저 declspec부터 설명하겠습니다. __declspec(align(16))은 지정한 배열을 할당 할 때, 16바이트 단위로 정렬(alignment)시켜서 할당 해달라는 의미입니다. 32비트 환경 기준으로 16바이트 단위로 할당할 경우, 이를 16진수로 주소를 나타내면 0x1234567X에서 X의 값이 무조건 0이라는 의미로 보시면 됩니다. 굳이 정렬 옵션을 안 넣고도 SIMD를 사용할 수 있으나 정렬을 하고 안하고의 성능이 최대 10%까지 차이나기도 하기 때문에 조금 귀찮아도 안 쓸 이유가 없죠. 결론은, 성능 때문에 저리 한 것입니다.
실제 SIMD 코드는 __asm이라는 중괄호 안에 들어있습니다. 프로그래밍 언어상에선 SIMD를 지원하지 않기 때문에 프로세서의 고유 명령의 경우엔 이런 식으로 직접 어셈블리어로 코딩해야 합니다. 물론 이게 100% 정확한 말은 아닙니다. 일반적으로 프로세서 제조사에선 프로그래밍 난이도를 낮추면서 컴파일러의 도움을 받게 하기위해 인트린직(intrinsic)이라는 함수들을 지원합니다. (다만 모든 인트린직을 완전히 다 쓰려면 인텔에서 만든 컴파일러가 필요합니다. 비주얼 스튜디오 2010의 경우엔 대부분 인트린직 사용이 가능했습니다.)
어셈블리어를 직접 사용하는 건 컴파일러의 특성을 타게 되므로 되도록 인트린직을 권하는 바이나 여기선 설명을 위해 직접 어셈블리어를 썼습니다. 다음 4줄이 그 어셈블리어입니다.
movaps xmm0, arr_a
movaps xmm1, arr_b
addps xmm0, xmm1
movaps arr_c, xmm0
xmm이라는 이름을 가진 것은 레지스터 이름입니다. 32비트 환경 기준으로 xmm0 ~ xmm7까지 총 8개가 존재합니다. movaps는 move aligned packed values를 뜻하는데, 즉 xmm0 레지스터가 한 번에 담을 수 있는 단위만큼 묶어서 데이터를 복사하겠단 뜻입니다. (오른쪽에서 왼쪽으로 전달됩니다.) 다루는 단위가 스칼라가 아니라 훨씬 더 큰 단위를 복사합니다.
둘째 줄은 똑같은 명령이니 설명을 생략하겠습니다. 실제 덧셈을 하는 명령은 addps(add packed values)입니다. 다른 아무것도 없이 명령 하나로 xmm0와 xmm1에 들어있는 내용을 수직으로 더해서 xmm0에 넣어줍니다. 반복문으로 4회에 걸쳐서 수행해야 하는 것을 명령 하나로 끝내고 있음을 알 수 있습니다.
이것이 SIMD 명령의 가장 큰 특징입니다. 명령 하나로 다수의 데이터들을 한방에 처리할 수 있죠. 마지막 줄의 movaps또한 생략하도록 하겠습니다. 반대로 생각하시면 되니까요.
그렇다면 SIMD 명령의 장점에 대해서 한번 생각 해 봅시다. 큰 배열의 경우 SIMD를 사용하면 반복문의 반복 횟수가 확 줄어듭니다. 분기문의 비교 횟수도 줄어들고 증가식(혹은 감소식)의 횟수도 줄어들어서 전체적인 성능이 더 나아지게 됩니다. 심심하니 직접 코딩해서 테스트 해보도록 하겠습니다.
좀 차이가 심한가요? 한 1000만번 계산 돌려보니 저런 결과가 나오는군요.. 물론 실제 프로그래밍 할 때는 현실적인 조건 때문에 저 정도의 차이는 잘 안 나옵니다.
4. x86 SIMD의 역사
SIMD가 어떤 원리로 돌아갔는지 대략적으로 배웠으니까 이번엔 x86이 그간 SIMD 명령을 어떻게 확장해 왔는지 살펴보겠습니다. 아마 ARM의 NEON도 큰 차이가 없을 거라고 보는데 자세한 사항은 제가 들은바가 없어서 ^^;
과거 펜티엄 프로세서에 처음 투입된 MMX가 x86 SIMD의 첫 시작입니다.
MMX는 한 번에 묶어서 다룰 수 있는 단위가 64비트였습니다. 64비트 크기로는 스칼라 변수를 8비트 8개, 16비트 4개, 32비트 2개를 다룰 수 있었죠. 하지만 MMX에는 크나큰 약점이 있었는데, FPU 레지스터와 공간을 공유했었습니다. FPU 레지스터는 그 크기가 80비트 였는데 MMX는 상위 16비트를 막고 64비트만 사용 한 것이죠. 어쨌든 이러한 점 때문에 MMX는 FPU와의 협업이 굉장히 힘들었고, 정수 벡터 처리만을 지원했기 때문에 부동소수점 수는 다룰 수 없었습니다.
이후 펜티엄 III에 SSE가 추가되면서 x86의 SIMD 명령에 큰 변화가 오게 됩니다. SSE는 실수 벡터 처리를 지원했고 그 크기 또한 MMX보다 두 배나 큰 128비트였습니다. 게다가 하드웨어적으로 완전히 분리된 레지스터이기 때문에 MMX처럼 FPU를 사용 못하는 문제는 걱정할 필요가 없어졌습니다.(그러나 펜티엄 III의 경우 FPU와 SSE 사이에 실행 자원을 공유했기 때문에 명령 자체는 동 사이클에 파이프라이닝을 통해 실행될 순 없었습니다.)
다만 SSE는 처음에 정수를 지원하지 않았고 이 문제는 펜티엄4에 추가된 SSE2에서 명령어를 확장시킴으로써 해결 했습니다. 따라서 8비트 16개, 16비트 8개, 32비트 4개, 64비트 2개를 처리할 수 있었습니다. SSE2는 정수 명령을 지원함으로써 MMX를 대체했고, 캐시 컨트롤과 메모리 정렬 명령들 몇 가지가 새로 추가됨으로써 연속되는 정보 처리에 좀 더 효율적인 코드를 짤 수 있도록 하였습니다.
이후 펜티엄4 프레스캇에 추가 된 SSE3는 기존의 수직적(vertical)인 데이터 처리구조를 탈피한 수평적(horizontal)인 데이터 처리구조를 지원하였습니다. SSE3 명령 중 addsubps라는 것이 있는데 이 명령의 일러스트를 한번 보죠.
오.. 덧셈만 하는게 아니라 뺄셈하고 덧셈을 번갈아 하고 있습니다. 아까 전에 우리가 본 SIMD 소스에서 addps를 addsubps로 바꾸고 결과물을 보면 다음과 같습니다.
이런 일이 있을 것 같은 조짐을 느끼셨지요?
이 외에 SSE3는 파형계산에 유용하거나 정수 벡터처리 및 하이퍼쓰레딩 지원 프로세서의 성능을 보완해주기 위한 몇몇 명령어가 추가되었습니다.
이후에 마이너한 SSE 명령으로 SSSE3(Supplemental SSE3)가 추가되었는데요. SSSE3는 SSE3의 확장판이라고 보시면 되요. 패키지 단위의 부호 변환이나 절댓값 변환, 셔플(패키지 안에서 스칼라 값의 위치를 뒤섞는 기법) 등이 생겼습니다.
이후에 펜린에 들어서서 SSE4.1, 네할렘에서 SSE4.2가 추가되었는데요. SSE4.1은 주로 수학적인 명령이 추가되었습니다. 두 피연산자의 차의 절댓값을 합하는 연산이라든지, 내적연산 같은 게 말이죠. SSE4.2는 문자열 비교연산과 CRC 명령이 추가 되었습니다.
이번엔 최근에 추가된 샌디브릿지의 AVX를 알아봅시다. AVX는 새로운 레지스터인 ymm이 추가되어 패키지 사이즈가 256비트로 늘었습니다. 그래서 32비트 데이터를 무려 8개나 담을 수 있습니다. 하지만 이놈도 인텔의 장난질에 놀아나는지 당장은 정수 벡터를 지원 하지 않습니다. (128비트까지만 됩니다. 아마 AVX2에서 지원 해줄 모양입니다. 이런..)
AVX의 특징이라면 3-피연산자/4-피연산자 연산의 추가인데, 이는 a = a + b가 아니라, c = a + b가 되어서 피연산자를 세 개/네 개로 지정 할 수 있습니다. 사실 저 피연산자 문제 때문에 SSE에선 프로그래밍 하는 게 약간 불편하긴 했는데 이렇게 바뀌었으니 좋지요. 그리고 여러 줄로 표기해야 하는 명령을 한 줄로 끝내게 되니 실행해야 하는 명령의 수도 줄어듭니다. 좀 더 자세한 글은 링크로 대신 하겠습니다.
5. 맺음말
지금까지 간단하게나마 SIMD에 대한 이해를 해보았는데, SIMD는 데이터 수준 병렬성(Data Level Parallelism)이 많이 나타나는 분야에서 자주 사용되곤 합니다. 주로 영상처리, 파형분석, 행렬, 내적연산 등에서 SIMD의 효과가 잘 드러납니다. 영상 처리라 함은 동영상 처리뿐만 아니라, 샤픈이나 엠보싱 같은 효과를 넣을 때도 행렬 연산을 거치기 때문에 SIMD가 가장 잘 먹히는 영역이죠.
이상으로 SIMD에 관한 이야기를 마치겠습니다.
출처 : gigglehd.com
'Learning stuff' 카테고리의 다른 글
verilog inout (2) | 2013.01.30 |
---|---|
SRAM timing diagram (0) | 2013.01.30 |
verilog $setup, $hold, $width (0) | 2013.01.29 |
Cache Optimization (0) | 2013.01.25 |
matlab index (0) | 2012.12.12 |
설정
트랙백
댓글
글
verilog $setup, $hold, $width
Timing check
- $setup, $hold, $width : 가장 일반적이고 많이 사용하는 timing checking system task
- 언제나 secify block 안에서만 사용 가능하다.
● $setup and $hold checks
- setup, hold : 순차 회로에서 clock의 전후로 data의 최소 유효 시간을 의미한다.
◆ $setup task
Usage : $setup(data_event, reference_event, limit)
-data_event : monitor 하는 신호
-reference_event : data_event 의 기준이 되는 신호
-limit : setup time 필요한 최소 시간
ex) (T reference_event - T data_event) < limit 이면 오류를 보고
즉 data 신호가 늦게 setup 하면 detect!!!!!!!
ex) specify
$setup(data, posedge, 3);
endspecify
◆ $hold task
Usage : $hold(reference_event, data_event, limit)
reference_event : data_event의 기준이 되는 신호
data_event : monitor 하는 신호
limit : holding time
ex) (T data_event - T reference_event) < limit 이면 오류를 보고
즉 data 신호가 reference 신호를 시작으로 얼마만큼 지속(hold) 시키지 못하면 detect!!
specify
$hold(posedge clk, data, 5)
endspecify
◆ $width check
- 펄스의 폭을 check할때 사용하는것
Usage : $width(reference_event, limit);
reference_event : edge-triggered event
limit : 펄스 width 의 최소 시간
-data_event 가 없는 이유는 처음 오는 edge_trigger 다음에 오는 반대 edge_trigger가 data_event 가 되기 떄문이다.
'Learning stuff' 카테고리의 다른 글
SRAM timing diagram (0) | 2013.01.30 |
---|---|
SIMD (0) | 2013.01.29 |
Cache Optimization (0) | 2013.01.25 |
matlab index (0) | 2012.12.12 |
matlab_classdef (0) | 2012.12.12 |