본문 바로가기

728x90

ComputerScience/Multi-core Computing

(11)
멀티코어컴퓨팅 - 11. CUDA programming GPU 위에서 돌아가는 병렬 처리 프로그램을 만들어보자. CUDA는 오직 NVDIA GPU에서만 돌아간다. *CUDA code를 google colab에서 실행하는 방법 : https://www.geeksforgeeks.org/how-to-run-cuda-c-c-on-jupyter-notebook-in-google-colaboratory/ How To Run CUDA C/C++ on Jupyter notebook in Google Colaboratory - GeeksforGeeks A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programmin..
멀티코어컴퓨팅 - 10. OpenMP OpenMP multi-processing을 위한 framework이다. c/c++을 지원한다. pthread에서 사용했던 thread 라이브러리보다는 더 사용이 쉬운 high level api이다. openMP는 thread를 생성해서 작업을 할당한다. 작업들은 반드시 독립적인 작업이어야 한다. 병렬 처리 할 부분을 compiler directives로 나타낸다. master thread가 소스를 실행하다 parallel region을 마주치면 thread들이 동시에 그 구역의 작업을 처리한다. region 끝에서 쓰레드들이 대기하게 되고 모든 쓰레드가 도착하면 master thread는 다음 코드를 실행한다. #pragma = open MP directives라고 한다. 컴파일러에게 아래 블럭이 pa..
멀티코어컴퓨팅 - 9. C++ Threads 기본예제 #include #include #include #include void f1(int n) { for (int i = 0; i < 5; ++i) { std::cout
멀티코어컴퓨팅 - 8. Pthread Programming process vs thread 너무 중요해서 한번 더 설명하겠다. process는 독립된 메모리 공간을 갖기 때문에 각각 1000번지는 서로 다른 실제 메모리 주소를 갖는다. 반면 thread t1, t2 에서 1000번지라함은 서로 동일한 실제 메모리 공간을 나타낸다. 쓰레드는 프로세스보다 더 lightweight하다. 따라서 생성뿐만 아니라 쓰레드간 communication이 프로세스간 communication보다 부하가 적다. Pthread pthread는 unix 계열 환경에서 C언어로 사용할 수 있는 쓰레드 관련 함수들의 모음(라이브러리)이다. 일반적으로 리눅스같은 유닉스 계열 운영체제에서 많이 이용된다. 크게 세 카테고리로 함수를 분류할 수 있다. 1. Thread Management - f..
멀티코어컴퓨팅 - 7. Divide-and-Conquer for Parallelization Divide-and-Conquer for Parallelization 총 네개의 쓰레드로 각각 구간의 합을 구해서 마지막에 메인 쓰레드가 결과들을 취합해 ans를 도출했다고하자. 만약 쓰레드가 1000개라면 메인쓰레드는 결과 취합을 위해 1000번의 덧셈을 수행해야 한다. 그리고 구간을 공평하게 나누는 일도 사실 모든 경우에 쉽지 않다. 설령 구간을 공평하게 나누었더라도 좀 더 쉬운 부분을 할당받은 쓰레드는 쉬는 경우가 생길 수 있다. 그래서 divide conquer 알고리즘을 적용해서 더 현실적이고 효율적인 parallel summation을 수행해보자. 메인 쓰레드가 구간을 반으로 쪼갠다 -> 쓰레드 두 개 t1, t2 생성 -> t1, t2가 가져오는 결과를 합산 t1이 구간을 반으로 쪼갠다 ->..
멀티코어컴퓨팅 - 6. Concurrent Programming concurrency parallel, 병렬처리란 하나의 작업을 여러 쓰레드가 작업을 나누어 동시에 일을 처리하는 것을 말한다. concurreny, 동시성은 동시에 여러가지 작업이 이루어지는 것 처럼 보이도록 하는 것을 말한다. 여러 core에서 직접 동시에 여러가지 다른 작업이 수행될 수 있고 혹은 싱글 core라도 여러 프로세스들을 빠른 속도로 interleaving 하면서 처리하여 concurrency를 구현할 수 있다. 좌측 그림은 세개의 core가 동시에 A,B,C 작업을 처리하고 있다. 우측 그림에서는 싱글 core가 한번에 A,B,C를 빠른 속도로 돌아가면서 처리하여(time 축을 보면 한번에 한 녀석의 일 만 함) 동시에 A,B,C를 실행하는 것처럼 보이게 한다. 이런 개념이 concur..
멀티코어컴퓨팅 - 5. Java Concurrency Utilities Java Concurrency Utilities concurrent application을 만드는데 도움이 되는 java 패키지들이 잘 정리되어 있다. Java BlockingQueue : 이 인터페이스를 상속해서 ArrayblockingQueue, LinkedBlockingQueue등이 만들어진다. Java ArrayBlockingQueue : 큐가 꽉 찼거나 비어있으면 en/dequeue 하려는 쓰레드들을 block하는 등의 기능이 구현되어 있다. (array기반으로 된 큐이다.), 동시에 접근하는 operation에 대해서 concurrency를 보장한다. add()대신 put()을 사용하면 큐가 꽉 차있을때 enqueue하려는 쓰레드는 기다린다. take()를 사용하면 큐가 비어있을 때 deque..
멀티코어컴퓨팅 - 4. Producer Consumer Problem producer consumer problem producer : 데이터를 생성하고 버퍼에 집어넣는다. 동시에 여러 생산자가 데이터를 생산하고 버퍼에 푸쉬할 수 있다. consumer : 버퍼에서 데이터를 꺼내고 소비한다. 한번에 한명씩 버퍼에서 데이터를 꺼내야 한다. 고정된 크기의 버퍼가 있다. queue로 구현되어 있다. 버퍼가 꽉차면 producer는 대기하고 버퍼가 비어있으면 consumer는 대기한다. 이런식으로 버퍼에 enqueue, dequeue에 synchronized object를 사용해서 상호배제를 구현하면 된다. 그리고 각 쓰레드는 while문을 돌면서 계속 enqueue, dequeue가 가능한지 물어보면된다. 하지만 이 방식은 계속해서 쓰레드들이 cpu 자원을 소모하기 때문에 그리..

728x90