問題一覧
1
람다 함수의 특징을 말하시오.
프로그래밍이 편리하다. 디버깅이 어렵다.
2
고성능 프로그램을 만들기 위한 조건은?
블럭킹으로 구현하면 안된다. 운영체제 호출하면 안된다.
3
coroutine의 특징을 설명하시오.
컨텍스트 스위치 오버헤드와 스레드 생성 오버헤드가 없다. 생성한 코어에서만 사용이 가능해서 멀티 코어에서 사용하지 못한다.
4
OpenMP에는 스레드라는 개념이 없다. ( O / X )
O
5
OpenMP 사용 시 주의점은?
컴파일러 레벨에서 구현되어야 한다.
6
OpenMP는 표준이 아니다. ( O / X )
X
7
OpenMP는 내부적으로 ( A ), ( B )를 사용한다.
A: Multi-Thread B: 공유메모리
8
OpenMP는 ( A )와 ( B ), ( C )로 구성되어 있다.
A: 컴파일러 디렉티브, B: 함수, C: 변수
9
OpenMp의 특징은?
분산 메모리에서는 사용할 수 없다. 최상의 공유메모리 사용 패턴을 보장하지 않는다. Data Dependency, Data Race, Deadlock 검사는 프로그래머가 해야 한다. 어느 부분을 어떻게 병렬화 할지를 프로그래머가 지정해 주어야 한다.
10
OpenMP는 ( ) 모델을 사용한다.
Fork-join
11
OpenMP는 Nesting이 불가능하다. ( O / X )
X
12
OpenMP는 멀티스레드 프로그래밍이다. ( O / X )
X
13
OpenMP에서 'private(var1, var2)'는 call by value or reference?
call by value
14
OpenMP에서 'shared(var1, var2)'는 call by value or reference?
call by reference
15
OpenMP의 for는 병렬로 처리해준다. ( O / X )
O
16
OpenMP의 for는 자동으로 알아서 병렬로 잘 돌아가도록 해준다. ( O / X )
X
17
OpenMP의 for 병렬화에서 ( )를 검사하지 않는다.
data dependency
18
OpenMP는 로드 밸런싱을 알아서 해준다. ( O / X )
O
19
c++11의 thread와 OpenMP를 혼용해서 써도 된다. ( O / X )
X
20
Intel TBB의 특징을 설명하시오.
쓰레드 사용에 편리한 여러 API를 가진다. Task 관리 기능을 포함한다. Intel CPU에서 동작한다.
21
TBB의 기능들에는 어떤 것들이 있나요?
Loop Parallelizer: loop를 병렬로 사용하고 싶을 때 사용 Containers: vector, set, queue에서 사용하는 contains를 최적화해서 non-blocking으로 구현해 놨다. Mutual Exlusion: 여기서도 뮤텍스를 제공하지만 기존 C++11에 있는 것과 비슷하다. 메모리 할당자: 멀티스레드 상에서의 효율적인 메모리 할당자 Task 스케쥴링
22
Intel TBB에 있는 Loop Parallellizer를 사용하려면 TBB가 멀티스레드를 적용할 수 있는 형태로 변형해주어야 한다. ( O / X )
O
23
빈칸에 알맞은 코드를 넣으세요.
parallel_for(first, last, step, f);
24
Intel TBB에서의 concurrent_unordered_map을 사용할 때 주의점은?
모든 메소드가 다 안전한 것이 아니다. insert(), find(), count(), size(), at()만 안전하다. erase()가 안전하지 않아서 지울 수가 없다.
25
데이터를 넣다 빼는 용도로 TBB의 concurrent_unordered_map은 적합하다. ( O / X )
X
26
빈칸에 알맞은 코드를 넣으세요.
size_t(0), N, [&table](int i)
27
멀티스레드에서 데이터를 넣는 것 뿐만 아니라 빼는 것도 해야 한다면 어떤 자료구조를 사용하는 것이 좋은가?
concurrent_hash_map
28
TBB의 concurrent_hash_map에서 accessor라는 스마트 포인터를 사용하여 자료에 접근하는 이유는 무엇인가?
동시성 문제가 있기 때문이다.
29
TBB의 concurrent_vector의 주의점은?
clear() 메소드는 병렬수행이 불가능하니 꼭 다른 메소드와 동시에 호출되지 않도록 해야 한다. 원소들이 연속된 주소에 있지 않으므로 일반적인 pointer 연산은 불가능하다. 크기 감소가 안된다. 원소를 읽을 때 원소가 생성 중일 수 있으므로 읽기 전에 생성완료를 확인하도록 프로그래밍해야 한다.
30
TBB의 concurrent_queue에서 pop()대신 try_pop()을 제공하는 이유는 무엇인가?
empty() 호출이 pop()의 성공을 보장하지 않기 때문이다. empty()를 할때는 empty가 아니었지만 pop()할 때는 empty일 수 있기 때문이다.
31
TBB의 scoped_lock은 c++11의 어떤 것과 같은가?
lock_guard
32
RWlocking의 아이디어는?
read_only인 메소드는 동시 실행해도 아무 문제가 없기 때문에 read_lock과 write_lock을 따로 두어 read_lock끼리는 상호배제없이 사용하도록 하는 것이다.
33
TBB의 scoped_lock은 ( )으로 구현되어 있지 않아서 다른 자료형끼리 섞어 쓰는 것이 안된다.
템플릿
34
TBB의 scalable(Mutual Exclusion)의 특징을 설명하시오.
busy waiting을 없애 CPU 낭비를 없앤다. 근데 busy waiting 없애려고 운영체제 호출해서 오버헤드가 크다. critical section이 길어서 오래 걸리는 구간이라면 효율이 올라가겠지만 그게 아니면 낭비이다.
35
TBB의 Fair(Mutual Exclusion)의 특징을 설명하시오.
critical section에 도착한 순서로 lock을 얻는다. 큐 형태로 호출한다.
36
TBB에서 Long wait일 경우 Fair에서는 ( )로 해주어야 한다.
block
37
TBB의 speculative_spin_mutex(Mutual Exclusion)의 특징을 설명하시오.
상호배제를 해제하여 critical section을 동시에 수행하게 한다. 동시에 실행시켜서 문제가 없으면 그냥 실행하고 충돌해서 문제가 생기면 둘 중 하나를 롤백 시키는 형태이다.
38
RWlock을 사용하면 무조건 빨라진다. ( O / X )
X
39
TBB의 Task 스케쥴링의 주의점은?
하나의 task 관리 객체에 많은 task를 넣어 주는 것은 비효율적이다. task 관리 객체를 로컬 객체로 생성하고 소수의 task를 넣는 방식으로 구현하는 것을 권장한다.
40
CUDA는 gpu의 멀티 코어를 사용하는 것이다. ( O / X )
O
41
( 가 )가 나오면서 gpu에서 다양한 연산을 할 수 있게 되었다.
셰이더 언어
42
directX, openGL을 모르면 CUDA를 사용할 수 없다. ( O / X )
X
43
CUDA를 사용하면 GPU에서 대규모 병렬 처리가 가능하다. ( O / X )
O
44
GPGPU의 약자는?
General Purpose GPU
45
CUDA의 단점은 무엇인가?
NVIDIA 하드웨어만 지원한다.
46
CUDA는 C프로그래밍 하듯이 GPU 프로그래밍을 할 수 있다. ( O / X )
O
47
CUDA를 사용하기 위해서 컴파일러 도움은 필요 없다. ( O / X )
X
48
NVIDIA가 아닌 하드웨어에서 CUDA와 같은 gpu를 이용하여 병렬 프로그램을 만들고 싶으면 어떻게 해야 하는가?
OpenCL을 사용하면 된다.
49
GPGPU의 단점은?
I/O 작업이 느리다. 메모리가 적다. 직렬계산이 느리다. gpu로 계산하려면 데이터 보내줘야 하는데 보내는 부분이 병목현상이 발생한다.
50
CUDA를 게임에서 잘 안쓰는 이유는?
게임은 i/o 작업이 많고 실시간으로 처리해줘야 하는게 많은데 gpu는 그게 느리다.
51
Big-Little(P-E)는 게임에서 사용하면 안좋은 이유는?
멀티스레드로 돌리면 P, E 코어 둘 다 같이 돌아가는데 P코어가 먼저 일을 끝내고 E코어를 기다리는 현상이 발생한다. 게임이랑 상극이다.
52
블럭킹 프로그램의 장단점을 설명하시오.
장점 - 직관적이다. - 의도대로 잘 돌아간다. - 프로그래밍이 쉽다. 단점 - 병렬성이 없어서 성능개선의 여지가 없다. - 우선순위 역전: 높은 우선순위의 스레드가 잠금이 없어서 실행되지 못한다. - 호위현상: 잠금을 잡은 스레드가 실행을 멈춘 동안에는 모든 잠금을 원하는 스레드가 대기해야 한다. - 교착상태: 일명 데드락
53
Lock-free 알고리즘의 한계는?
확장성이 떨어진다. 복수개의 메소드호출의 atomic화는 어렵다. 알고리즘의 정확성을 증명하는 것이 어렵다.
54
트랜잭션은 교착상태를 발생시키지 않는다. ( O / X )
O
55
Child 트랜잭션의 Abort가 Parent를 Abort를 시킨다. ( O / X )
X
56
트랜잭션은 소프트웨어와 하드웨어 모두 구현 가능하다. ( O / X )
O
57
트랜잭션의 장점을 설명하시오.
병렬성, 확장성, 넌블럭킹
58
소프트웨어로 트랜잭션를 만들 때 주의점은?
Zombie 트랜잭션이 되지 않도록 주의해야 한다. - 동기화 충돌 이후에도 트랜잭션이 계속 실행될 수 있다. 성능이 좋지 않다. - 모든 read/write를 api를 통해서 해야 하므로 성능이 좋지 않다.
59
Zombie 트랜잭션이 발생하지 않도록 하기 위해서는 프로그래머의 주의가 필요하다. ( O / X )
O
60
하드웨어로 트랜잭션을 어떻게 구현했는가?
캐시 태그에 트랜잭션비트를 추가하였다. 트랜잭션이 끝나고 캐시가 충돌했는지 확인하다. 충돌이 없으면 그냥 캐시에 있는 값 쓰고 아니면 캐시에 있는 값 invalid에 넣는다.
61
Haswell의 XTM 트랜잭션에서 복수개의 메모리에 대한 Transaction을 L3 캐시의 용량 한도까지 허용한다. ( O / X )
X. L1까지 허용
62
트랜잭션을 게으른 동기화를 수정해서 만들면 좋은 이유는 무엇인가?
critical section이 최대한 작아야 성능이 좋기 때문이다.
63
여기서 왜 goto를 쓰지 않고 _xabort(0)을 쓴 이유는?
goto를 써서 transaction 구간이 커지면 성능에 안 좋은 영향을 미친다.
64
트랜잭션 메모리의 장점은?
생산성, 확장성, 정확성, 성능
65
STM의 단점과 HTM의 단점과 트랜잭션 메모리의 한계를 말하시오.
STM 단점 성능: 오버헤드가 커서 코어가 매우 많지 않으면 오히려 성능 저하 HTM 단점 범용성: 일부 CPU에서만 지원 제한성: hw 용량의 한계로 알고리즘이 제한된다. High Contention 상황에서 lock-free 보다 성능 저하가 있다. 한계: 코어의 개수가 많아질 경우 성능향상의 한계가 찾아온다.
66
트랜잭션은 뮤텍스와 함께 돌리면 안된다. ( O / X )
X
67
트랜잭션 안에서 메모리를 많이 읽고 쓰면 충돌하지 않더라도 실패할 수 있다. ( O / X )
O
68
Haswell HTM의 한계는?
모든 알고리즘에 적용이 불가능하다. 오버헤드가 크다.
69
불변 변수는 절대 data race를 일으키지 않는다. ( O / X )
O
70
Go언어에서 공유 메모리 대신 사용하는 것은?
Channel
71
Go는 내부적으로 IOCP로 돌아간다. ( O / X )
O
72
하스켈에는 멀티스레드 명령어들이 많다. ( O / X )
X. 그런 명령어는 없다. 싱글 스레드 알고리즘인데 멀티 스레드로 돌아간다.
73
하스켈로 프로그래밍 할 때 주의점은?
태스크 자체가 너무 작아지면 문제가 있다. 그럴경우는 싱글로 돌려주어야 한다.
74
Erlang을 메인 서버에서 잘 사용하지 않는 이유는?
구현 난이도가 있기 때문이다.
75
Erlang에서 사용하는 process는 thread에 가까운 것이다. ( O / X )
X. coroutine에 가까운 것이다.
76
함수형 언어의 문제는?
생산성, 성능, I/O 문제
77
리눅스와 visual studio와 호환성에서 가장 주의해야 할 것은?
visual studio의 long은 32bit이고, 리눅스의 long은 64bit이다.