UTM을 사용하여 공부하였다.
이것은 스레드를 사용하지 않은, squre root 계산이다. 이때는 연산을 한 번에 한다.
이것은 2개의 스레드에 대해 루프 작업이 분할되지 않은 for문 실행한 것이다.
이때, for 루프의 0 ~ 99999999까지의 작업을 2개의 스레드가 중복하여 수행하기 때문에, 2개의 스레드가 같은 메모리에 대해 읽기와 쓰기를 경쟁하게 되어 더 많은 시간이 소요되고, 2개의 스레드에 의해 같은 메모리에 있는 데이터에 대해 2번 루트값(루트의 루트 값)을 계산하여 잘못된 값 초래될 수 있다.
이때, 0번 스레드는 for(i=0; i<50000000; i++)를 수행하고, 1번 스레드는 for(i=50000000; i<100000000; i++) 수행한다.
밑줄 친 것은, 0번 스레드와 1번 스레드가 공유하는 코드이다.
#pragma omp for 지시어로, 기본적으로 각 스레드 작업량 = 총 루프 카운트 / 스레드 수 이다.
이제 속도를 비교해보겠다.
0.449938s이 나온 것을 확인할 수 있다.
순차프로그램 보다 시간이 더 걸리는 것을 확인 할 수 있다.
0.097797이 나온 것으로 보아, 루프 작업이 분할된 병렬 프로그램 > 순차 프로그램 > 루프 작업이 분할되지 않은 병렬 프로그램 순인 것을 확인할 수 있다.
스레드 수 | |
1 | 0.334356 |
2 | 0.164028 |
3 | 0.14534 |
4 | 0.138309 |
5 | 0.126713 |
6 | 0.124882 |
7 | 0.120399 |
8 | 0.117771 |
스레드의 수가 늘어날 때마다, 시간이 줄어드는 것을 확인할 수 있고, 어느 시점부터는 시간의 차이가 크게 줄지 않는 것을 확인할 수 있다.
운영체제- CPU 스케줄링 및 다중 큐 (0) | 2024.04.16 |
---|---|
운영체제 - 컴퓨터 구조 (0) | 2024.03.31 |
운영체제 - 커널 (1) | 2024.03.18 |
인공지능 - 인공지능과 탐색 (0) | 2024.03.14 |
병렬프로그래밍(1) (0) | 2024.03.11 |