SIMD

Learning stuff 2013. 1. 29. 20:24

기글 하드웨어 특성상 소프트웨어 보단 하드웨어를 전문적으로 다루시는 분들이 많을 것입니다. 이 글은 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의 인덱스에 정확히 대입합니다. 즉, 다음 일러스트와 같은 과정을 거치게 됩니다.

simd1.png

그런데 위의 반복문은 스칼라 단위로 처리합니다. 즉, 덧셈을 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 레지스터가 한 번에 담을 수 있는 단위만큼 묶어서 데이터를 복사하겠단 뜻입니다. (오른쪽에서 왼쪽으로 전달됩니다.) 다루는 단위가 스칼라가 아니라 훨씬 더 큰 단위를 복사합니다.

simd2.png

둘째 줄은 똑같은 명령이니 설명을 생략하겠습니다. 실제 덧셈을 하는 명령은 addps(add packed values)입니다. 다른 아무것도 없이 명령 하나로 xmm0와 xmm1에 들어있는 내용을 수직으로 더해서 xmm0에 넣어줍니다. 반복문으로 4회에 걸쳐서 수행해야 하는 것을 명령 하나로 끝내고 있음을 알 수 있습니다.

simd3.png

이것이 SIMD 명령의 가장 큰 특징입니다. 명령 하나로 다수의 데이터들을 한방에 처리할 수 있죠. 마지막 줄의 movaps또한 생략하도록 하겠습니다. 반대로 생각하시면 되니까요.

그렇다면 SIMD 명령의 장점에 대해서 한번 생각 해 봅시다. 큰 배열의 경우 SIMD를 사용하면 반복문의 반복 횟수가 확 줄어듭니다. 분기문의 비교 횟수도 줄어들고 증가식(혹은 감소식)의 횟수도 줄어들어서 전체적인 성능이 더 나아지게 됩니다. 심심하니 직접 코딩해서 테스트 해보도록 하겠습니다.

simd4.png

좀 차이가 심한가요? 한 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라는 것이 있는데 이 명령의 일러스트를 한번 보죠.

simd5.png

오.. 덧셈만 하는게 아니라 뺄셈하고 덧셈을 번갈아 하고 있습니다. 아까 전에 우리가 본 SIMD 소스에서 addps를 addsubps로 바꾸고 결과물을 보면 다음과 같습니다.

simd6.png

이런 일이 있을 것 같은 조짐을 느끼셨지요?
이 외에 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에선 프로그래밍 하는 게 약간 불편하긴 했는데 이렇게 바뀌었으니 좋지요. 그리고 여러 줄로 표기해야 하는 명령을 한 줄로 끝내게 되니 실행해야 하는 명령의 수도 줄어듭니다. 좀 더 자세한 글은 링크로 대신 하겠습니다.

http://gigglehd.com/zbxe/index.php?_filter=search&mid=infoboard&search_target=title&search_keyword=AVX&document_srl=5043210

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

Learning stuff 2013. 1. 29. 20:21

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

Cache Optimization

Learning stuff 2013. 1. 25. 20:35

First of all, cache miss 의 종류

1. Compulsory(강제 미스) : The very first access to a block cannot be in the cache.

2. Capacity(용량 미스) : Cache cannot contain all block which is neccessary during the execution

3. Conflict(충돌 미스) : Because of the placement strategy.

 

Cache를 optimization 시키는 3가지 : hit를 많이 시키자, hit 시켰을때 시간이 많이 걸리지 않게 하자, 설사 miss가 되었더라도 miss penalty를 줄여보자. 입니다

Basic Optimization

1. Reducing hit time (first-level cache)

1) Giving reading priority over Write : Write-back, Write-through cache, write buffer

2) Avoiding address transition during cache indexing : Virtual index physical tag cache

2. Reducing miss penalty (below the first-level cache)

1) Multilevel Cache : Don't need to access memory (First-level cache should be small for the fast clock cycle time)

3. Reducing Miss Rate

1) Larger block size : spatial locality, compulsory misses↓, miss penalty↑, capacity and conflict misses ↑

2) Bigger cache : Capacity miss ↓, hit time ↑, clock speed ↓

3) Higher associativity : Conflict miss ↓, hit time ↑

 

Advanced cache optimization

1. Reducing hit time (first-level cache)

1) small and simple

small

- many index, clock speed(propagation) ↓ => hit time↓

- small cache takes less time to index

simple

- high associative => => hit time↓

- direct mapped cache can overlap tag check with data transmission since no choice



2) way predition : each cache block has block predictor bits

=> How to combine fast hit time of direct-mapped with lower conflict misses of 2-way set associative cache (direct cache can overlap tag check and data transmission, high associative cache can reduce miss rate)

=> 1. multiplexer set early to select desired block; only 1 tag comparison


3) Trace cache : A trace cache stores instructions either after they have been decoded, or as they are retired. Trace path contains only instruction which are actually used. This allows the instruction fetch unit to fetch several basic blocks, without having to worry about branches in the execution flow.

2. Increasing cache bandwidth(cache structure)

1) pipelined cache : yeah "Miss under miss", "hit under multiple miss".

2) multibanked cache : can support simultaneous accesses, mapping that works well is sequential interleaving

 

3) nonblocking cache : hit under miss(until WAW or WAR hazard is occured)

3. Reducing miss penalty

1) Critical word first, Early restart : Request critical word first and as soon as the requested word of the block is arrived, send it to CPU (beneficial only when one block size is large)

2) Merging write buffer : merge because multi-word writes is more efficient

usually multiword writes are faseter than writes performed on word at a time

 

figure: four stores to sequential addresses would fill the buffer at one word per entry, even though theses four words when merged exactly fit within a single entry of the write buffer


4. Reducing miss rate

1) Compiler optimization : Reorder the procedure in memory so as to reduce conflict misses

- Merging arrays

- Loop interchange

- Loop fusion

- Blocking

5. Parellelism

1) Hardware prefetch : hardware stream buffer based on past cache access pattern

2) Compiler prefetch : special instruction (pref 0, 20($4)) is inserted into the program by compiler to bring the desired block into the L1 Dcache

 

 

 

 

 

'Learning stuff' 카테고리의 다른 글

SIMD  (0) 2013.01.29
verilog $setup, $hold, $width  (0) 2013.01.29
matlab index  (0) 2012.12.12
matlab_classdef  (0) 2012.12.12
C++ 생성자  (0) 2012.12.12

matlab index

Learning stuff 2012. 12. 12. 14:59

matlab index에 대해서....


1. 콜론의 사용법

아 겨울이라서 춥네...... 콜론콜론..... 아

훌쩍..... 내홈피는 블로근가?? 아몰라 여튼 아무도 안들어올거기 때문에 쓰레기 개드립 막 버려야지


:은 a:b 와 같이 쓰면 a~b 라는 뜻이다 그냥 간단히 예만 쓰고 패쓰

콜론만 단독으로 쓰일때는 all 이라는 의미가 있다

2. find

A값중 20보다 큰 인자의 인덱스를 찾아보자

행렬로 찾아보자

처음 2개만 찾아보자


3. linear 인덱스와 subscripts



출처 : http://iamaman.tistory.com/115, 


아 물론 접근하는건 () 써서 하는거 알고있지용


그리고 저번에 궁금했던 logical index

간단하게 예만 들어도 알듯...



말 그대로 logical 하게 판단을 하여서 그 index를 가지고 있는듯......

그러니까 logical_index를 나타내도 라고 위에 같이 치면 pointer를 가지고 있는데는 1로 나타내주고

실제로는 각각 1로 표시된 좌표를 가지고 있는듯 하다.

즉 위에서는 logical_index 가

linear index : 3, 9, 10

subscripts index : (3,1), (1,3) , (2,3)

을 가지고 있는거죠

❉ linear index는 첫번째 열부터 세더라

누가 그러던데 MATLAB 은 기본적으로 행벡터 즉 열을 기준으로 연산하는 특징이 있다고 하더라
















'Learning stuff' 카테고리의 다른 글

verilog $setup, $hold, $width  (0) 2013.01.29
Cache Optimization  (0) 2013.01.25
matlab_classdef  (0) 2012.12.12
C++ 생성자  (0) 2012.12.12
matlab 관련 강의  (3) 2012.12.12

matlab_classdef

Learning stuff 2012. 12. 12. 13:57

classdef


⦿Properties

- property definition block

- it can contain many properties

- ex)


properties

        R_sw1  = 0.003 %0.5;   % Turn-on resistance of the top MOSFET (ohm)

        R_sw2  = 0.003 %10;   % Turn-on resistance of the bottom MOSFET (ohm)

        R_sw3  = 0.003 %0.5;   % Turn-on resistance of the top MOSFET (ohm)

        R_sw4  = 0.003 %2;   % Turn-on resistance of the bottom MOSFET (ohm)

        R_l    = 0.0027 %0.083; % The ESR of the inductor L (ohm) Coiltronics CTX20-1-52M-R

        R_c    = 0.0765%0.05;  

        I_ctrl = 0.003 %2e-3;

        f_s    = 200000 %2e5;  % Switching frequency (Hz)

        Q_sw1  = 0.000000155 %5e-7; % Gate charges of the top MOSFET (F) (?)

        Q_sw2  = 0.000000155 %5e-8; % Gate charges of the bottom MOSFET (F) (?)

        Q_sw3  = 0.000000155 %5e-10; % Gate charges of the top MOSFET (F) (?)

        Q_sw4  = 0.000000155 %5e-10; % Gate charges of the bottom MOSFET (F) (?)

        L      = 0.000006; % Inductance (H)

         width; % Normalized gate width       

end


위에서 width 를 남겨놓은 이유는 정의 안하고 난중에 생성할때 줄꺼니까...


⦿methods

-method definition block

-Class definitions can contain multiple property definition blocks, each specifying different attribute settings that apply to the properties in that particular block

- 보통 Constructor 부터 시작을 한다

constructor의 예

ex)

methods

function obj = Converter(width) // 해당 classname 이 Converter이니까.... classname과 같은이름                                                        

가진  method는 constructor

            obj.R_sw1 = obj.R_sw1/width;

            obj.R_sw2 = obj.R_sw2/width;

            obj.R_sw3 = obj.R_sw3/width;

            obj.R_sw4 = obj.R_sw4/width;

            

            obj.Q_sw1 = obj.Q_sw1*width;

            obj.Q_sw2 = obj.Q_sw2*width;

            obj.Q_sw3 = obj.Q_sw3*width;

            obj.Q_sw4 = obj.Q_sw4*width;

        end %constructor Converter


그리고는 method 들을 정의 해 준다 쉽죠잉?

ex) 

function eff = eff_i_out(obj, v_in, v_out, i_out)

eff = zeros(size(v_in));


i_valid = and(v_in>0, v_out>0);

i_valid = and(i_valid, i_out>0);


v_in = v_in(i_valid);

v_out = v_out(i_valid);

i_out = i_out(i_valid);


p_conv = obj.converter(v_in,v_out,i_out);

p_out = v_out.*i_out;

eff_valid = p_out./(p_out+p_conv);


eff(i_valid) = eff_valid;

end


function p_converter = p_converter(obj, V_in_vec, V_out,vec, I_out_vec).............


여기서 신기한게 하나 있죠??


i_valid = and(v_in>0, v_out>0);

i_valid = and (i_valid, i_out>0);

요거.... ㅋㅋㅋㅋ

요거는 다음에ㅋㅋㅋ

'Learning stuff' 카테고리의 다른 글

Cache Optimization  (0) 2013.01.25
matlab index  (0) 2012.12.12
C++ 생성자  (0) 2012.12.12
matlab 관련 강의  (3) 2012.12.12
labview_2  (0) 2012.12.11

C++ 생성자

Learning stuff 2012. 12. 12. 12:05

아 그래....

갑자기 그 단어랑 개념이 생각이 안나서 막 생각하고 있는데 영현이형 덕분에 다시 생각이 나게 되었다.

원래는 Matlab 코드를 보다가 아, 이거 뭐더라..... 했는데 가만보니 내가 C++ 에서 배운 개념이었기 때문에 여기다가 정리를 하여본다.


생성자 : 생성자는 객체를 생성할때 자동으로 호출되는 함수로 클래스와 같은 이름의 형태를 띈 함수이며, 리턴형이 없다. 생성자가 필요한 이유는 말그대로 객체를 생성하고 동시에 초기화 시켜주기 위함이다.


1. 디폴트 생성자

2. 인자가 있는 생성자

3. 복사 생성자가 있는데

간단하게 코드만 보여줘도 알듯...


#include<iostream>

class Person{

public : int number;

char *name;

//////1.디폴트 생성자 //////

Person()

{

number = 0; name = "Noname";

}

//////2.디폴트 생성자 //////

Person(int number_reg, char * name_reg)

{

number = number_reg; name = name_reg;

}

//////3.복사 생성자 //////

Person(const person &p) // 자신과 동일한 타입의 객체에 대한 레퍼런스를 인자로 받는다.

{

number = p.number;

name =  p.name;

}


void print()

{

cout<< "Number : "<<number<<endl<<"Name : "<<name<< endl;

}

};




'Learning stuff' 카테고리의 다른 글

matlab index  (0) 2012.12.12
matlab_classdef  (0) 2012.12.12
matlab 관련 강의  (3) 2012.12.12
labview_2  (0) 2012.12.11
mearly machine diagram  (0) 2012.12.11

matlab 관련 강의

Learning stuff 2012. 12. 12. 10:40

이아우후후후


http://engi-agora.tistory.com/2

http://blog.naver.com/PostView.nhn?blogId=lark123&logNo=140017082054&redirect=Dlog&widgetTypeCall=true

http://pinkwink.kr/267

http://www.matlabinuse.com/index.php?mid=Mastering_MATLAB&page=1


사실 매트랩에 관한 정보들은 너무 많아서 따로 정리하지 않아도 된다능 그렇다능

내 사진이나 먹으라능



'Learning stuff' 카테고리의 다른 글

matlab_classdef  (0) 2012.12.12
C++ 생성자  (0) 2012.12.12
labview_2  (0) 2012.12.11
mearly machine diagram  (0) 2012.12.11
page mapping  (0) 2012.12.04

labview_2

Learning stuff 2012. 12. 11. 22:49

labview에 관한것이다

근데 누구땜에 파토났지.... ㅡㅡ 아놔

그냥 파일만 올려야지

20121112_Youngil.pdf






'Learning stuff' 카테고리의 다른 글

C++ 생성자  (0) 2012.12.12
matlab 관련 강의  (3) 2012.12.12
mearly machine diagram  (0) 2012.12.11
page mapping  (0) 2012.12.04
mosfet 기호  (0) 2012.09.11

mearly machine diagram

Learning stuff 2012. 12. 11. 22:43

-moore


DFAexample.svg


-mealy(Each edge is labeled with "j / k" where j is the input and k is the output.)


State diagram of a simple Mealy machine



Mealy machine diagram 은 다음과 같이 이해하면 된다.


각 원 : current state

선 : next state

선 위의 값들 : input에 따른 output들

예를 들어 current state 가 S1 이라고 하자

이때 내가 다음 클럭까지 외부에서 input을 마구 바꾸었다고 한다면 S1원에서 나아간 선이나(빨간선) 그 위에 값이 막 변하고 있는 그림을 상상하면 된다. 사실 선 위의 값들은 Input Output의 종류가 단순하지 않은 이상 표가 동동 떠있다고 생각하는것이 이상적이다.

이렇게 말이다









'Learning stuff' 카테고리의 다른 글

matlab 관련 강의  (3) 2012.12.12
labview_2  (0) 2012.12.11
page mapping  (0) 2012.12.04
mosfet 기호  (0) 2012.09.11
엑셀로 피팅  (0) 2012.08.08

page mapping

Learning stuff 2012. 12. 4. 13:57

1. Page Mapping

  Page-Level Mapping 은 가장 기초적인 FTL 중 하나이다. Page-Level Mapping[1] 기법은 page의 모든 사상 정보를 사상 테이블에 저장하여 관리한다. 따라서 logical page를 어느 physical page에나 사상 할 수 있어, Block mapping에 비해 더 유연하게 mapping 정보를 관리할 수 있고 random small write에 대한 성능이 우수하다. 하지만 사상 테이블의 크기가 커져 이를 저장하기 위해서는 많은 메모리를 필요로 하는 단점이 있다. 그림 1은 Page-level mapping에서 Mapping table의 정보를 관리하는 모습을 보여준다. Physical Block내에 존재하는 특정 페이지에 대해 페이지 업데이트 요청이 들어왔을 때 해당 페이지를 순서에 상관없이 비어있는 다른 공간에 저장하고 저장된 위치의 physical address를 Mapping table에 저장함으로써 Logical page address와 Physical page address를 re-mapping한다. 이후 업데이트전의 페이지 정보는 불필요하게 된다(invalid).


그림 1. Page address re-mapping for page



2. Hybrid Mapping

  Hybrid Mapping은 Page-Level Mapping 과 Block-Level Mapping의 장점만을 모아 필요에 따라 페이지 단위로 또는 블럭 단위로 데이터 처리를 한다. 그 구분은 일반적으로 요청된 데이터가 Sequential 로 나열된 것인지 아니면 Random 으로 나열된 데이터를 처리 하는 것인지에 따라 나뉜다. 다음 절에서는 각 FTL의 구동 방식에 대해 간단히 소개한다.


 2.1. FAST

  BAST에서는 페이지 업데이트가 발생하면 로그블록을 할당하여 out-of-place로 write 명령을 수행하는데, 로그블록과 데이터 블록은 1:1로 대응 되기 때문에 잦은 random write 발생시 로그 블록의 활용도가 떨어지고 블록 스레싱 현상이 발생할 수 있다.
그림2에서 보이듯이 FAST 로그블록과 데이터블록의 연관관계를 1:N으로 확장하여, 로그 블록에 더 이상 빈 공간이 없을 때 garbage collection을 실행하도록 하여 블록 스레싱 문제를 효율적으로 해결하고 Full merge의 비율을 줄일 수 있다. 또한 하나의 로그블록을 따로 관리하는데 이는 sequential write를 처리하기 위한 sequential 로그 블록이다. 하지만 FAST는 multiple task에 의한 multiple sequential write stream과 random write와 sequential write 명령이 혼합되어 들어오는 경우에는 효율적으로 처리하지 못한다.  
 

                               그림 2. Full associativity between logical sectos and log blocks


2.2. LAST

   그림 3에서 보이듯이 LAST도 FAST와 같이 로그블록을 sequential 로그블록과 random 로그블록으로 나눈다. Threshold 값을 기준으로 데이터의 크기에 따라 sequential write와 random write를 구분하여 두 명령이 혼합되어 들어오는 경우에도 효율적으로 처리할 수 있다. Random 로그 블록은 hot, cold 파티션으로 나누는데 해당페이지가 처음 random 로그 블록에 기록되는 경우 cold 파티션에 기록한 뒤, index k value을 두어 k value이내에 해당 페이지가 업데이트 되는 경우 hot 파티션에 기록한다. 자주 업데이트 되는 페이지를 hot 파티션에 모아둠으로써 merge operation의 횟수를 줄여 garbage collection의 효율을 얻을 수 있다. 또한 hot 파티션내의 특정 페이지들이 빈번하게 업데이트되어 하나의 블록이 모두 invalid 해지면(dead block) 한번의 erase operation만으로 로그 블록을 비울 수 있다.
 

그림 3 The overall architecture of the LAST scheme



출처 : http://matia.tistory.com/49

'Learning stuff' 카테고리의 다른 글

labview_2  (0) 2012.12.11
mearly machine diagram  (0) 2012.12.11
mosfet 기호  (0) 2012.09.11
엑셀로 피팅  (0) 2012.08.08
SBD  (0) 2012.08.03