패스트캠퍼스

[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 19회차 미션

돌맹이시터 2020. 11. 6. 13:01

 

 

 

환급미션 19일째...

 

 

 

컴퓨터 구조 - 파이프라인과 벡터처리 - Pipeline 구조 - 데이터&구조 -1

컴퓨터 구조 - 파이프라인과 벡터처리 - Pipeline 구조 - 데이터&구조 -2

 

 

 

 

이번 시간부터 조금은 본격적으로 파이프라인에 대한 강의가 시작된다.

 

파이프라인의 구조를 구현하는 과정과,

파이프라인에서의 데이터 처리 과정을 살펴보도록 한다.

 

 

결국 목표는 하나의 프로세스를 여러 개의 서브 프로세스로 나누어 서로 다른 기능을 동시에 처리하기 위함인데,

각 segment에서 수행된 결과는 다음 segment로 넘어가게 되어, 

데이터가 마지막 segment를 통과하면 최종적인 연산 결과를 얻게 된다. 

각 세그먼트마다 레지스터가 필요하고, 레지스터마다 clock pulse로 signal을 주게 된다.

 

 

 

위의 박스 안에 있는 것처럼

실질적으로 flow chart를 작성하기 전에 간단하게 pseudo-code로 구현해본다.

AxB+C 연산이 이루어지도록 하기 위해 5개의 레지스터, 조합논리회로가 필요하고

이를 어떻게, 몇 개의 segment로 나누어서 처리할 것인지를 구상해보는 과정이다.

위의 박스 안에 한 사이클의 정보가 들어있으며 3개의 segment로 구성된다.

 

위의 내용을 실제로 구현하게 되면 다음과 같다.

 

 

 

 

처음에 시차는 있지만 동시에 3가지 작업이 진행되게 된다.

세 번의 clock pulse 이후부터 R5의 첫 번째 결과가 얻어지며, 파이프 라인상에서 데이터 이동이 시작된다.

 

 

조금 더 직관적으로 도식화된 그림은 다음과 같다.

 

 

 

 

 

 

 

 

- 파이프라인의 일반적 고찰 

 

 

앞서 살펴보았던 것처럼 파이프라인을 구현하게 되면 

동시에 여러 가지의 작업을 수행함으로서 효율적으로 작업할 수 있게 되지만,

늘 그런 것은 아니다.

부연산 (sub process) 간의 복잡도가 불균형한 경우에는 오히려 비효율적인 작업이 될 수 있고,

매번 다른 데이터 집합을 동일한 task에 적용시켜서, 여러 번 반복적으로 작업할 때 더욱 효과적일 수 있다.

따라서 최근 각광받는 인공지능, 딥러닝 등에 파이프라인 기술을 효과적으로 적용할 수 있다.

 

 

이전 강의에서도 다루었던 내용이지만

파이프라인의 이론적 최대속도 증가율은 세그먼트 수와 같다고 했던 내용을 다시 한 번 다루었다.

 

 

위와 같은 경우

( 4개의 segment, 100개의 task, 각 segment에서 부연산을 수행하는데 소요되는 시간 20ns )

 

 

non-pipeline 구조와 pipeline 구조에서의 소요시간을 이론적으로 계산했을 때,

pipeline을 구현했을 때의 속도 증가율이 segment의 수에 근접한 것을 확인할 수 있으며

그만큼 pipeline구조를 활용하는 것이 효율적이라는 것을 증명할 수 있다.

 

 

물론 이론적인 수율이고, 실제로는 차이가 있다고 한다.

파이프라인을 구현하는 데 걸리는 비용이나 시간,

구현했을 때 오르게 되는 작업효율 등을 고려해서 구현하는 것이 좋을 것이다.

 

 

 

 

 

 

 

소프트웨어 베이직 - c언어의 기초 - 14. 동적 메모리 할당

 

 

- 동적 메모리 할당

 

c언어에서 배열의 경우, 사전에 적절한 크기만큼 메모리를 할당해야 함

원하는 메모리를 할당해서 사용하고자 할 경우 동적 메모리 할당을 사용한다. ( 동적 : '프로그램 실행 도중에' 라는 의미)

 

 

*malloc (할당할 바이트 크기);

malloc() 함수 이용해 메모리 공간을 원하는 만큼 확보

메모리 할당에 성공 시 주소값 반환, 그렇지 않으면 NULL 반환

<stdlib.h>에 정의되어 있다.

프로그램을 실행할 때마다 할당되는 주소값은 달라질 수 있다.

free() 함수로 메모리 해제를 해야 한다.

 

 

위에서 보는 것과 같이

동적 할당 변수는 컴퓨터의 메모리 중 '힙 영역'에 저장된다.

 

'스택 영역'에 선언된 변수는 따로 메모리 해제를 하지 않아도 블록이 종료될 때 알아서 변수가 해제되는데,

동적으로 할당된 변수는 반드시 free() 함수로 메모리 해제를 해야 한다.

(메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 계속 추가되어 오류가 발생하게 된다.)

memory leak이 발생하지 않도록 주의할 것

 

---------

#include <stdio.h>

#incllude <stdlib.h>

 

int main()

{

 int *a = malloc(sizeof(int));

 printf("%d\n", a);

 free(a);

 a = malloc(sizeof(int));

 printf("%d\n", a);

 free(a);

 return 0;

}

-----------

 

위의 코드는

malloc 함수를 이용해 포인터 변수 a에

int 자료형의 크기만큼 (4byte) 메모리 공간을 할당하고, free 함수로 메모리 해제를 한 상황이다.

두 번에 걸쳐 메모리 공간에 할당을 하였는데,

만약 free 함수를 사용하지 않았다면 출력값이 달라질 수 있지마

위처럼 free 함수를 중간에 사용했을 경우 출력값은 동일하게 나온다.

강의에서 사용한 예제는 printf 함수에 %d를 사용했지만, 최근 ide 에서는 %d를 사용하면 에러가 발생하고 %p로 작성해줘야 하는 듯 하다.

 

 

 

 

 

- 동적으로 문자열 처리하기

 

 

memset (포인터, 값, 크기);

일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해 memset() 함수를 사용

한 바이트씩 값을 저장, 문자열 배열의 처리 방식과 유사

<string.h>에 정의되어 있다.

 

 

 

- 동적 메모리 할당을 이용한 2차원 배열 작성 예제

 

 

 

 

 

올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE